コード例 #1
0
        public void GetBuildArtifact_ReturnNull_WithWrongType()
        {
            var result = BuildPipelineResult.Success(m_BuildPipeline, m_BuildSettings);

            BuildArtifacts.Store(result, new[] { new TestArtifacts() });
            Assert.That(BuildArtifacts.GetBuildArtifact <TestArtifacts2>(m_BuildSettings), Is.Null);
        }
コード例 #2
0
        public void GetBuildArtifact()
        {
            var result = BuildPipelineResult.Success(m_BuildPipeline, m_BuildSettings);

            BuildArtifacts.Store(result, new[] { new TestArtifacts() });
            Assert.That(BuildArtifacts.GetBuildArtifact <TestArtifacts>(m_BuildSettings), Is.Not.Null);
        }
コード例 #3
0
        public void WhenNestedBuildPipelineFails_ParentBuildPipelineFails()
        {
            var nestedPipeline = BuildPipeline.CreateInstance((p) =>
            {
                p.BuildSteps.Add(new TestBuildStep1());
                p.BuildSteps.Add(new TestBuildStep2());
                p.BuildSteps.Add(new TestBuildStep3());
            });
            var pipeline = BuildPipeline.CreateInstance(p => p.BuildSteps.Add(nestedPipeline));
            var settings = BuildSettings.CreateInstance();
            var result   = pipeline.Build(settings, mutator: (context) =>
            {
                context.SetValue(new TestBuildStep1.Data {
                    Value = nameof(TestBuildStep1)
                });
                // Here we make TestStep2 fails by not providing its data
                context.SetValue(new TestBuildStep3.Data {
                    Value = nameof(TestBuildStep3)
                });
            });

            Assert.That(result.Succeeded, Is.False);
            Assert.That(result.BuildStepsResults.Any(r => r.Failed), Is.True);

            var artifacts = BuildArtifacts.GetBuildArtifact <TestBuildArtifacts>(settings);

            Assert.That(artifacts, Is.Not.Null);
            Assert.That(artifacts.BuildStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep1), nameof(TestBuildStep2)
            }));
            Assert.That(artifacts.CleanupStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep2), nameof(TestBuildStep1)
            }));
        }
コード例 #4
0
        public void GetBuildArtifact_NoCache_IsValid()
        {
            var file = new DirectoryInfo(BuildArtifacts.BaseDirectory).GetFile($"{m_BuildConfiguration.name}.json");

            file.WriteAllText($"{{ \"Result\": null, \"Artifacts\": [{{ \"$type\": {typeof(TestBuildArtifactB).GetAssemblyQualifiedTypeName().DoubleQuotes()} }}] }}");
            Assert.That(BuildArtifacts.GetBuildArtifact <TestBuildArtifactB>(m_BuildConfiguration), Is.Not.Null);
        }
コード例 #5
0
        public void DisabledBuildSteps_DoesNotRun()
        {
            var pipeline = BuildPipeline.CreateInstance((p) =>
            {
                p.BuildSteps.Add(new TestBuildStep1());
                p.BuildSteps.Add(new TestBuildStep2(enabled: false));
                p.BuildSteps.Add(new TestBuildStep3());
            });
            var settings = BuildSettings.CreateInstance();
            var result   = pipeline.Build(settings, mutator: (context) =>
            {
                context.SetValue(new TestBuildStep1.Data {
                    Value = nameof(TestBuildStep1)
                });
                context.SetValue(new TestBuildStep2.Data {
                    Value = nameof(TestBuildStep2)
                });
                context.SetValue(new TestBuildStep3.Data {
                    Value = nameof(TestBuildStep3)
                });
            });

            Assert.That(result.Succeeded, Is.True);
            Assert.That(result.BuildStepsResults.Any(r => r.Failed), Is.False);

            var artifacts = BuildArtifacts.GetBuildArtifact <TestBuildArtifacts>(settings);

            Assert.That(artifacts, Is.Not.Null);
            Assert.That(artifacts.BuildStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep1), nameof(TestBuildStep3)
            }));
            Assert.That(artifacts.CleanupStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep3), nameof(TestBuildStep1)
            }));
        }
