TestProcess.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <EAStdC/EAProcess.h>
  5. #include <EAStdCTest/EAStdCTest.h>
  6. #include <EATest/EATest.h>
  7. #ifdef _MSC_VER
  8. #pragma warning(push, 0)
  9. #endif
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #ifdef _MSC_VER
  13. #pragma warning(pop)
  14. #endif
  15. #if defined(EA_PLATFORM_WINDOWS) && EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP)
  16. template <typename T> // T is one of char8_t, char16_t, char32_t.
  17. static void TestEnvironmentVar(int& nErrorCount)
  18. {
  19. using namespace EA::StdC;
  20. T name[20];
  21. T valueIn[32];
  22. T valueOut[32];
  23. bool bResult;
  24. size_t nRequiredStrlen;
  25. size_t sizeError = (size_t)-1;
  26. // Verify that nothing is found:
  27. Strlcpy(name, "NameNonExisting", EAArrayCount(name));
  28. valueOut[0] = 0;
  29. nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
  30. EATEST_VERIFY((nRequiredStrlen == sizeError) && (valueOut[0] == 0));
  31. // Verify that something can be set, then found:
  32. Strlcpy(name, "NameExisting", EAArrayCount(name));
  33. Strlcpy(valueIn, "ValueExisting", EAArrayCount(valueIn));
  34. bResult = SetEnvironmentVar(name, valueIn);
  35. EATEST_VERIFY(bResult);
  36. nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
  37. EATEST_VERIFY((nRequiredStrlen == 13) && (Strcmp(valueIn, valueOut) == 0));
  38. // Verify that a too-small output capacity is handled properly:
  39. memset(valueOut, 0xff, sizeof(valueOut));
  40. nRequiredStrlen = GetEnvironmentVar(name, valueOut, 3);
  41. EATEST_VERIFY((nRequiredStrlen == 13) && (valueOut[3] == (T)-1));
  42. // Verify that something can be reset, then found with the new value:
  43. Strlcpy(valueIn, "ValueExistingNew", EAArrayCount(valueIn));
  44. bResult = SetEnvironmentVar(name, valueIn);
  45. EATEST_VERIFY(bResult);
  46. nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
  47. EATEST_VERIFY((nRequiredStrlen == 16) && (Strcmp(valueIn, valueOut) == 0));
  48. // Verify that something can be cleared, then not found:
  49. bResult = SetEnvironmentVar(name, NULL);
  50. EATEST_VERIFY(bResult);
  51. valueOut[0] = 0;
  52. nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
  53. EATEST_VERIFY((nRequiredStrlen == sizeError) && (valueOut[0] == 0));
  54. // Verify that something can once again be set, then found:
  55. Strlcpy(name, "NameExisting", EAArrayCount(name));
  56. Strlcpy(valueIn, "ValueExistingNew2", EAArrayCount(valueIn));
  57. bResult = SetEnvironmentVar(name, valueIn);
  58. EATEST_VERIFY(bResult);
  59. nRequiredStrlen = GetEnvironmentVar(name, valueOut, EAArrayCount(valueOut));
  60. EATEST_VERIFY((nRequiredStrlen == 17) && (Strcmp(valueIn, valueOut) == 0));
  61. // Verify that GetEnvironmentVar(T) yields the same result as GetEnvironmentVar(char8_t) (T may be char16_t).
  62. char8_t valueOut8[32];
  63. T valueOutT[32];
  64. nRequiredStrlen = GetEnvironmentVar("NameExisting", valueOut8, EAArrayCount(valueOut8));
  65. Strlcpy(valueOutT, valueOut8, EAArrayCount(valueOutT)); // Need to convert char8_t to T, as Strcmp only exists for like types.
  66. EATEST_VERIFY((nRequiredStrlen == 17) && (Strcmp(valueOut, valueOutT) == 0));
  67. // Verify that GetEnvironmentVar(T) yields the same result as GetEnvironmentVar(char16_t) (T may be char8_t).
  68. char16_t name16[32];
  69. char16_t valueOut16[32];
  70. Strlcpy(name16, name, EAArrayCount(name16));
  71. nRequiredStrlen = GetEnvironmentVar(name16, valueOut16, EAArrayCount(valueOut16));
  72. Strlcpy(valueOutT, valueOut16, EAArrayCount(valueOutT)); // Need to convert char16_t to T, as Strcmp only exists for like types.
  73. EATEST_VERIFY((nRequiredStrlen == 17) && (Strcmp(valueOut, valueOutT) == 0));
  74. }
  75. #endif
  76. int TestProcess()
  77. {
  78. int nErrorCount(0);
  79. EA::UnitTest::Report("TestProcess\n");
  80. {
  81. // size_t GetCurrentProcessPath(char8_t* pPath);
  82. // size_t GetCurrentProcessPath(char16_t* pPath);
  83. // size_t GetCurrentProcessPath(char32_t* pPath);
  84. // size_t GetCurrentProcessDirectory(char8_t* pDirectory);
  85. // size_t GetCurrentProcessDirectory(char16_t* pDirectory);
  86. // size_t GetCurrentProcessDirectory(char32_t* pDirectory);
  87. // Currently we have known support for Windows. With other platforms support is inconsistent.
  88. #if EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) || defined(EA_PLATFORM_APPLE) || defined(EA_PLATFORM_LINUX) || (defined(EA_PLATFORM_SONY) && EA_SCEDBG_ENABLED)
  89. char16_t path16[EA::StdC::kMaxPathLength];
  90. char8_t path8[EA::StdC::kMaxPathLength];
  91. size_t n;
  92. size_t processPathLen;
  93. n = EA::StdC::GetCurrentProcessPath(path16);
  94. EATEST_VERIFY(n == EA::StdC::Strlen(path16));
  95. EATEST_VERIFY(n > 0);
  96. processPathLen = EA::StdC::GetCurrentProcessPath(path8);
  97. EATEST_VERIFY(processPathLen == EA::StdC::Strlen(path8));
  98. EATEST_VERIFY(processPathLen > 0);
  99. EATEST_VERIFY(EA::StdC::Strlen(path16) == EA::StdC::Strlen(path8));
  100. #if defined(EA_PLATFORM_APPLE) // Test kPathFlagBundlePath
  101. 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")
  102. {
  103. n = EA::StdC::GetCurrentProcessPath(path8, EAArrayCount(path8), EA::StdC::kPathFlagBundlePath);
  104. EATEST_VERIFY(n > 0); // Should be like "/Dir/MyApp" or "/Dir/MyApp.app"
  105. }
  106. #endif
  107. n = EA::StdC::GetCurrentProcessDirectory(path16);
  108. EATEST_VERIFY(n == EA::StdC::Strlen(path16));
  109. EATEST_VERIFY(n > 0);
  110. n = EA::StdC::GetCurrentProcessDirectory(path8);
  111. EATEST_VERIFY(n == EA::StdC::Strlen(path8));
  112. EATEST_VERIFY(n > 0);
  113. EATEST_VERIFY(EA::StdC::Strlen(path16) == EA::StdC::Strlen(path8));
  114. EATEST_VERIFY(processPathLen > n);
  115. #if defined(EA_PLATFORM_APPLE) // Test kPathFlagBundlePath
  116. // We could do a similar test for iOS.
  117. 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/")
  118. {
  119. n = EA::StdC::GetCurrentProcessDirectory(path8, EAArrayCount(path8), EA::StdC::kPathFlagBundlePath);
  120. EATEST_VERIFY((n > 0) && !EA::StdC::Strend(path8, "MacOS/")); // Should be like "/Dir/"
  121. }
  122. #elif defined(EA_PLATFORM_SONY)
  123. // Do some additional testing of SetCurrentProcessPath with GetCurrentProcessPath / GetCurrentProcessDirectory on Kettle
  124. #define KETTLE_PROCESS_FOLDER "/host/folder/subfolder/"
  125. #define KETTLE_PROCESS_ELF "test.elf"
  126. EA::StdC::SetCurrentProcessPath(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF);
  127. n = EA::StdC::GetCurrentProcessPath(path16);
  128. EATEST_VERIFY(EA::StdC::Strcmp(path16, EA_CHAR16(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF)) == 0);
  129. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF));
  130. n = EA::StdC::GetCurrentProcessPath(path8);
  131. EATEST_VERIFY(EA::StdC::Strcmp(path8, KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF) == 0);
  132. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF));
  133. n = EA::StdC::GetCurrentProcessDirectory(path16);
  134. EATEST_VERIFY(EA::StdC::Strcmp(path16, EA_CHAR16(KETTLE_PROCESS_FOLDER)) == 0);
  135. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER));
  136. EATEST_VERIFY(n > 0);
  137. n = EA::StdC::GetCurrentProcessDirectory(path8);
  138. EATEST_VERIFY(EA::StdC::Strcmp(path8, KETTLE_PROCESS_FOLDER) == 0);
  139. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER));
  140. #endif
  141. #endif
  142. }
  143. {
  144. // size_t GetEnvironmentVar(const char8_t* pName, char8_t* pValue, size_t valueCapacity);
  145. // size_t GetEnvironmentVar(const char16_t* pName, char16_t* pValue, size_t valueCapacity);
  146. // size_t GetEnvironmentVar(const char32_t* pName, char32_t* pValue, size_t valueCapacity);
  147. // bool SetEnvironmentVar(const char8_t* pName, const char8_t* pValue);
  148. // bool SetEnvironmentVar(const char16_t* pName, const char16_t* pValue);
  149. // bool SetEnvironmentVar(const char32_t* pName, const char32_t* pValue);
  150. #if defined(EA_PLATFORM_WINDOWS) && EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) // To do: Enable this for other platforms when possible.
  151. TestEnvironmentVar<char8_t>(nErrorCount);
  152. TestEnvironmentVar<char16_t>(nErrorCount);
  153. //TestEnvironmentVar<char32_t>(nErrorCount); // Doesn't yet exist.
  154. #endif
  155. }
  156. /*
  157. {
  158. // int Spawn(const char16_t* pPath, const char16_t* const* pArgumentArray, bool wait = false);
  159. // int Spawn(const char8_t* pPath, const char8_t* const* pArgumentArray, bool wait = false);
  160. // int ExecuteShellCommand(const char16_t* pCommand);
  161. // int ExecuteShellCommand(const char8_t* pCommand);
  162. // bool SearchEnvironmentPath(const char16_t* pFileName, char16_t* pPath, const char16_t* pEnvironmentVar = NULL);
  163. // bool SearchEnvironmentPath(const char8_t* pFileName, char8_t* pPath, const char8_t* pEnvironmentVar = NULL);
  164. // bool OpenFile(const char16_t* pPath); // e.g. http://www.bozo.com/somefile.html
  165. // bool OpenFile(const char8_t* pPath); // e.g. /system/settings/somefile.txt
  166. }
  167. */
  168. return nErrorCount;
  169. }