SettingsBuilder.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.IO;
  3. using UnityEditor.TestRunner.CommandLineParser;
  4. using UnityEditor.TestTools.TestRunner.Api;
  5. using UnityEditor.TestTools.TestRunner.GUI;
  6. namespace UnityEditor.TestTools.TestRunner.CommandLineTest
  7. {
  8. internal class SettingsBuilder : ISettingsBuilder
  9. {
  10. private ITestSettingsDeserializer m_TestSettingsDeserializer;
  11. private Action<string> m_LogAction;
  12. private Action<string> m_LogWarningAction;
  13. private Func<string, bool> m_FileExistsCheck;
  14. private Func<bool> m_ScriptCompilationFailedCheck;
  15. public SettingsBuilder(ITestSettingsDeserializer testSettingsDeserializer, Action<string> logAction, Action<string> logWarningAction, Func<string, bool> fileExistsCheck, Func<bool> scriptCompilationFailedCheck)
  16. {
  17. m_LogAction = logAction;
  18. m_LogWarningAction = logWarningAction;
  19. m_FileExistsCheck = fileExistsCheck;
  20. m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck;
  21. m_TestSettingsDeserializer = testSettingsDeserializer;
  22. }
  23. public Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs)
  24. {
  25. var quit = false;
  26. string testPlatform = TestMode.EditMode.ToString();
  27. string[] testFilters = null;
  28. string[] testCategories = null;
  29. string testSettingsFilePath = null;
  30. int testRepetitions = 1;
  31. int? playerHeartbeatTimeout = null;
  32. bool runSynchronously = false;
  33. string[] testAssemblyNames = null;
  34. var optionSet = new CommandLineOptionSet(
  35. new CommandLineOption("quit", () => { quit = true; }),
  36. new CommandLineOption("testPlatform", platform => { testPlatform = platform; }),
  37. new CommandLineOption("editorTestsFilter", filters => { testFilters = filters; }),
  38. new CommandLineOption("testFilter", filters => { testFilters = filters; }),
  39. new CommandLineOption("editorTestsCategories", catagories => { testCategories = catagories; }),
  40. new CommandLineOption("testCategory", catagories => { testCategories = catagories; }),
  41. new CommandLineOption("testSettingsFile", settingsFilePath => { testSettingsFilePath = settingsFilePath; }),
  42. new CommandLineOption("testRepetitions", reps => { testRepetitions = int.Parse(reps); }),
  43. new CommandLineOption("playerHeartbeatTimeout", timeout => { playerHeartbeatTimeout = int.Parse(timeout); }),
  44. new CommandLineOption("runSynchronously", () => { runSynchronously = true; }),
  45. new CommandLineOption("assemblyNames", assemblyNames => { testAssemblyNames = assemblyNames; })
  46. );
  47. optionSet.Parse(commandLineArgs);
  48. DisplayQuitWarningIfQuitIsGiven(quit);
  49. CheckForScriptCompilationErrors();
  50. LogParametersForRun(testPlatform, testFilters, testCategories, testSettingsFilePath);
  51. var testSettings = GetTestSettings(testSettingsFilePath);
  52. var filter = new Filter()
  53. {
  54. groupNames = testFilters,
  55. categoryNames = testCategories,
  56. assemblyNames = testAssemblyNames
  57. };
  58. var buildTarget = SetFilterAndGetBuildTarget(testPlatform, filter);
  59. RerunCallbackData.instance.runFilters = new []{new UITestRunnerFilter()
  60. {
  61. categoryNames = filter.categoryNames,
  62. groupNames = filter.groupNames,
  63. testRepetitions = testRepetitions
  64. }};
  65. RerunCallbackData.instance.testMode = filter.testMode;
  66. var settings = new Api.ExecutionSettings()
  67. {
  68. filters = new []{filter},
  69. overloadTestRunSettings = new RunSettings(testSettings),
  70. targetPlatform = buildTarget,
  71. runSynchronously = runSynchronously
  72. };
  73. if (playerHeartbeatTimeout != null)
  74. {
  75. settings.playerHeartbeatTimeout = playerHeartbeatTimeout.Value;
  76. }
  77. return settings;
  78. }
  79. public ExecutionSettings BuildExecutionSettings(string[] commandLineArgs)
  80. {
  81. string resultFilePath = null;
  82. string deviceLogsDirectory = null;
  83. var optionSet = new CommandLineOptionSet(
  84. new CommandLineOption("editorTestsResultFile", filePath => { resultFilePath = filePath; }),
  85. new CommandLineOption("testResults", filePath => { resultFilePath = filePath; }),
  86. new CommandLineOption("deviceLogs", dirPath => { deviceLogsDirectory = dirPath; })
  87. );
  88. optionSet.Parse(commandLineArgs);
  89. return new ExecutionSettings()
  90. {
  91. TestResultsFile = resultFilePath,
  92. DeviceLogsDirectory = deviceLogsDirectory
  93. };
  94. }
  95. void DisplayQuitWarningIfQuitIsGiven(bool quitIsGiven)
  96. {
  97. if (quitIsGiven)
  98. {
  99. m_LogWarningAction("Running tests from command line arguments will not work when \"quit\" is specified.");
  100. }
  101. }
  102. void CheckForScriptCompilationErrors()
  103. {
  104. if (m_ScriptCompilationFailedCheck())
  105. {
  106. throw new SetupException(SetupException.ExceptionType.ScriptCompilationFailed);
  107. }
  108. }
  109. void LogParametersForRun(string testPlatform, string[] testFilters, string[] testCategories, string testSettingsFilePath)
  110. {
  111. m_LogAction("Running tests for " + testPlatform);
  112. if (testFilters != null && testFilters.Length > 0)
  113. {
  114. m_LogAction("With test filter: " + string.Join(", ", testFilters));
  115. }
  116. if (testCategories != null && testCategories.Length > 0)
  117. {
  118. m_LogAction("With test categories: " + string.Join(", ", testCategories));
  119. }
  120. if (!string.IsNullOrEmpty(testSettingsFilePath))
  121. {
  122. m_LogAction("With test settings file: " + testSettingsFilePath);
  123. }
  124. }
  125. ITestSettings GetTestSettings(string testSettingsFilePath)
  126. {
  127. ITestSettings testSettings = null;
  128. if (!string.IsNullOrEmpty(testSettingsFilePath))
  129. {
  130. if (!m_FileExistsCheck(testSettingsFilePath))
  131. {
  132. throw new SetupException(SetupException.ExceptionType.TestSettingsFileNotFound, testSettingsFilePath);
  133. }
  134. testSettings = m_TestSettingsDeserializer.GetSettingsFromJsonFile(testSettingsFilePath);
  135. }
  136. return testSettings;
  137. }
  138. static BuildTarget? SetFilterAndGetBuildTarget(string testPlatform, Filter filter)
  139. {
  140. BuildTarget? buildTarget = null;
  141. if (testPlatform.ToLower() == "editmode")
  142. {
  143. filter.testMode = TestMode.EditMode;
  144. }
  145. else if (testPlatform.ToLower() == "playmode")
  146. {
  147. filter.testMode = TestMode.PlayMode;
  148. }
  149. else
  150. {
  151. try
  152. {
  153. buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), testPlatform, true);
  154. filter.testMode = TestMode.PlayMode;
  155. }
  156. catch (ArgumentException)
  157. {
  158. throw new SetupException(SetupException.ExceptionType.PlatformNotFound, testPlatform);
  159. }
  160. }
  161. return buildTarget;
  162. }
  163. }
  164. }