コード例 #6
0
        public void Build_DisabledBuildSteps_DoesNotRun()
        {
            var pipeline = BuildPipeline.CreateInstance((p) =>
            {
                p.BuildSteps.Add(new TestBuildStep1());
                p.BuildSteps.Add(new TestBuildStep2(enabled: false));
                p.BuildSteps.Add(new TestBuildStep3());
            });
            var config = BuildConfiguration.CreateInstance(c => c.SetComponent(new TestRequiredComponentA()));
            var result = pipeline.Build(config, mutator: (context) =>
            {
                context.SetValue(new TestBuildStep1.Data {
                    Value = nameof(TestBuildStep1)
                });
                context.SetValue(new TestBuildStep2.Data {
                    Value = nameof(TestBuildStep2)
                });
                context.SetValue(new TestBuildStep3.Data {
                    Value = nameof(TestBuildStep3)
                });
            });

            Assert.That(result.Succeeded, Is.True);
            Assert.That(result.BuildStepsResults.Any(r => r.Failed), Is.False);

            var artifacts = BuildArtifacts.GetBuildArtifact <TestArtifactA>(config);

            Assert.That(artifacts, Is.Not.Null);
            Assert.That(artifacts.BuildStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep1), nameof(TestBuildStep3)
            }));
            Assert.That(artifacts.CleanupStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep3), nameof(TestBuildStep1)
            }));
        }
コード例 #7
0
 public void GetBuildArtifact_WithoutBuildArtifacts_IsNull()
 {
     var result = BuildResult.Success(m_BuildPipeline, m_BuildConfiguration);
     BuildArtifacts.Store(result, new IBuildArtifact[] { });
     Assert.That(File.Exists(BuildArtifacts.GetArtifactPath(m_BuildConfiguration)), Is.True);
     Assert.That(BuildArtifacts.GetBuildArtifact<TestBuildArtifactA>(m_BuildConfiguration), Is.Null);
 }
コード例 #8
0
 public void GetBuildArtifact_NoCache_WithDeserializeError_IsNull()
 {
     var file = new DirectoryInfo(BuildArtifacts.BaseDirectory).GetFile($"{m_BuildConfiguration.name}.json");
     file.WriteAllText("{ \"Result\": null, \"Artifacts\": [{ \"$type\": \"Some.Unknown.Assembly.Type, Some.Unknown.Assembly\" }] }");
     LogAssert.Expect(UnityEngine.LogType.Error, new Regex(@"Failed to deserialize.*:\n.*"));
     Assert.That(BuildArtifacts.GetBuildArtifact<TestBuildArtifactB>(m_BuildConfiguration), Is.Null);
 }
コード例 #9
0
        public override bool CanRun(BuildSettings settings, out string reason)
        {
            var artifact = BuildArtifacts.GetBuildArtifact <BuildArtifactDesktop>(settings);

            if (artifact == null)
            {
                reason = $"Could not retrieve build artifact '{nameof(BuildArtifactDesktop)}'.";
                return(false);
            }

            if (artifact.OutputTargetFile == null)
            {
                reason = $"{nameof(BuildArtifactDesktop.OutputTargetFile)} is null.";
                return(false);
            }

#if UNITY_EDITOR_OSX
            // On macOS, the output target is a .app directory structure
            if (!Directory.Exists(artifact.OutputTargetFile.FullName))
#else
            if (!File.Exists(artifact.OutputTargetFile.FullName))
#endif
            {
                reason = $"Output target file '{artifact.OutputTargetFile.FullName}' not found.";
                return(false);
            }

            reason = null;
            return(true);
        }
コード例 #10
0
        public void WhenBuildFails_BuildStepsStopAtFailure_CleanupStepsStopAtFailure()
        {
            var pipeline = BuildPipeline.CreateInstance((p) =>
            {
                p.BuildSteps.Add(new TestBuildStep1());
                p.BuildSteps.Add(new TestBuildStep2());
                p.BuildSteps.Add(new TestBuildStep3());
            });
            var config = BuildConfiguration.CreateInstance(c => c.SetComponent(new TestRequiredComponentA()));
            var result = pipeline.Build(config, mutator: (context) =>
            {
                context.SetValue(new TestBuildStep1.Data {
                    Value = nameof(TestBuildStep1)
                });
                // Here we make TestStep2 fails by not providing its data
                context.SetValue(new TestBuildStep3.Data {
                    Value = nameof(TestBuildStep3)
                });
            });

            Assert.That(result.Succeeded, Is.False);
            Assert.That(result.BuildStepsResults.Any(r => r.Failed), Is.True);

            var artifacts = BuildArtifacts.GetBuildArtifact <TestArtifactA>(config);

            Assert.That(artifacts, Is.Not.Null);
            Assert.That(artifacts.BuildStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep1), nameof(TestBuildStep2)
            }));
            Assert.That(artifacts.CleanupStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep2), nameof(TestBuildStep1)
            }));
        }
コード例 #11
0
 public void GetBuildArtifact_WithBuildArtifactTypeNotFound_IsNull()
 {
     var result = BuildResult.Success(m_BuildPipeline, m_BuildConfiguration);
     BuildArtifacts.Store(result, new[] { new TestBuildArtifactA() });
     Assert.That(File.Exists(BuildArtifacts.GetArtifactPath(m_BuildConfiguration)), Is.True);
     Assert.That(BuildArtifacts.GetBuildArtifact<TestBuildArtifactB>(m_BuildConfiguration), Is.Null);
 }
