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); }
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); }
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) })); }
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); }
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) })); }
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) })); }
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); }
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); }
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); }
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) })); }
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); }
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) })); }
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); }
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 }
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); }
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())); }
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); }
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))); }
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); }
public void GetBuildArtifact_DoesNotThrow_WhenNullBuildSettingsPassed() { Assert.DoesNotThrow(() => BuildArtifacts.GetBuildArtifact <IBuildArtifact>(null)); }
public void GetBuildArtifact_WithInvalidType_IsNull() { Assert.That(BuildArtifacts.GetBuildArtifact(m_BuildConfiguration, typeof(TestBuildArtifactInvalid)), Is.Null); }
public void GetBuildArtifact_WithNullType_IsNull() { Assert.That(BuildArtifacts.GetBuildArtifact(m_BuildConfiguration, null), Is.Null); }
public void GetBuildArtifact_WithoutBuildConfiguration_IsNull() { Assert.That(BuildArtifacts.GetBuildArtifact <IBuildArtifact>(null), Is.Null); }
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); }