mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-05 13:20:11 +00:00
test(libkernel): check that exits release the process session and the environment is validated
Run the process session in a test executable linked with libc and leave through LibcExit and LibcExitWithoutHandlers: the backend is released once in both. Check that a refused request is never released, that off never reaches the backend, that a second session is refused, that an unset APS5_GAME_MODE is accepted and that APS5_GAME_MODE=bogus is rejected with an error naming the variable.
This commit is contained in:
1 parent
63cb5fbd00
commit
ad28df623d
3 files changed
+191
No files matched your search
@@ -0,0 +1,87 @@
|
||||
#include "prx/libc/include/Shutdown.hpp"
|
||||
#include "prx/libkernel/System/include/HostPerformance.hpp"
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace HostPerformance;
|
||||
|
||||
class PrintingBackend final : public IBackend {
|
||||
public:
|
||||
explicit PrintingBackend(Outcome outcome) : outcome(outcome) {}
|
||||
const char* Name() const override { return "printing"; }
|
||||
|
||||
BeginResult Begin() override {
|
||||
std::puts("begin called");
|
||||
return {outcome, "scripted"};
|
||||
}
|
||||
|
||||
void End() override {
|
||||
std::puts("release ran at exit");
|
||||
std::fflush(stdout);
|
||||
}
|
||||
|
||||
private:
|
||||
Outcome outcome;
|
||||
};
|
||||
|
||||
int Fail(const char* message) {
|
||||
std::fprintf(stderr, "host performance process: %s\n", message);
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
if (argc != 2) return Fail("usage: host_performance_process_tests <case>");
|
||||
const std::string name = argv[1];
|
||||
if (name == "exit" || name == "exit-without-handlers") {
|
||||
if (StartProcessSession(Mode::On, std::make_unique<PrintingBackend>(Outcome::Started)) == nullptr) return Fail("an on session must exist");
|
||||
std::fflush(stdout);
|
||||
if (name == "exit") LibcExit_nid_no_patch(0);
|
||||
LibcExitWithoutHandlers_nid_no_patch(0);
|
||||
}
|
||||
if (name == "refused") {
|
||||
if (StartProcessSession(Mode::Auto, std::make_unique<PrintingBackend>(Outcome::Refused)) == nullptr) return Fail("an auto session must exist");
|
||||
std::fflush(stdout);
|
||||
LibcExit_nid_no_patch(0);
|
||||
}
|
||||
if (name == "off") {
|
||||
if (StartProcessSession(Mode::Off, std::make_unique<PrintingBackend>(Outcome::Started)) != nullptr) return Fail("an off session must not exist");
|
||||
std::puts("off left the backend alone");
|
||||
std::fflush(stdout);
|
||||
LibcExit_nid_no_patch(0);
|
||||
}
|
||||
if (name == "twice") {
|
||||
StartProcessSession(Mode::On, std::make_unique<PrintingBackend>(Outcome::Started));
|
||||
try {
|
||||
StartProcessSession(Mode::On, std::make_unique<PrintingBackend>(Outcome::Started));
|
||||
} catch (const std::logic_error&) {
|
||||
std::puts("second session refused");
|
||||
std::fflush(stdout);
|
||||
LibcExit_nid_no_patch(0);
|
||||
}
|
||||
return Fail("a second session must be refused");
|
||||
}
|
||||
if (name == "environment") {
|
||||
const char* value = std::getenv("APS5_GAME_MODE");
|
||||
try {
|
||||
StartFromEnvironment();
|
||||
} catch (const std::invalid_argument& error) {
|
||||
if (value != nullptr && std::strcmp(value, "bogus") == 0 && std::string(error.what()).find("APS5_GAME_MODE=bogus") != std::string::npos) {
|
||||
std::puts("invalid value rejected by name");
|
||||
return 0;
|
||||
}
|
||||
return Fail(error.what());
|
||||
}
|
||||
if (value != nullptr && std::strcmp(value, "bogus") == 0) return Fail("an invalid value must be rejected");
|
||||
std::puts("environment accepted");
|
||||
return 0;
|
||||
}
|
||||
return Fail("unknown case");
|
||||
}
|
||||
Reference in new issue
Block a user