TestProcess.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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 char, 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(char) (T may be char16_t).
  62. char valueOut8[32];
  63. T valueOutT[32];
  64. nRequiredStrlen = GetEnvironmentVar("NameExisting", valueOut8, EAArrayCount(valueOut8));
  65. Strlcpy(valueOutT, valueOut8, EAArrayCount(valueOutT)); // Need to convert char 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 char).
  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. {
  80. // size_t GetCurrentProcessPath(char* pPath);
  81. // size_t GetCurrentProcessPath(char16_t* pPath);
  82. // size_t GetCurrentProcessPath(char32_t* pPath);
  83. // size_t GetCurrentProcessDirectory(char* pDirectory);
  84. // size_t GetCurrentProcessDirectory(char16_t* pDirectory);
  85. // size_t GetCurrentProcessDirectory(char32_t* pDirectory);
  86. // Currently we have known support for Windows. With other platforms support is inconsistent.
  87. #if EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) || defined(EA_PLATFORM_APPLE) || defined(EA_PLATFORM_LINUX) || (defined(EA_PLATFORM_SONY) && EA_SCEDBG_ENABLED)
  88. char16_t path16[EA::StdC::kMaxPathLength];
  89. char path8[EA::StdC::kMaxPathLength];
  90. size_t n;
  91. size_t processPathLen;
  92. n = EA::StdC::GetCurrentProcessPath(path16);
  93. EATEST_VERIFY(n == EA::StdC::Strlen(path16));
  94. EATEST_VERIFY(n > 0);
  95. processPathLen = EA::StdC::GetCurrentProcessPath(path8);
  96. EATEST_VERIFY(processPathLen == EA::StdC::Strlen(path8));
  97. EATEST_VERIFY(processPathLen > 0);
  98. EATEST_VERIFY(EA::StdC::Strlen(path16) == EA::StdC::Strlen(path8));
  99. #if defined(EA_PLATFORM_APPLE) // Test kPathFlagBundlePath
  100. 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")
  101. {
  102. n = EA::StdC::GetCurrentProcessPath(path8, EAArrayCount(path8), EA::StdC::kPathFlagBundlePath);
  103. EATEST_VERIFY(n > 0); // Should be like "/Dir/MyApp" or "/Dir/MyApp.app"
  104. }
  105. #endif
  106. n = EA::StdC::GetCurrentProcessDirectory(path16);
  107. EATEST_VERIFY(n == EA::StdC::Strlen(path16));
  108. EATEST_VERIFY(n > 0);
  109. n = EA::StdC::GetCurrentProcessDirectory(path8);
  110. EATEST_VERIFY(n == EA::StdC::Strlen(path8));
  111. EATEST_VERIFY(n > 0);
  112. EATEST_VERIFY(EA::StdC::Strlen(path16) == EA::StdC::Strlen(path8));
  113. EATEST_VERIFY(processPathLen > n);
  114. #if defined(EA_PLATFORM_APPLE) // Test kPathFlagBundlePath
  115. // We could do a similar test for iOS.
  116. 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/")
  117. {
  118. n = EA::StdC::GetCurrentProcessDirectory(path8, EAArrayCount(path8), EA::StdC::kPathFlagBundlePath);
  119. EATEST_VERIFY((n > 0) && !EA::StdC::Strend(path8, "MacOS/")); // Should be like "/Dir/"
  120. }
  121. #elif defined(EA_PLATFORM_SONY)
  122. // Do some additional testing of SetCurrentProcessPath with GetCurrentProcessPath / GetCurrentProcessDirectory on Kettle
  123. #define KETTLE_PROCESS_FOLDER "/host/folder/subfolder/"
  124. #define KETTLE_PROCESS_ELF "test.elf"
  125. EA::StdC::SetCurrentProcessPath(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF);
  126. n = EA::StdC::GetCurrentProcessPath(path16);
  127. EATEST_VERIFY(EA::StdC::Strcmp(path16, EA_CHAR16(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF)) == 0);
  128. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF));
  129. n = EA::StdC::GetCurrentProcessPath(path8);
  130. EATEST_VERIFY(EA::StdC::Strcmp(path8, KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF) == 0);
  131. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER KETTLE_PROCESS_ELF));
  132. n = EA::StdC::GetCurrentProcessDirectory(path16);
  133. EATEST_VERIFY(EA::StdC::Strcmp(path16, EA_CHAR16(KETTLE_PROCESS_FOLDER)) == 0);
  134. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER));
  135. EATEST_VERIFY(n > 0);
  136. n = EA::StdC::GetCurrentProcessDirectory(path8);
  137. EATEST_VERIFY(EA::StdC::Strcmp(path8, KETTLE_PROCESS_FOLDER) == 0);
  138. EATEST_VERIFY(n == EA::StdC::Strlen(KETTLE_PROCESS_FOLDER));
  139. #endif
  140. #endif
  141. }
  142. {
  143. // size_t GetEnvironmentVar(const char* pName, char* pValue, size_t valueCapacity);
  144. // size_t GetEnvironmentVar(const char16_t* pName, char16_t* pValue, size_t valueCapacity);
  145. // size_t GetEnvironmentVar(const char32_t* pName, char32_t* pValue, size_t valueCapacity);
  146. // bool SetEnvironmentVar(const char* pName, const char* pValue);
  147. // bool SetEnvironmentVar(const char16_t* pName, const char16_t* pValue);
  148. // bool SetEnvironmentVar(const char32_t* pName, const char32_t* pValue);
  149. #if defined(EA_PLATFORM_WINDOWS) && EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) // To do: Enable this for other platforms when possible.
  150. TestEnvironmentVar<char>(nErrorCount);
  151. TestEnvironmentVar<char16_t>(nErrorCount);
  152. //TestEnvironmentVar<char32_t>(nErrorCount); // Doesn't yet exist.
  153. #endif
  154. }
  155. /*
  156. {
  157. // int Spawn(const char16_t* pPath, const char16_t* const* pArgumentArray, bool wait = false);
  158. // int Spawn(const char* pPath, const char* const* pArgumentArray, bool wait = false);
  159. // int ExecuteShellCommand(const char16_t* pCommand);
  160. // int ExecuteShellCommand(const char* pCommand);
  161. // bool SearchEnvironmentPath(const char16_t* pFileName, char16_t* pPath, const char16_t* pEnvironmentVar = NULL);
  162. // bool SearchEnvironmentPath(const char* pFileName, char* pPath, const char* pEnvironmentVar = NULL);
  163. // bool OpenFile(const char16_t* pPath); // e.g. http://www.bozo.com/somefile.html
  164. // bool OpenFile(const char* pPath); // e.g. /system/settings/somefile.txt
  165. }
  166. */
  167. return nErrorCount;
  168. }