using System.IO; using System.Text.RegularExpressions; using NUnit.Framework; using Unity.Pipeline.Config; using UnityEngine; using UnityEngine.TestTools; namespace Unity.Pipeline.Tests.Editor { class RuntimePipelineConfigTests { [SetUp] public void SetUp() { RuntimePipelineResourceTestGuard.AssertNoConfigAssetExists(); } [TearDown] public void TearDown() { RuntimePipelineResourceTestGuard.DeleteConfigIfExists(); } [Test] public void DefaultValues_AreSecure() { var config = ScriptableObject.CreateInstance(); Assert.IsFalse(config.enableInBuilds, "enableInBuilds should default to false for security"); Assert.AreEqual(0, config.port, "Port should default to 0 for auto-assignment"); Assert.IsTrue(config.autoStart, "Should default to auto-start"); Assert.AreEqual(10, config.maxWorkItemsPerFrame, "Should have a reasonable default for work items per frame"); Object.DestroyImmediate(config); } [Test] public void Load_SettingsFileExists_FindsIt() { var config = ScriptableObject.CreateInstance(); config.enableInBuilds = true; config.Save(); Object.DestroyImmediate(config); var loaded = RuntimePipelineConfig.Load(); Assert.IsNotNull(loaded, "Load() should find the settings file written by Save()"); Assert.IsTrue(loaded.enableInBuilds); } [Test] public void Load_NoSettingsFile_ReturnsNull() { Assert.IsNull(RuntimePipelineConfig.Load()); } [Test] public void SaveThenLoad_RoundTripsAllFields() { var config = ScriptableObject.CreateInstance(); config.enableInBuilds = true; config.port = 7912; config.requestTimeoutMs = 45000; config.enableAuditLogging = false; config.autoStart = false; config.maxWorkItemsPerFrame = 25; config.Save(); Object.DestroyImmediate(config); var loaded = RuntimePipelineConfig.Load(); Assert.IsNotNull(loaded); Assert.IsTrue(loaded.enableInBuilds); Assert.AreEqual(7912, loaded.port); Assert.AreEqual(45000, loaded.requestTimeoutMs); Assert.IsFalse(loaded.enableAuditLogging); Assert.IsFalse(loaded.autoStart); Assert.AreEqual(25, loaded.maxWorkItemsPerFrame); } [Test] public void GetLiveMaxWorkItemsPerFrame_NoSettingsFile_ReturnsFallback() { Assert.AreEqual(42, RuntimePipelineConfig.GetLiveMaxWorkItemsPerFrame(42)); } [Test] public void GetLiveMaxWorkItemsPerFrame_SettingsFileExists_ReturnsCurrentValue() { var config = ScriptableObject.CreateInstance(); config.maxWorkItemsPerFrame = 33; config.Save(); Object.DestroyImmediate(config); Assert.AreEqual(33, RuntimePipelineConfig.GetLiveMaxWorkItemsPerFrame(10)); } [Test] public void GetLiveMaxWorkItemsPerFrame_FileChangedSinceLastRead_ReturnsUpdatedValue() { var config = ScriptableObject.CreateInstance(); config.maxWorkItemsPerFrame = 15; config.Save(); Object.DestroyImmediate(config); var first = RuntimePipelineConfig.GetLiveMaxWorkItemsPerFrame(10); var updated = ScriptableObject.CreateInstance(); updated.maxWorkItemsPerFrame = 40; updated.Save(); Object.DestroyImmediate(updated); var second = RuntimePipelineConfig.GetLiveMaxWorkItemsPerFrame(10); Assert.AreEqual(15, first); Assert.AreEqual(40, second, "A later Save() must be picked up on the next call"); } [Test] public void Load_CorruptSettingsFile_ReturnsNullAndLogsWarning() { var path = Path.Combine(Path.GetDirectoryName(Application.dataPath), "ProjectSettings/Packages/com.unity.pipeline/RuntimePipelineConfig.json"); Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllText(path, "{ not valid json"); LogAssert.Expect(LogType.Warning, new Regex("Pipeline: could not read runtime settings.*")); var loaded = RuntimePipelineConfig.Load(); Assert.IsNull(loaded); } } }