コード例 #12
0
        public void WhenBuildSucceeds_AllBuildStepsAndCleanupStepsRan()
        {
            var pipeline = BuildPipeline.CreateInstance((p) =>
            {
                p.BuildSteps.Add(new TestBuildStep1());
                p.BuildSteps.Add(new TestBuildStep2());
                p.BuildSteps.Add(new TestBuildStep3());
            });
            var config = BuildConfiguration.CreateInstance(c => c.SetComponent(new TestRequiredComponentA()));
            var result = pipeline.Build(config, mutator: (context) =>
            {
                context.SetValue(new TestBuildStep1.Data {
                    Value = nameof(TestBuildStep1)
                });
                context.SetValue(new TestBuildStep2.Data {
                    Value = nameof(TestBuildStep2)
                });
                context.SetValue(new TestBuildStep3.Data {
                    Value = nameof(TestBuildStep3)
                });
            });
            var artifacts = BuildArtifacts.GetBuildArtifact <TestArtifactA>(config);

            Assert.That(artifacts, Is.Not.Null);
            Assert.That(artifacts.BuildStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep1), nameof(TestBuildStep2), nameof(TestBuildStep3)
            }));
            Assert.That(artifacts.CleanupStepsRan, Is.EqualTo(new List <string> {
                nameof(TestBuildStep3), nameof(TestBuildStep2), nameof(TestBuildStep1)
            }));
        }
コード例 #13
0
        public void GetBuildArtifact_IsValid()
        {
            var result = BuildPipelineResult.Success(m_BuildPipeline, m_BuildConfiguration);

            BuildArtifacts.Store(result, new[] { new TestArtifactA() });
            Assert.That(File.Exists(BuildArtifacts.GetArtifactPath(m_BuildConfiguration)), Is.True);
            Assert.That(BuildArtifacts.GetBuildArtifact <TestArtifactA>(m_BuildConfiguration), Is.Not.Null);
        }
コード例 #14
0
        public override RunStepResult Start(BuildSettings settings)
        {
            var artifact = BuildArtifacts.GetBuildArtifact <BuildArtifactDesktop>(settings);
            var fileName = artifact.OutputTargetFile.FullName;

            if (Path.GetExtension(fileName) != ".apk")
            {
                return(Failure(settings, $"Expected .apk in path, but got '{fileName}'."));
            }

            var path = $"\"{Path.GetFullPath(fileName)}\"";

#if UNITY_ANDROID
            EditorUtility.DisplayProgressBar("Installing", $"Installing {path}", 0.3f);
            var adb = ADB.GetInstance();
            try
            {
                adb.Run(new[] { "install", "-r", "-d", path }, $"Failed to install '{fileName}'");
            }
            catch (Exception ex)
            {
                EditorUtility.ClearProgressBar();
                return(Failure(settings, ex.Message));
            }

            UnityEngine.Debug.Log($"{path} successfully installed.");
            var runTarget = $"\"{PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android)}/com.unity3d.player.UnityPlayerActivity\"";
            EditorUtility.DisplayProgressBar("Launching", $"Launching {runTarget}", 0.6f);
            try
            {
                adb.Run(new[]
                {
                    "shell", "am", "start",
                    "-a", "android.intent.action.MAIN",
                    "-c", "android.intent.category.LAUNCHER",
                    "-f", "0x10200000",
                    "-S",
                    "-n", runTarget
                },
                        $"Failed to launch {runTarget}");
            }
            catch (Exception ex)
            {
                EditorUtility.ClearProgressBar();
                return(Failure(settings, ex.Message));
            }

            UnityEngine.Debug.Log($"{runTarget} successfully launched.");
            EditorUtility.ClearProgressBar();
            return(Success(settings, new RunInstanceAndroid()));
#else
            return(Failure(settings, $"Active Editor platform has to be set to Android."));
#endif
        }
コード例 #15
0
        public void GetBuildArtifact_FileDeleted_IsNull()
        {
            var result = BuildResult.Success(m_BuildPipeline, m_BuildConfiguration);
            BuildArtifacts.Store(result, new[] { new TestBuildArtifactA() });

            var artifactPath = BuildArtifacts.GetArtifactPath(m_BuildConfiguration);
            Assert.That(File.Exists(artifactPath), Is.True);

            File.Delete(artifactPath);
            Assert.That(BuildArtifacts.GetBuildArtifact<TestBuildArtifactA>(m_BuildConfiguration), Is.Null);
        }
