Files
AnyPS5/core/libs/tests/GuestMbus.cpp
T

64 lines
2.5 KiB
C++

#include "prx/libc/include/general/VabiMacros.hpp"
#include <array>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <stdexcept>
struct DeviceServiceThreadParam;
struct DeviceServiceInitParam {
std::uint32_t size;
std::uint32_t reserved;
const DeviceServiceThreadParam* threadParam;
};
struct DeviceServiceUsageFilter;
extern "C" {
std::int32_t APS5_VABI sceDeviceServiceInitialize(std::int32_t mode, const DeviceServiceInitParam* param);
std::int32_t APS5_VABI sceDeviceServiceTerminate();
std::int32_t APS5_VABI sceDeviceServiceGetEventState(std::int32_t clear);
std::int32_t APS5_VABI sceDeviceServiceQueryDeviceInfo_(std::int32_t deviceClass, const DeviceServiceUsageFilter* filter, std::int32_t arg2, void* infos, std::int32_t maxInfos, std::int32_t* count, std::int32_t* reserved, std::uint32_t infoSize);
std::int32_t APS5_VABI sceDeviceServiceGetGeneration();
}
namespace {
void Require(bool condition, const char* message) {
if (!condition) {
std::fprintf(stderr, "DeviceService: %s\n", message);
std::abort();
}
}
}
int main() {
DeviceServiceInitParam param{};
constexpr auto invalidArgument = static_cast<std::int32_t>(0x809B0080u);
Require(sceDeviceServiceInitialize(3, &param) == invalidArgument, "invalid parameter size accepted");
param.size = 16;
param.reserved = 1;
Require(sceDeviceServiceInitialize(3, &param) == invalidArgument, "reserved field accepted");
param.reserved = 0;
Require(sceDeviceServiceInitialize(3, &param) == 0, "default parameter initialization failed");
Require(sceDeviceServiceInitialize(3, 0) == 0, "initialization failed");
Require(sceDeviceServiceGetGeneration() == 0, "the device set started at another generation");
Require(sceDeviceServiceGetEventState(1) == 0, "a device event was reported");
std::array<std::uint8_t, 0x70> info{};
std::int32_t count = 7;
std::int32_t reserved = 0;
Require(sceDeviceServiceQueryDeviceInfo_(0x7001, 0, 0, info.data(), 1, &count, &reserved, info.size()) == 0 && count == 0, "a device was listed");
bool threw = false;
try {
sceDeviceServiceQueryDeviceInfo_(0x7001, 0, 0, info.data(), 1, nullptr, &reserved, info.size());
} catch (const std::invalid_argument&) {
threw = true;
}
Require(threw, "a null count was accepted");
Require(sceDeviceServiceGetGeneration() == 0, "the generation advanced without a device change");
Require(sceDeviceServiceTerminate() == 0, "termination failed");
std::puts("DeviceService tests passed");
return 0;
}