AnyPS5/core/libs/tests/GuestNpSessionSignaling.cpp

62 lines
3.0 KiB
C++

#include "prx/libc/include/general/VabiMacros.hpp"
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
extern "C" {
int APS5_VABI sceNpSessionSignalingInitialize(void* param);
int APS5_VABI sceNpSessionSignalingCreateContext2(const void* param, std::uint32_t* contextId);
std::int32_t APS5_VABI sceNpSessionSignalingGetLocalNetInfo(std::int32_t contextId, void* info);
int APS5_VABI sceNpSessionSignalingRequestPrepare(std::uint32_t contextId, std::uint32_t* requestId);
std::int32_t APS5_VABI sceNpSessionSignalingGetConnectionStatus(std::int32_t contextId, std::int32_t connectionId, std::int32_t* status, void* peerAddress, std::uint16_t* peerPort);
int APS5_VABI sceNpSessionSignalingTerminate(void);
}
namespace {
constexpr int InvalidArgument = static_cast<int>(0x80553303u);
constexpr int Unavailable = static_cast<int>(0x80552D06u);
constexpr int ConnectionNotFound = static_cast<int>(0x8055330Cu);
void Require(bool condition, const char* message) {
if (!condition) {
std::fprintf(stderr, "NpSessionSignaling: %s\n", message);
std::abort();
}
}
}
int main() {
unsigned char initializeParam[32] = {};
Require(sceNpSessionSignalingInitialize(initializeParam) == 0, "initialize failed");
unsigned char contextParam[64] = {};
std::uint32_t contextId = 0;
Require(sceNpSessionSignalingCreateContext2(contextParam, &contextId) == 0, "context creation failed");
std::uint32_t requestId = 0xa5a5a5a5u;
Require(sceNpSessionSignalingRequestPrepare(contextId, nullptr) == InvalidArgument, "null request id");
Require(sceNpSessionSignalingRequestPrepare(contextId, &requestId) == Unavailable, "prepare without network");
Require(requestId == 0xa5a5a5a5u, "failed prepare wrote a request id");
const auto netContextId = static_cast<std::int32_t>(contextId);
unsigned char info[16];
std::memset(info, 0xa5, sizeof(info));
unsigned char untouched[sizeof(info)];
std::memcpy(untouched, info, sizeof(info));
Require(sceNpSessionSignalingGetLocalNetInfo(netContextId, nullptr) == InvalidArgument, "null info");
Require(sceNpSessionSignalingGetLocalNetInfo(netContextId, info) == Unavailable, "local net info without network");
Require(std::memcmp(info, untouched, sizeof(info)) == 0, "failed query modified the info");
std::int32_t status = 0x5a5a5a5a;
std::uint32_t peerAddress = 0xa5a5a5a5u;
std::uint16_t peerPort = 0xa5a5;
Require(sceNpSessionSignalingGetConnectionStatus(netContextId, 1, nullptr, &peerAddress, &peerPort) == InvalidArgument, "null connection status");
Require(sceNpSessionSignalingGetConnectionStatus(netContextId, 1, &status, &peerAddress, &peerPort) == ConnectionNotFound, "connection without network");
Require(sceNpSessionSignalingGetConnectionStatus(netContextId, 1, &status, nullptr, nullptr) == ConnectionNotFound, "connection without peer outputs");
Require(status == 0x5a5a5a5a && peerAddress == 0xa5a5a5a5u && peerPort == 0xa5a5, "failed status query wrote an output");
Require(sceNpSessionSignalingTerminate() == 0, "terminate failed");
}