コード例 #16
0
        public override RunStepResult Start(BuildSettings settings)
        {
            var artifact = BuildArtifacts.GetBuildArtifact <DotsRuntimeBuildArtifact>(settings);
            var profile  = settings.GetComponent <DotsRuntimeBuildProfile>();

            if (!profile.Target.Run(artifact.OutputTargetFile))
            {
                return(RunStepResult.Failure(settings, this, $"Failed to start build target {profile.Target.DisplayName} at '{artifact.OutputTargetFile.FullName}'."));
            }

            //@TODO: BuildTarget.Run should return the process, so we can store it in DotsRuntimeRunInstance
            return(RunStepResult.Success(settings, this, new DotsRuntimeRunInstance()));
        }
コード例 #17
0
        public override bool CanRun(BuildSettings settings, out string reason)
        {
            var artifact = BuildArtifacts.GetBuildArtifact <BuildArtifactDesktop>(settings);

            if (artifact == null)
            {
                reason = $"Could not retrieve build artifact '{nameof(BuildArtifactDesktop)}'.";
                return(false);
            }

            if (artifact.OutputTargetFile == null)
            {
                reason = $"{nameof(BuildArtifactDesktop.OutputTargetFile)} is null.";
                return(false);
            }

            reason = null;
            return(true);
        }
コード例 #18
0
        public override RunStepResult Start(BuildSettings settings)
        {
            var artifact = BuildArtifacts.GetBuildArtifact <BuildArtifactDesktop>(settings);
            var process  = new Process();

#if UNITY_EDITOR_OSX
            process.StartInfo.FileName  = "open";
            process.StartInfo.Arguments = '\"' + artifact.OutputTargetFile.FullName.Trim('\"') + '\"';
#else
            process.StartInfo.FileName = artifact.OutputTargetFile.FullName;
#endif
            process.StartInfo.WorkingDirectory = artifact.OutputTargetFile.Directory?.FullName ?? string.Empty;
            process.StartInfo.CreateNoWindow   = true;
            process.StartInfo.UseShellExecute  = true;

            if (!process.Start())
            {
                return(Failure(settings, $"Failed to start process at '{process.StartInfo.FileName}'."));
            }

            return(Success(settings, new RunInstanceDesktop(process)));
        }
コード例 #19
0
        public override bool CanRun(BuildSettings settings, out string reason)
        {
            var artifact = BuildArtifacts.GetBuildArtifact <DotsRuntimeBuildArtifact>(settings);

            if (artifact == null)
            {
                reason = $"Could not retrieve build artifact '{nameof(DotsRuntimeBuildArtifact)}'.";
                return(false);
            }

            if (artifact.OutputTargetFile == null)
            {
                reason = $"{nameof(DotsRuntimeBuildArtifact.OutputTargetFile)} is null.";
                return(false);
            }

            if (!File.Exists(artifact.OutputTargetFile.FullName))
            {
                reason = $"Output target file '{artifact.OutputTargetFile.FullName}' not found.";
                return(false);
            }

            if (!settings.TryGetComponent <DotsRuntimeBuildProfile>(out var profile))
            {
                reason = $"Could not retrieve component '{nameof(DotsRuntimeBuildProfile)}'.";
                return(false);
            }

            if (profile.Target == null)
            {
                reason = $"{nameof(DotsRuntimeBuildProfile)} target is null.";
                return(false);
            }

            reason = null;
            return(true);
        }
コード例 #20
0
 public void GetBuildArtifact_DoesNotThrow_WhenNullBuildSettingsPassed()
 {
     Assert.DoesNotThrow(() => BuildArtifacts.GetBuildArtifact <IBuildArtifact>(null));
 }
コード例 #21
0
 public void GetBuildArtifact_WithInvalidType_IsNull()
 {
     Assert.That(BuildArtifacts.GetBuildArtifact(m_BuildConfiguration, typeof(TestBuildArtifactInvalid)), Is.Null);
 }
コード例 #22
0
 public void GetBuildArtifact_WithNullType_IsNull()
 {
     Assert.That(BuildArtifacts.GetBuildArtifact(m_BuildConfiguration, null), Is.Null);
 }
コード例 #23
0
 public void GetBuildArtifact_WithoutBuildConfiguration_IsNull()
 {
     Assert.That(BuildArtifacts.GetBuildArtifact <IBuildArtifact>(null), Is.Null);
 }
コード例 #24
0
 public void GetBuildArtifact_NoCache_WithDeserializeException_IsNull()
 {
     new DirectoryInfo(BuildArtifacts.BaseDirectory).GetFile($"{m_BuildConfiguration.name}.json").WriteAllText("12345");
     LogAssert.Expect(UnityEngine.LogType.Error, new Regex(@"Failed to deserialize.*:\n.*"));
     Assert.That(BuildArtifacts.GetBuildArtifact <TestBuildArtifactB>(m_BuildConfiguration), Is.Null);
 }