From 6d185e5d24a9836b164a0ddd6a7f79775bd3f69e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Sun, 27 Jun 2021 15:58:36 -0400 Subject: [PATCH 01/19] moving orchestration to this branch from test/multiprocess-testing/wip --- ...nity.multiplayer.mlapi.runtimetests.asmdef | 20 ++- testproject/.gitignore | 3 + testproject/Assets/StreamingAssets.meta | 8 ++ testproject/Assets/StreamingAssets/empty.txt | 0 .../Assets/StreamingAssets/empty.txt.meta | 7 ++ .../Helpers/BuildMultiprocessTestPlayer.cs | 118 ++++++++++++++++++ .../BuildMultiprocessTestPlayer.cs.meta | 11 ++ .../Helpers/MultiprocessOrchestration.cs | 61 +++++++++ .../Helpers/MultiprocessOrchestration.cs.meta | 11 ++ .../Runtime/testproject.runtimetests.asmdef | 22 +++- 10 files changed, 253 insertions(+), 8 deletions(-) create mode 100644 testproject/Assets/StreamingAssets.meta create mode 100644 testproject/Assets/StreamingAssets/empty.txt create mode 100644 testproject/Assets/StreamingAssets/empty.txt.meta create mode 100644 testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs create mode 100644 testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta create mode 100644 testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs create mode 100644 testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef b/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef index efbf850de3..07a21b8196 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef @@ -1,12 +1,24 @@ { "name": "Unity.Multiplayer.MLAPI.RuntimeTests", + "rootNamespace": "", "references": [ "Unity.Multiplayer.MLAPI.Runtime", + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", "Unity.Multiplayer.MLAPI.Editor" ], - "optionalUnityReferences": [ - "TestAssemblies" - ], "includePlatforms": [], - "excludePlatforms": [] + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS", + "UNITY_EDITOR" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/testproject/.gitignore b/testproject/.gitignore index 72c27e4fe2..933758634d 100644 --- a/testproject/.gitignore +++ b/testproject/.gitignore @@ -69,3 +69,6 @@ crashlytics-build.properties # Temporary auto-generated Android Assets /[Aa]ssets/[Ss]treamingAssets/aa.meta /[Aa]ssets/[Ss]treamingAssets/aa/* + +/[Aa]ssets/[Ss]treamingAssets/buildInfo.txt +/[Aa]ssets/[Ss]treamingAssets/buildInfo.txt.meta diff --git a/testproject/Assets/StreamingAssets.meta b/testproject/Assets/StreamingAssets.meta new file mode 100644 index 0000000000..2926e11ded --- /dev/null +++ b/testproject/Assets/StreamingAssets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50c3bcef4ad84445a1f9eb2246d2e172 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/StreamingAssets/empty.txt b/testproject/Assets/StreamingAssets/empty.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testproject/Assets/StreamingAssets/empty.txt.meta b/testproject/Assets/StreamingAssets/empty.txt.meta new file mode 100644 index 0000000000..faaff388a0 --- /dev/null +++ b/testproject/Assets/StreamingAssets/empty.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ab2fb420f22574b13b33f6913b8736d8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs new file mode 100644 index 0000000000..b7917a266b --- /dev/null +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -0,0 +1,118 @@ +using System; +using System.IO; +#if UNITY_EDITOR +using UnityEditor; +using UnityEditor.Build.Reporting; +#endif +using UnityEngine; + +/// +/// This is needed as Unity throws "An abnormal situation has occurred: the PlayerLoop internal function has been called recursively. Please contact Customer Support with a sample project so that we can reproduce the problem and troubleshoot it." +/// when trying to build from Setup() steps in tests. +/// +public class BuildMultiprocessTestPlayer : MonoBehaviour +{ + public const string multiprocessBaseMenuName = "MLAPI Multiprocess Test"; + public const string BuildAndExecuteMenuName = multiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; + public static string buildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); + public const string mainSceneName = "MultiprocessTestingScene"; + + +#if UNITY_EDITOR + [MenuItem(multiprocessBaseMenuName+"/Build Test Player #t")] + public static void BuildNoExecute() + { + var success = Build(); + if (!success) + { + throw new Exception("Build failed!"); + } + } + + [MenuItem(multiprocessBaseMenuName+"/Build Test Player in debug mode")] + public static void BuildDebug() + { + var success = Build(true); + if (!success) + { + throw new Exception("Build failed!"); + } + } + + [MenuItem(multiprocessBaseMenuName+"/Delete Test Build")] + public static void DeleteBuild() + { + switch (Application.platform) + { + case RuntimePlatform.WindowsPlayer: + case RuntimePlatform.WindowsEditor: + var exePath = $"{buildPath}.exe"; + if (File.Exists(exePath)) + { + File.Delete(exePath); + } + else + { + Debug.Log($"exe {exePath} doesn't exists"); + } + break; + case RuntimePlatform.OSXPlayer: + case RuntimePlatform.OSXEditor: + var toDelete = buildPath + ".app"; + if (Directory.Exists(toDelete)) + { + Directory.Delete(toDelete, recursive: true); + } + else + { + Debug.Log($"directory {toDelete} doesn't exists"); + } + break; + default: + throw new NotImplementedException(); + } + } + + /// + /// Needs a separate build than the standalone test builds since we don't want the player to try to connect to the editor to do test + /// reporting. We only want to main node to do that, worker nodes should be dumb + /// + /// + public static bool Build(bool isDebug = false) + { + // Save standalone build path to file + var f = File.CreateText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.buildInfoFileName)); + f.Write(buildPath); + f.Close(); + + // var buildPath = Application.streamingAssetsPath; + // deleting so we don't end up testing on outdated builds if there's a build failure + DeleteBuild(); + + var buildOptions = BuildOptions.None; + buildOptions |= BuildOptions.IncludeTestAssemblies; + buildOptions |= BuildOptions.StrictMode; + if (isDebug) + { + buildOptions |= BuildOptions.Development; + buildOptions |= BuildOptions.AllowDebugging; // enable this if you want to debug your players. Your players + // will have more connection permission popups when launching though + } + + var buildPathToUse = buildPath; + if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor) + { + buildPathToUse += ".exe"; + } + + buildOptions &= ~BuildOptions.AutoRunPlayer; + var buildReport = BuildPipeline.BuildPlayer( + new[] { $"Assets/Scenes/{mainSceneName}.unity" }, + buildPathToUse, + EditorUserBuildSettings.activeBuildTarget, + buildOptions); + + return buildReport.summary.result == BuildResult.Succeeded; + } +#endif +} diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta new file mode 100644 index 0000000000..87acf05da8 --- /dev/null +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b389565fd8544431db4c24940cb569c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs new file mode 100644 index 0000000000..7f9f84d82c --- /dev/null +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs @@ -0,0 +1,61 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using UnityEditor; +using UnityEngine; +using Debug = UnityEngine.Debug; + +public class MultiprocessOrchestration +{ + public const string buildInfoFileName = "buildInfo.txt"; + public const string isWorkerArg = "-isWorker"; + + public static void StartWorkerNode() + { + var workerNode = new Process(); + + //TODO this should be replaced eventually by proper orchestration for all supported platforms + string buildInstructions = $"You probably didn't generate your build. Please make sure you build a player using the '{BuildMultiprocessTestPlayer.BuildAndExecuteMenuName}' menu"; + try + { + var buildInfo = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, buildInfoFileName)); + switch (Application.platform) + { + case RuntimePlatform.OSXPlayer: + case RuntimePlatform.OSXEditor: + workerNode.StartInfo.FileName = $"{buildInfo}.app/Contents/MacOS/testproject"; + break; + case RuntimePlatform.WindowsPlayer: + case RuntimePlatform.WindowsEditor: + workerNode.StartInfo.FileName = $"{buildInfo}.exe"; + break; + default: + throw new NotImplementedException("StartWorkerNode: Current platform not supported"); + } + } + catch (FileNotFoundException) + { + throw new Exception($"Couldn't find build info file. {buildInstructions}"); + } + + workerNode.StartInfo.UseShellExecute = false; + workerNode.StartInfo.RedirectStandardError = true; + workerNode.StartInfo.RedirectStandardOutput = true; + workerNode.StartInfo.Arguments = $"{isWorkerArg} -popupwindow -screen-width 100 -screen-height 100"; + // workerNode.StartInfo.Arguments += " -deepprofiling"; // enable for deep profiling + try + { + var newProcessStarted = workerNode.Start(); + if (!newProcessStarted) + { + throw new Exception("Process not started!"); + } + } + catch (Win32Exception e) + { + Debug.LogError($"Error starting player, {buildInstructions}, {e.Message} {e.Data} {e.ErrorCode}"); + throw; + } + } +} diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta new file mode 100644 index 0000000000..4797a6c5a7 --- /dev/null +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b59a46cbb2c54f4d977a05103227453 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef index 2aa7afc6f7..45c640863c 100644 --- a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef +++ b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef @@ -1,11 +1,25 @@ { "name": "TestProject.RuntimeTests", + "rootNamespace": "", "references": [ "Unity.Multiplayer.MLAPI.Runtime", "Unity.Multiplayer.MLAPI.RuntimeTests", - "TestProject.ManualTests" + "TestProject.ManualTests", + "UnityEngine.TestRunner", + "UnityEditor.TestRunner" ], - "optionalUnityReferences": [ - "TestAssemblies" - ] + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS", + "UNITY_EDITOR" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From 23e435aa5d15d8b5919edd161b76fa11ed646fca Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Sun, 27 Jun 2021 19:36:49 -0400 Subject: [PATCH 02/19] cleanup --- .../MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index b7917a266b..1b7d2b24e1 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -80,12 +80,11 @@ public static void DeleteBuild() /// public static bool Build(bool isDebug = false) { - // Save standalone build path to file + // Save standalone build path to file so we can read it from standalone tests (that are not running from editor) var f = File.CreateText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.buildInfoFileName)); f.Write(buildPath); f.Close(); - // var buildPath = Application.streamingAssetsPath; // deleting so we don't end up testing on outdated builds if there's a build failure DeleteBuild(); From c38a957ecba73423c0a8088105164424f7375dd6 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Sun, 27 Jun 2021 19:41:09 -0400 Subject: [PATCH 03/19] better name --- .../MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 1b7d2b24e1..3e9d4d82d5 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -20,7 +20,7 @@ public class BuildMultiprocessTestPlayer : MonoBehaviour #if UNITY_EDITOR [MenuItem(multiprocessBaseMenuName+"/Build Test Player #t")] - public static void BuildNoExecute() + public static void BuildNoDebug() { var success = Build(); if (!success) From b1656ae5e159e447633a3ae1289d5c2ac5913a88 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 5 Jul 2021 18:30:54 -0400 Subject: [PATCH 04/19] consistent naming --- .../Helpers/BuildMultiprocessTestPlayer.cs | 27 +++++++++---------- .../Helpers/MultiprocessOrchestration.cs | 8 +++--- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 3e9d4d82d5..94bc5a7dcf 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -12,14 +12,13 @@ /// public class BuildMultiprocessTestPlayer : MonoBehaviour { - public const string multiprocessBaseMenuName = "MLAPI Multiprocess Test"; - public const string BuildAndExecuteMenuName = multiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; - public static string buildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); - public const string mainSceneName = "MultiprocessTestingScene"; - + public const string BuildAndExecuteMenuName = k_MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; + private const string k_MultiprocessBaseMenuName = "MLAPI Multiprocess Test"; + private const string k_MainSceneName = "MultiprocessTestingScene"; + private static string s_BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); #if UNITY_EDITOR - [MenuItem(multiprocessBaseMenuName+"/Build Test Player #t")] + [MenuItem(k_MultiprocessBaseMenuName+"/Build Test Player #t")] public static void BuildNoDebug() { var success = Build(); @@ -29,7 +28,7 @@ public static void BuildNoDebug() } } - [MenuItem(multiprocessBaseMenuName+"/Build Test Player in debug mode")] + [MenuItem(k_MultiprocessBaseMenuName+"/Build Test Player in debug mode")] public static void BuildDebug() { var success = Build(true); @@ -39,14 +38,14 @@ public static void BuildDebug() } } - [MenuItem(multiprocessBaseMenuName+"/Delete Test Build")] + [MenuItem(k_MultiprocessBaseMenuName+"/Delete Test Build")] public static void DeleteBuild() { switch (Application.platform) { case RuntimePlatform.WindowsPlayer: case RuntimePlatform.WindowsEditor: - var exePath = $"{buildPath}.exe"; + var exePath = $"{s_BuildPath}.exe"; if (File.Exists(exePath)) { File.Delete(exePath); @@ -58,7 +57,7 @@ public static void DeleteBuild() break; case RuntimePlatform.OSXPlayer: case RuntimePlatform.OSXEditor: - var toDelete = buildPath + ".app"; + var toDelete = s_BuildPath + ".app"; if (Directory.Exists(toDelete)) { Directory.Delete(toDelete, recursive: true); @@ -81,8 +80,8 @@ public static void DeleteBuild() public static bool Build(bool isDebug = false) { // Save standalone build path to file so we can read it from standalone tests (that are not running from editor) - var f = File.CreateText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.buildInfoFileName)); - f.Write(buildPath); + var f = File.CreateText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName)); + f.Write(s_BuildPath); f.Close(); // deleting so we don't end up testing on outdated builds if there's a build failure @@ -98,7 +97,7 @@ public static bool Build(bool isDebug = false) // will have more connection permission popups when launching though } - var buildPathToUse = buildPath; + var buildPathToUse = s_BuildPath; if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor) { buildPathToUse += ".exe"; @@ -106,7 +105,7 @@ public static bool Build(bool isDebug = false) buildOptions &= ~BuildOptions.AutoRunPlayer; var buildReport = BuildPipeline.BuildPlayer( - new[] { $"Assets/Scenes/{mainSceneName}.unity" }, + new[] { $"Assets/Scenes/{k_MainSceneName}.unity" }, buildPathToUse, EditorUserBuildSettings.activeBuildTarget, buildOptions); diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs index 7f9f84d82c..7977f9db57 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs @@ -8,8 +8,8 @@ public class MultiprocessOrchestration { - public const string buildInfoFileName = "buildInfo.txt"; - public const string isWorkerArg = "-isWorker"; + public const string BuildInfoFileName = "buildInfo.txt"; + public const string IsWorkerArg = "-isWorker"; public static void StartWorkerNode() { @@ -19,7 +19,7 @@ public static void StartWorkerNode() string buildInstructions = $"You probably didn't generate your build. Please make sure you build a player using the '{BuildMultiprocessTestPlayer.BuildAndExecuteMenuName}' menu"; try { - var buildInfo = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, buildInfoFileName)); + var buildInfo = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName)); switch (Application.platform) { case RuntimePlatform.OSXPlayer: @@ -42,7 +42,7 @@ public static void StartWorkerNode() workerNode.StartInfo.UseShellExecute = false; workerNode.StartInfo.RedirectStandardError = true; workerNode.StartInfo.RedirectStandardOutput = true; - workerNode.StartInfo.Arguments = $"{isWorkerArg} -popupwindow -screen-width 100 -screen-height 100"; + workerNode.StartInfo.Arguments = $"{IsWorkerArg} -popupwindow -screen-width 100 -screen-height 100"; // workerNode.StartInfo.Arguments += " -deepprofiling"; // enable for deep profiling try { From 4ddcd259990a080eeef2072d0e444272c3156fdb Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Mon, 5 Jul 2021 18:54:54 -0400 Subject: [PATCH 05/19] Apply suggestions from code review Fixed some typos Co-authored-by: Matt Walsh <69258106+mattwalsh-unity@users.noreply.github.com> --- .../Helpers/BuildMultiprocessTestPlayer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 3e9d4d82d5..f7125cbc25 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -53,7 +53,7 @@ public static void DeleteBuild() } else { - Debug.Log($"exe {exePath} doesn't exists"); + Debug.Log($"exe {exePath} doesn't exist"); } break; case RuntimePlatform.OSXPlayer: @@ -65,7 +65,7 @@ public static void DeleteBuild() } else { - Debug.Log($"directory {toDelete} doesn't exists"); + Debug.Log($"directory {toDelete} doesn't exist"); } break; default: From 55e6853dcc81ed82ef666f818554521bd1090305 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 5 Jul 2021 18:55:36 -0400 Subject: [PATCH 06/19] Applying suggestions --- .../Helpers/BuildMultiprocessTestPlayer.cs | 6 ++---- .../Helpers/MultiprocessOrchestration.cs | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 94bc5a7dcf..88918f9950 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -10,7 +10,7 @@ /// This is needed as Unity throws "An abnormal situation has occurred: the PlayerLoop internal function has been called recursively. Please contact Customer Support with a sample project so that we can reproduce the problem and troubleshoot it." /// when trying to build from Setup() steps in tests. /// -public class BuildMultiprocessTestPlayer : MonoBehaviour +public static class BuildMultiprocessTestPlayer { public const string BuildAndExecuteMenuName = k_MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; private const string k_MultiprocessBaseMenuName = "MLAPI Multiprocess Test"; @@ -80,9 +80,7 @@ public static void DeleteBuild() public static bool Build(bool isDebug = false) { // Save standalone build path to file so we can read it from standalone tests (that are not running from editor) - var f = File.CreateText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName)); - f.Write(s_BuildPath); - f.Close(); + File.WriteAllText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName), s_BuildPath); // deleting so we don't end up testing on outdated builds if there's a build failure DeleteBuild(); diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs index 7977f9db57..31487b675b 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs @@ -16,6 +16,8 @@ public static void StartWorkerNode() var workerNode = new Process(); //TODO this should be replaced eventually by proper orchestration for all supported platforms + // Starting new local processes is a solution to help run perf tests locally. CI should have multi machine orchestration to + // run performance tests with more realistic conditions. string buildInstructions = $"You probably didn't generate your build. Please make sure you build a player using the '{BuildMultiprocessTestPlayer.BuildAndExecuteMenuName}' menu"; try { @@ -36,7 +38,8 @@ public static void StartWorkerNode() } catch (FileNotFoundException) { - throw new Exception($"Couldn't find build info file. {buildInstructions}"); + Debug.LogError($"Couldn't find build info file. {buildInstructions}"); + throw; } workerNode.StartInfo.UseShellExecute = false; From 72217122102a728f54f3cafc6e24c29faf169d99 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 5 Jul 2021 19:04:41 -0400 Subject: [PATCH 07/19] should be kept public for following PR --- .../Helpers/BuildMultiprocessTestPlayer.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 4a4023870f..0c017f18d7 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -12,13 +12,13 @@ /// public static class BuildMultiprocessTestPlayer { - public const string BuildAndExecuteMenuName = k_MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; - private const string k_MultiprocessBaseMenuName = "MLAPI Multiprocess Test"; - private const string k_MainSceneName = "MultiprocessTestingScene"; - private static string s_BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); + public const string MultiprocessBaseMenuName = "MLAPI Multiprocess Test"; + public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; + public const string MainSceneName = "MultiprocessTestingScene"; + public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); #if UNITY_EDITOR - [MenuItem(k_MultiprocessBaseMenuName+"/Build Test Player #t")] + [MenuItem(MultiprocessBaseMenuName+"/Build Test Player #t")] public static void BuildNoDebug() { var success = Build(); @@ -28,7 +28,7 @@ public static void BuildNoDebug() } } - [MenuItem(k_MultiprocessBaseMenuName+"/Build Test Player in debug mode")] + [MenuItem(MultiprocessBaseMenuName+"/Build Test Player in debug mode")] public static void BuildDebug() { var success = Build(true); @@ -38,14 +38,14 @@ public static void BuildDebug() } } - [MenuItem(k_MultiprocessBaseMenuName+"/Delete Test Build")] + [MenuItem(MultiprocessBaseMenuName+"/Delete Test Build")] public static void DeleteBuild() { switch (Application.platform) { case RuntimePlatform.WindowsPlayer: case RuntimePlatform.WindowsEditor: - var exePath = $"{s_BuildPath}.exe"; + var exePath = $"{BuildPath}.exe"; if (File.Exists(exePath)) { File.Delete(exePath); @@ -57,7 +57,7 @@ public static void DeleteBuild() break; case RuntimePlatform.OSXPlayer: case RuntimePlatform.OSXEditor: - var toDelete = s_BuildPath + ".app"; + var toDelete = BuildPath + ".app"; if (Directory.Exists(toDelete)) { Directory.Delete(toDelete, recursive: true); @@ -80,7 +80,7 @@ public static void DeleteBuild() public static bool Build(bool isDebug = false) { // Save standalone build path to file so we can read it from standalone tests (that are not running from editor) - File.WriteAllText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName), s_BuildPath); + File.WriteAllText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName), BuildPath); // deleting so we don't end up testing on outdated builds if there's a build failure DeleteBuild(); @@ -95,7 +95,7 @@ public static bool Build(bool isDebug = false) // will have more connection permission popups when launching though } - var buildPathToUse = s_BuildPath; + var buildPathToUse = BuildPath; if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor) { buildPathToUse += ".exe"; @@ -103,7 +103,7 @@ public static bool Build(bool isDebug = false) buildOptions &= ~BuildOptions.AutoRunPlayer; var buildReport = BuildPipeline.BuildPlayer( - new[] { $"Assets/Scenes/{k_MainSceneName}.unity" }, + new[] { $"Assets/Scenes/{MainSceneName}.unity" }, buildPathToUse, EditorUserBuildSettings.activeBuildTarget, buildOptions); From f6309e9cf78b1c962bdc6925d1f5cb0bb7fcb7e7 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 6 Jul 2021 15:08:22 +0100 Subject: [PATCH 08/19] fix/cleanup asmdefs again --- ...nity.multiplayer.mlapi.runtimetests.asmdef | 6 ++++-- .../Runtime/testproject.runtimetests.asmdef | 20 +++++-------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef b/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef index da062e7cb9..6f899c67cc 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/com.unity.multiplayer.mlapi.runtimetests.asmdef @@ -8,6 +8,8 @@ "optionalUnityReferences": [ "TestAssemblies" ], - "includePlatforms": [], - "excludePlatforms": [] + "defineConstraints": [ + "UNITY_INCLUDE_TESTS", + "UNITY_EDITOR" + ] } \ No newline at end of file diff --git a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef index 45c640863c..abe114e619 100644 --- a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef +++ b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef @@ -1,25 +1,15 @@ { "name": "TestProject.RuntimeTests", - "rootNamespace": "", "references": [ - "Unity.Multiplayer.MLAPI.Runtime", - "Unity.Multiplayer.MLAPI.RuntimeTests", "TestProject.ManualTests", - "UnityEngine.TestRunner", - "UnityEditor.TestRunner" + "Unity.Multiplayer.MLAPI.Runtime", + "Unity.Multiplayer.MLAPI.RuntimeTests" ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll" + "optionalUnityReferences": [ + "TestAssemblies" ], - "autoReferenced": false, "defineConstraints": [ "UNITY_INCLUDE_TESTS", "UNITY_EDITOR" - ], - "versionDefines": [], - "noEngineReferences": false + ] } \ No newline at end of file From cd809ec13ee5a3566d010b8b5963400465f589f5 Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Tue, 6 Jul 2021 14:07:36 -0400 Subject: [PATCH 09/19] Apply suggestions from code review Co-authored-by: M. Fatih MAR --- .../MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs index 31487b675b..c5eb6f9893 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs @@ -33,7 +33,7 @@ public static void StartWorkerNode() workerNode.StartInfo.FileName = $"{buildInfo}.exe"; break; default: - throw new NotImplementedException("StartWorkerNode: Current platform not supported"); + throw new NotImplementedException($"{nameof(StartWorkerNode)}: Current platform is not supported"); } } catch (FileNotFoundException) @@ -52,7 +52,7 @@ public static void StartWorkerNode() var newProcessStarted = workerNode.Start(); if (!newProcessStarted) { - throw new Exception("Process not started!"); + throw new Exception("Failed to start process!"); } } catch (Win32Exception e) From 29e05bb500a4a1737a3ad6c6fac08d1cb462a6b0 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 8 Jul 2021 10:06:34 +0100 Subject: [PATCH 10/19] no longer ignore '[Ss]treamingAssets/buildInfo.txt' --- testproject/.gitignore | 3 --- testproject/Assets/Scenes.meta | 8 ++++++++ testproject/Assets/Tests/Runtime/MultiprocessRuntime.meta | 8 ++++++++ .../Assets/Tests/Runtime/MultiprocessRuntime/Helpers.meta | 8 ++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 testproject/Assets/Scenes.meta create mode 100644 testproject/Assets/Tests/Runtime/MultiprocessRuntime.meta create mode 100644 testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers.meta diff --git a/testproject/.gitignore b/testproject/.gitignore index aee9c94cdb..acbbe841e6 100644 --- a/testproject/.gitignore +++ b/testproject/.gitignore @@ -70,7 +70,4 @@ crashlytics-build.properties /[Aa]ssets/[Ss]treamingAssets/aa.meta /[Aa]ssets/[Ss]treamingAssets/aa/* -/[Aa]ssets/[Ss]treamingAssets/buildInfo.txt -/[Aa]ssets/[Ss]treamingAssets/buildInfo.txt.meta - InitTestScene* diff --git a/testproject/Assets/Scenes.meta b/testproject/Assets/Scenes.meta new file mode 100644 index 0000000000..3b475ec820 --- /dev/null +++ b/testproject/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6274e6e608eb41f2ace27f3a117474d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime.meta b/testproject/Assets/Tests/Runtime/MultiprocessRuntime.meta new file mode 100644 index 0000000000..6e70f368f6 --- /dev/null +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f415999c439ee4394bfb822a0fa30051 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers.meta b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers.meta new file mode 100644 index 0000000000..24050f230a --- /dev/null +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9c9a4d019af9478d9fcebc1ba79d771 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From ed2519c1f0ff8966ba23c8d880f5e0352f5f5d98 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 8 Jul 2021 10:16:10 -0400 Subject: [PATCH 11/19] PR suggestions --- .../Helpers/BuildMultiprocessTestPlayer.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 0c017f18d7..69d0323f3f 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -13,28 +13,28 @@ public static class BuildMultiprocessTestPlayer { public const string MultiprocessBaseMenuName = "MLAPI Multiprocess Test"; - public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; + public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build Test Player #t"; public const string MainSceneName = "MultiprocessTestingScene"; public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); #if UNITY_EDITOR - [MenuItem(MultiprocessBaseMenuName+"/Build Test Player #t")] + [MenuItem(BuildAndExecuteMenuName)] public static void BuildNoDebug() { - var success = Build(); - if (!success) + var report = BuildPlayer(); + if (report.summary.result != BuildResult.Succeeded) { - throw new Exception("Build failed!"); + throw new Exception($"Build failed! {report.summary.totalErrors} errors, {report.summary}"); } } - [MenuItem(MultiprocessBaseMenuName+"/Build Test Player in debug mode")] + [MenuItem(MultiprocessBaseMenuName + "/Build Test Player in debug mode")] public static void BuildDebug() { - var success = Build(true); - if (!success) + var report = BuildPlayer(true); + if (report.summary.result != BuildResult.Succeeded) { - throw new Exception("Build failed!"); + throw new Exception($"Build failed! {report.summary.totalErrors} errors, {report.summary}"); } } @@ -77,7 +77,7 @@ public static void DeleteBuild() /// reporting. We only want to main node to do that, worker nodes should be dumb /// /// - public static bool Build(bool isDebug = false) + public static BuildReport BuildPlayer(bool isDebug = false) { // Save standalone build path to file so we can read it from standalone tests (that are not running from editor) File.WriteAllText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName), BuildPath); @@ -108,7 +108,7 @@ public static bool Build(bool isDebug = false) EditorUserBuildSettings.activeBuildTarget, buildOptions); - return buildReport.summary.result == BuildResult.Succeeded; + return buildReport; } #endif } From b08561a2cef3d8c01f1f2744f42ef528ba72c5fd Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Thu, 8 Jul 2021 11:00:24 -0400 Subject: [PATCH 12/19] changing root menu Co-authored-by: M. Fatih MAR --- .../MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 0c017f18d7..34e680c80d 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -12,7 +12,7 @@ /// public static class BuildMultiprocessTestPlayer { - public const string MultiprocessBaseMenuName = "MLAPI Multiprocess Test"; + public const string MultiprocessBaseMenuName = "MLAPI/Multiprocess Test"; public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; public const string MainSceneName = "MultiprocessTestingScene"; public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); From 1c9fb6cd007051e935b5fa0c487f06840246e489 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 8 Jul 2021 12:01:18 -0400 Subject: [PATCH 13/19] # --- .../MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 69d0323f3f..fad39655a7 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -77,7 +77,7 @@ public static void DeleteBuild() /// reporting. We only want to main node to do that, worker nodes should be dumb /// /// - public static BuildReport BuildPlayer(bool isDebug = false) + private static BuildReport BuildPlayer(bool isDebug = false) { // Save standalone build path to file so we can read it from standalone tests (that are not running from editor) File.WriteAllText(Path.Combine(Application.streamingAssetsPath, MultiprocessOrchestration.BuildInfoFileName), BuildPath); From c6d3b4a61ad9eaae1faf28ad0d6e70d511b7bdf6 Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Thu, 8 Jul 2021 14:27:36 -0400 Subject: [PATCH 14/19] rename test scene Co-authored-by: M. Fatih MAR --- .../MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 34e680c80d..0904a7485a 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -14,7 +14,7 @@ public static class BuildMultiprocessTestPlayer { public const string MultiprocessBaseMenuName = "MLAPI/Multiprocess Test"; public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build - Execute multiprocess tests #%t"; - public const string MainSceneName = "MultiprocessTestingScene"; + public const string MainSceneName = "MultiprocessTestScene"; public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); #if UNITY_EDITOR From 2aa372b5d4cbe03fb0363740cfb0f0965c0e2242 Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Thu, 8 Jul 2021 14:30:28 -0400 Subject: [PATCH 15/19] Update testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs Co-authored-by: M. Fatih MAR --- .../Helpers/BuildMultiprocessTestPlayer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 0904a7485a..365e0b3408 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -57,14 +57,14 @@ public static void DeleteBuild() break; case RuntimePlatform.OSXPlayer: case RuntimePlatform.OSXEditor: - var toDelete = BuildPath + ".app"; - if (Directory.Exists(toDelete)) + var appPath = BuildPath + ".app"; + if (Directory.Exists(appPath)) { - Directory.Delete(toDelete, recursive: true); + Directory.Delete(appPath, recursive: true); } else { - Debug.Log($"directory {toDelete} doesn't exist"); + Debug.Log($"[{nameof(BuildMultiprocessTestPlayer)}] MacOS build does not exist ({appPath})"); } break; default: From 90fffe4ba7edbac100c605946d09aa6070210def Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 8 Jul 2021 15:00:53 -0400 Subject: [PATCH 16/19] # --- .../Helpers/BuildMultiprocessTestPlayer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 2d14b4b44e..a6c5378122 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -15,7 +15,7 @@ public static class BuildMultiprocessTestPlayer public const string MultiprocessBaseMenuName = "MLAPI/Multiprocess Test"; public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build Test Player #t"; public const string MainSceneName = "MultiprocessTestScene"; - public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTestBuild"); + public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTests/MultiprocessTestBuild"); #if UNITY_EDITOR [MenuItem(BuildAndExecuteMenuName)] @@ -24,7 +24,7 @@ public static void BuildNoDebug() var report = BuildPlayer(); if (report.summary.result != BuildResult.Succeeded) { - throw new Exception($"Build failed! {report.summary.totalErrors} errors, {report.summary}"); + throw new Exception($"Build failed! {report.summary.totalErrors} errors"); } } @@ -34,7 +34,7 @@ public static void BuildDebug() var report = BuildPlayer(true); if (report.summary.result != BuildResult.Succeeded) { - throw new Exception($"Build failed! {report.summary.totalErrors} errors, {report.summary}"); + throw new Exception($"Build failed! {report.summary.totalErrors} errors"); } } From 2c915e92a9ca644db6af7cfa94abade02529b576 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 8 Jul 2021 15:16:56 -0400 Subject: [PATCH 17/19] simpler flow --- .../Helpers/BuildMultiprocessTestPlayer.cs | 38 +++++-------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index a6c5378122..a9b3d7ecf5 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -15,7 +15,8 @@ public static class BuildMultiprocessTestPlayer public const string MultiprocessBaseMenuName = "MLAPI/Multiprocess Test"; public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build Test Player #t"; public const string MainSceneName = "MultiprocessTestScene"; - public static string BuildPath => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTests/MultiprocessTestBuild"); + public static string BuildPathDirectory => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTests"); + public static string BuildPath => Path.Combine(BuildPathDirectory, "/MultiprocessTestBuild"); #if UNITY_EDITOR [MenuItem(BuildAndExecuteMenuName)] @@ -38,37 +39,16 @@ public static void BuildDebug() } } - [MenuItem(MultiprocessBaseMenuName+"/Delete Test Build")] + [MenuItem(MultiprocessBaseMenuName + "/Delete Test Build")] public static void DeleteBuild() { - switch (Application.platform) + if (Directory.Exists(BuildPathDirectory)) { - case RuntimePlatform.WindowsPlayer: - case RuntimePlatform.WindowsEditor: - var exePath = $"{BuildPath}.exe"; - if (File.Exists(exePath)) - { - File.Delete(exePath); - } - else - { - Debug.Log($"exe {exePath} doesn't exist"); - } - break; - case RuntimePlatform.OSXPlayer: - case RuntimePlatform.OSXEditor: - var appPath = BuildPath + ".app"; - if (Directory.Exists(appPath)) - { - Directory.Delete(appPath, recursive: true); - } - else - { - Debug.Log($"[{nameof(BuildMultiprocessTestPlayer)}] MacOS build does not exist ({appPath})"); - } - break; - default: - throw new NotImplementedException(); + Directory.Delete(BuildPathDirectory, recursive: true); + } + else + { + Debug.Log($"[{nameof(BuildMultiprocessTestPlayer)}] build directory does not exist ({BuildPathDirectory}) not deleting anything"); } } From 9a3bd9b9b698955ad47384fe09d136965d2210ae Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 8 Jul 2021 15:30:03 -0400 Subject: [PATCH 18/19] fixes --- .../Helpers/BuildMultiprocessTestPlayer.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index a9b3d7ecf5..3449a4d658 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -15,8 +15,8 @@ public static class BuildMultiprocessTestPlayer public const string MultiprocessBaseMenuName = "MLAPI/Multiprocess Test"; public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build Test Player #t"; public const string MainSceneName = "MultiprocessTestScene"; - public static string BuildPathDirectory => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds/MultiprocessTests"); - public static string BuildPath => Path.Combine(BuildPathDirectory, "/MultiprocessTestBuild"); + private static string BuildPathDirectory => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds","MultiprocessTests"); + public static string BuildPath => Path.Combine(BuildPathDirectory, "MultiprocessTestPlayer"); #if UNITY_EDITOR [MenuItem(BuildAndExecuteMenuName)] @@ -80,6 +80,7 @@ private static BuildReport BuildPlayer(bool isDebug = false) { buildPathToUse += ".exe"; } + Debug.Log($"Starting multiprocess player build using path {buildPathToUse}"); buildOptions &= ~BuildOptions.AutoRunPlayer; var buildReport = BuildPipeline.BuildPlayer( @@ -88,6 +89,7 @@ private static BuildReport BuildPlayer(bool isDebug = false) EditorUserBuildSettings.activeBuildTarget, buildOptions); + Debug.Log($"done building"); return buildReport; } #endif From 49d90b4a2ced008844ebd7fa33ff0c6d7686d2ef Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 8 Jul 2021 22:08:58 +0100 Subject: [PATCH 19/19] minor touch --- .../Helpers/BuildMultiprocessTestPlayer.cs | 6 +++--- .../Helpers/MultiprocessOrchestration.cs | 21 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs index 3449a4d658..77f877a115 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs @@ -20,7 +20,7 @@ public static class BuildMultiprocessTestPlayer #if UNITY_EDITOR [MenuItem(BuildAndExecuteMenuName)] - public static void BuildNoDebug() + public static void BuildRelease() { var report = BuildPlayer(); if (report.summary.result != BuildResult.Succeeded) @@ -29,7 +29,7 @@ public static void BuildNoDebug() } } - [MenuItem(MultiprocessBaseMenuName + "/Build Test Player in debug mode")] + [MenuItem(MultiprocessBaseMenuName + "/Build Test Player (Debug)")] public static void BuildDebug() { var report = BuildPlayer(true); @@ -89,7 +89,7 @@ private static BuildReport BuildPlayer(bool isDebug = false) EditorUserBuildSettings.activeBuildTarget, buildOptions); - Debug.Log($"done building"); + Debug.Log("Build finished"); return buildReport; } #endif diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs index c5eb6f9893..b09ee09914 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs @@ -2,7 +2,6 @@ using System.ComponentModel; using System.Diagnostics; using System.IO; -using UnityEditor; using UnityEngine; using Debug = UnityEngine.Debug; @@ -13,7 +12,7 @@ public class MultiprocessOrchestration public static void StartWorkerNode() { - var workerNode = new Process(); + var workerProcess = new Process(); //TODO this should be replaced eventually by proper orchestration for all supported platforms // Starting new local processes is a solution to help run perf tests locally. CI should have multi machine orchestration to @@ -26,11 +25,11 @@ public static void StartWorkerNode() { case RuntimePlatform.OSXPlayer: case RuntimePlatform.OSXEditor: - workerNode.StartInfo.FileName = $"{buildInfo}.app/Contents/MacOS/testproject"; + workerProcess.StartInfo.FileName = $"{buildInfo}.app/Contents/MacOS/testproject"; break; case RuntimePlatform.WindowsPlayer: case RuntimePlatform.WindowsEditor: - workerNode.StartInfo.FileName = $"{buildInfo}.exe"; + workerProcess.StartInfo.FileName = $"{buildInfo}.exe"; break; default: throw new NotImplementedException($"{nameof(StartWorkerNode)}: Current platform is not supported"); @@ -38,21 +37,21 @@ public static void StartWorkerNode() } catch (FileNotFoundException) { - Debug.LogError($"Couldn't find build info file. {buildInstructions}"); + Debug.LogError($"Could not find build info file. {buildInstructions}"); throw; } - workerNode.StartInfo.UseShellExecute = false; - workerNode.StartInfo.RedirectStandardError = true; - workerNode.StartInfo.RedirectStandardOutput = true; - workerNode.StartInfo.Arguments = $"{IsWorkerArg} -popupwindow -screen-width 100 -screen-height 100"; + workerProcess.StartInfo.UseShellExecute = false; + workerProcess.StartInfo.RedirectStandardError = true; + workerProcess.StartInfo.RedirectStandardOutput = true; + workerProcess.StartInfo.Arguments = $"{IsWorkerArg} -popupwindow -screen-width 100 -screen-height 100"; // workerNode.StartInfo.Arguments += " -deepprofiling"; // enable for deep profiling try { - var newProcessStarted = workerNode.Start(); + var newProcessStarted = workerProcess.Start(); if (!newProcessStarted) { - throw new Exception("Failed to start process!"); + throw new Exception("Failed to start worker process!"); } } catch (Win32Exception e)