Files
EASTL/test/packages/EAStdC/test/source/TestProcess.cpp
T
jeanlemotan 48ab06b1d9 First
2024-07-02 18:10:39 +02:00

212 lines
8.7 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Copyright (c) Electronic Arts Inc. All rights reserved.
///////////////////////////////////////////////////////////////////////////////
#include <EAStdC/EAProcess.h>
#include <EAStdCTest/EAStdCTest.h>
#include <EATest/EATest.h>
#ifdef _MSC_VER
#pragma warning(push, 0)
#endif
#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#if defined(EA_PLATFORM_WINDOWS) && EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP)
template <typename T> // T is one of char, char16_t, char32_t.
static void TestEnvironmentVar(int& nErrorCount)
{
using namespace EA::StdC;
T name[20];
T valueIn[32];
T valueOut[32];
bool bResult;
size_t nRequiredStrlen;
size_t sizeError = (size_t)-1;
// Verify that nothing is found:
Strlcpy(name, "NameNonExisting", EAArrayCount(name));
valueOut[0] = 0;
nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
EATEST_VERIFY((nRequiredStrlen == sizeError) && (valueOut[0] == 0));
// Verify that something can be set, then found:
Strlcpy(name, "NameExisting", EAArrayCount(name));
Strlcpy(valueIn, "ValueExisting", EAArrayCount(valueIn));
bResult = SetEnvironmentVar(name, valueIn);
EATEST_VERIFY(bResult);
nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
EATEST_VERIFY((nRequiredStrlen == 13) && (Strcmp(valueIn, valueOut) == 0));
// Verify that a too-small output capacity is handled properly:
memset(valueOut, 0xff, sizeof(valueOut));
nRequiredStrlen = GetEnvironmentVar(name, valueOut, 3);
EATEST_VERIFY((nRequiredStrlen == 13) && (valueOut[3] == (T)-1));
// Verify that something can be reset, then found with the new value:
Strlcpy(valueIn, "ValueExistingNew", EAArrayCount(valueIn));
bResult = SetEnvironmentVar(name, valueIn);
EATEST_VERIFY(bResult);
nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
EATEST_VERIFY((nRequiredStrlen == 16) && (Strcmp(valueIn, valueOut) == 0));
// Verify that something can be cleared, then not found:
bResult = SetEnvironmentVar(name, NULL);
EATEST_VERIFY(bResult);
valueOut[0] = 0;
nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
EATEST_VERIFY((nRequiredStrlen == sizeError) && (valueOut[0] == 0));
// Verify that something can once again be set, then found:
Strlcpy(name, "NameExisting", EAArrayCount(name));
Strlcpy(valueIn, "ValueExistingNew2", EAArrayCount(valueIn));
bResult = SetEnvironmentVar(name, valueIn);
EATEST_VERIFY(bResult);
nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
EATEST_VERIFY((nRequiredStrlen == 17) && (Strcmp(valueIn, valueOut) == 0));
// Verify that GetEnvironmentVar(T) yields the same result as GetEnvironmentVar(char) (T may be char16_t).
char valueOut8[32];
T valueOutT[32];
nRequiredStrlen = GetEnvironmentVar("NameExisting", valueOut8, EAArrayCount(valueOut8));
Strlcpy(valueOutT, valueOut8, EAArrayCount(valueOutT)); // Need to convert char to T, as Strcmp only exists for like types.
EATEST_VERIFY((nRequiredStrlen == 17) && (Strcmp(valueOut, valueOutT) == 0));
// Verify that GetEnvironmentVar(T) yields the same result as GetEnvironmentVar(char16_t) (T may be char).
char16_t name16[32];
char16_t valueOut16[32];
Strlcpy(name16, name, EAArrayCount(name16));
nRequiredStrlen = GetEnvironmentVar(name16, valueOut16, EAArrayCount(valueOut16));
Strlcpy(valueOutT, valueOut16, EAArrayCount(valueOutT)); // Need to convert char16_t to T, as Strcmp only exists for like types.
EATEST_VERIFY((nRequiredStrlen == 17) && (Strcmp(valueOut, valueOutT) == 0));
}
#endif
int TestProcess()
{
int nErrorCount(0);
{
// size_t GetCurrentProcessPath(char* pPath);
// size_t GetCurrentProcessPath(char16_t* pPath);
// size_t GetCurrentProcessPath(char32_t* pPath);
// size_t GetCurrentProcessDirectory(char* pDirectory);
// size_t GetCurrentProcessDirectory(char16_t* pDirectory);
// size_t GetCurrentProcessDirectory(char32_t* pDirectory);
// Currently we have known support for Windows. With other platforms support is inconsistent.
#if EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) || defined(EA_PLATFORM_APPLE) || defined(EA_PLATFORM_LINUX) || (defined(EA_PLATFORM_SONY) && EA_SCEDBG_ENABLED)
char16_t path16[EA::StdC::kMaxPathLength];
char path8[EA::StdC::kMaxPathLength];
size_t n;
size_t processPathLen;
n = EA::StdC::GetCurrentProcessPath(path16);
EATEST_VERIFY(n == EA::StdC::Strlen(path16));
EATEST_VERIFY(n > 0);
processPathLen = EA::StdC::GetCurrentProcessPath(path8);
EATEST_VERIFY(processPathLen == EA::StdC::Strlen(path8));
EATEST_VERIFY(processPathLen > 0);
EATEST_VERIFY(EA::StdC::Strlen(path16) == EA::StdC::Strlen(path8));
#if defined(EA_PLATFORM_APPLE) // Test kPathFlagBundlePath
if(n && !EA::StdC::Strend(path8, ".app")) // If we have a path to a file within a bundle (e.g. "/Dir/MyApp.app/Contents/MacOS/MyApp")
{
n = EA::StdC::GetCurrentProcessPath(path8, EAArrayCount(path8), EA::StdC::kPathFlagBundlePath);
EATEST_VERIFY(n > 0); // Should be like "/Dir/MyApp" or "/Dir/MyApp.app"
}
#endif
n = EA::StdC::GetCurrentProcessDirectory(path16);
EATEST_VERIFY(n == EA::StdC::Strlen(path16));
EATEST_VERIFY(n > 0);
n = EA::StdC::GetCurrentProcessDirectory(path8);
EATEST_VERIFY(n == EA::StdC::Strlen(path8));
EATEST_VERIFY(n > 0);
EATEST_VERIFY(EA::StdC::Strlen(path16) == EA::StdC::Strlen(path8));
EATEST_VERIFY(processPathLen > n);
#if defined(EA_PLATFORM_APPLE) // Test kPathFlagBundlePath
// We could do a similar test for iOS.
if(n && EA::StdC::Strend(path8, "MacOS/")) // If we have a path to a file within a MacOS bundle (e.g. "/Dir/MyApp.app/Contents/MacOS/")
{
n = EA::StdC::GetCurrentProcessDirectory(path8, EAArrayCount(path8), EA::StdC::kPathFlagBundlePath);
EATEST_VERIFY((n > 0) && !EA::StdC::Strend(path8, "MacOS/")); // Should be like "/Dir/"
}
#elif defined(EA_PLATFORM_SONY)
// Do some additional testing of SetCurrentProcessPath with GetCurrentProcessPath / GetCurrentProcessDirectory on Kettle
#define KETTLE_PROCESS_FOLDER "/host/folder/subfolder/"
#define KETTLE_PROCESS_ELF "test.elf"
EA::StdC::SetCurrentProcessPath(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF);
n = EA::StdC::GetCurrentProcessPath(path16);
EATEST_VERIFY(EA::StdC::Strcmp(path16, EA_CHAR16(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF)) == 0);
EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF));
n = EA::StdC::GetCurrentProcessPath(path8);
EATEST_VERIFY(EA::StdC::Strcmp(path8, KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF) == 0);
EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF));
n = EA::StdC::GetCurrentProcessDirectory(path16);
EATEST_VERIFY(EA::StdC::Strcmp(path16, EA_CHAR16(KETTLE_PROCESS_FOLDER)) == 0);
EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER));
EATEST_VERIFY(n > 0);
n = EA::StdC::GetCurrentProcessDirectory(path8);
EATEST_VERIFY(EA::StdC::Strcmp(path8, KETTLE_PROCESS_FOLDER) == 0);
EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER));
#endif
#endif
}
{
// size_t GetEnvironmentVar(const char* pName, char* pValue, size_t valueCapacity);
// size_t GetEnvironmentVar(const char16_t* pName, char16_t* pValue, size_t valueCapacity);
// size_t GetEnvironmentVar(const char32_t* pName, char32_t* pValue, size_t valueCapacity);
// bool SetEnvironmentVar(const char* pName, const char* pValue);
// bool SetEnvironmentVar(const char16_t* pName, const char16_t* pValue);
// bool SetEnvironmentVar(const char32_t* pName, const char32_t* pValue);
#if defined(EA_PLATFORM_WINDOWS) && EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) // To do: Enable this for other platforms when possible.
TestEnvironmentVar<char>(nErrorCount);
TestEnvironmentVar<char16_t>(nErrorCount);
//TestEnvironmentVar<char32_t>(nErrorCount); // Doesn't yet exist.
#endif
}
/*
{
// int Spawn(const char16_t* pPath, const char16_t* const* pArgumentArray, bool wait = false);
// int Spawn(const char* pPath, const char* const* pArgumentArray, bool wait = false);
// int ExecuteShellCommand(const char16_t* pCommand);
// int ExecuteShellCommand(const char* pCommand);
// bool SearchEnvironmentPath(const char16_t* pFileName, char16_t* pPath, const char16_t* pEnvironmentVar = NULL);
// bool SearchEnvironmentPath(const char* pFileName, char* pPath, const char* pEnvironmentVar = NULL);
// bool OpenFile(const char16_t* pPath); // e.g. http://www.bozo.com/somefile.html
// bool OpenFile(const char* pPath); // e.g. /system/settings/somefile.txt
}
*/
return nErrorCount;
}