public void CacheCanBeEnumerated() { ResultsCache cache = new ResultsCache(); BuildRequest request = new BuildRequest(submissionId: 1, nodeRequestId: 0, configurationId: 1, new string[1] { "testTarget" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("result1target1", BuildResultUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result); request = new BuildRequest(1 /* submissionId */, 0, 1, new string[1] { "otherTarget" }, null, BuildEventContext.Invalid, null); result = new BuildResult(request); result.AddResultsForTarget("result1target2", BuildResultUtilities.GetEmptySucceedingTargetResult()); cache.AddResult(result); BuildResult result2 = new BuildResult(new BuildRequest(submissionId: 1, nodeRequestId: 0, configurationId: 2, new string[1] { "testTarget" }, null, BuildEventContext.Invalid, null)); result2.AddResultsForTarget("result2target1", BuildResultUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result2); var results = cache.GetEnumerator().ToArray(); results.Length.ShouldBe(2); Assert.True(results[0].HasResultsForTarget("result1target1")); Assert.True(results[0].HasResultsForTarget("result1target2")); Assert.True(results[1].HasResultsForTarget("result2target1")); }
public void RejectCachesWithMoreConfigEntriesThanResultEntries() { var configCache = new ConfigCache(); configCache.AddConfiguration(new BuildRequestConfiguration(configId: 1, new BuildRequestData("path", new Dictionary <string, string>() { ["p"] = "v" }, "13", new [] { "a", "b" }, null), "13")); configCache.AddConfiguration(new BuildRequestConfiguration(configId: 2, new BuildRequestData("path2", new Dictionary <string, string>() { ["p"] = "v" }, "13", new [] { "c", "d" }, null), "13")); var resultsCache = new ResultsCache(); var buildResult = new BuildResult(new BuildRequest(1, 2, configurationId: 1, new List <string>() { "a", "b" }, null, BuildEventContext.Invalid, null)); buildResult.AddResultsForTarget("a", GetNonEmptySucceedingTargetResult()); resultsCache.AddResult(buildResult); aggregator.Add(configCache, resultsCache); using (var env = TestEnvironment.Create()) { env.SetEnvironmentVariable("MSBUILDDONOTLAUNCHDEBUGGER", "1"); var e = Should.Throw <InternalErrorException>(() => aggregator.Aggregate()); e.Message.ShouldContain("Assuming 1-to-1 mapping between configs and results. Otherwise it means the caches are either not minimal or incomplete"); } }
public void RejectCachesWithMismatchedIds() { // one entry in each cache but different config ids var configCache = new ConfigCache(); configCache.AddConfiguration(new BuildRequestConfiguration(configId: 1, new BuildRequestData("path", new Dictionary <string, string>() { ["p"] = "v" }, "13", new [] { "a", "b" }, null), "13")); var resultsCache = new ResultsCache(); var buildResult = new BuildResult(new BuildRequest(1, 2, configurationId: 2, new List <string>() { "a", "b" }, null, BuildEventContext.Invalid, null)); buildResult.AddResultsForTarget("a", GetNonEmptySucceedingTargetResult()); resultsCache.AddResult(buildResult); aggregator.Add(configCache, resultsCache); using (var env = TestEnvironment.Create()) { env.SetEnvironmentVariable("MSBUILDDONOTLAUNCHDEBUGGER", "1"); var e = Should.Throw <InternalErrorException>(() => aggregator.Aggregate()); e.Message.ShouldContain("Each result should have a corresponding configuration. Otherwise the caches are not consistent"); } }
public void TestMergeResultsWithException() { ResultsCache cache = new ResultsCache(); BuildRequest request = new BuildRequest(1 /* submissionId */, 0, 1, new string[] { "testTarget" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("testTarget", TestUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result); BuildResult result2 = new BuildResult(request, new Exception("Test exception")); cache.AddResult(result2); BuildResult retrievedResult = cache.GetResultForRequest(request); Assert.NotNull(retrievedResult.Exception); }
public void TestRetrieveSubsetResults() { ResultsCache cache = new ResultsCache(); BuildRequest request = new BuildRequest(1 /* submissionId */, 0, 1, new string[1] { "testTarget2" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("testTarget", TestUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result); BuildResult result2 = new BuildResult(request); result2.AddResultsForTarget("testTarget2", TestUtilities.GetEmptySucceedingTargetResult()); cache.AddResult(result2); BuildResult retrievedResult = cache.GetResultForRequest(request); Assert.True(AreResultsIdenticalForTarget(result2, retrievedResult, "testTarget2")); }
public void TestRetrieveIncompleteResults() { ResultsCache cache = new ResultsCache(); BuildRequest request = new BuildRequest(1 /* submissionId */, 0, 1, new string[2] { "testTarget", "testTarget2" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("testTarget", TestUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result); BuildResult retrievedResult = cache.GetResultForRequest(request); }
public void TestAddAndRetrieveResultsByConfiguration() { ResultsCache cache = new ResultsCache(); BuildRequest request = new BuildRequest(1 /* submissionId */, 0, 1, new string[1] { "testTarget" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("testTarget", TestUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result); request = new BuildRequest(1 /* submissionId */, 0, 1, new string[1] { "otherTarget" }, null, BuildEventContext.Invalid, null); result = new BuildResult(request); result.AddResultsForTarget("otherTarget", TestUtilities.GetEmptySucceedingTargetResult()); cache.AddResult(result); BuildResult retrievedResult = cache.GetResultsForConfiguration(1); Assert.True(retrievedResult.HasResultsForTarget("testTarget")); Assert.True(retrievedResult.HasResultsForTarget("otherTarget")); }
public void RejectCollidingConfigurationsFromSeparateCaches() { // collides with the config id from configCache2 var configCache1 = new ConfigCache(); configCache1.AddConfiguration(new BuildRequestConfiguration(configId: 1, new BuildRequestData("path", new Dictionary <string, string>() { ["p"] = "v" }, "13", new [] { "a", "b" }, null), "13")); var resultsCache1 = new ResultsCache(); var buildResult11 = new BuildResult(new BuildRequest(1, 2, configurationId: 1, new List <string>() { "a", "b" }, null, BuildEventContext.Invalid, null)); buildResult11.AddResultsForTarget("a", GetNonEmptySucceedingTargetResult()); resultsCache1.AddResult(buildResult11); var configCache2 = new ConfigCache(); configCache2.AddConfiguration(new BuildRequestConfiguration(configId: 1, new BuildRequestData("path", new Dictionary <string, string>() { ["p"] = "v" }, "13", new [] { "a", "b" }, null), "13")); var resultsCache2 = new ResultsCache(); var buildResult21 = new BuildResult(new BuildRequest(1, 2, configurationId: 1, new List <string>() { "e", "f" }, null, BuildEventContext.Invalid, null)); buildResult21.AddResultsForTarget("a", GetNonEmptySucceedingTargetResult()); resultsCache2.AddResult(buildResult21); aggregator.Add(configCache1, resultsCache1); aggregator.Add(configCache2, resultsCache2); using (var env = TestEnvironment.Create()) { env.SetEnvironmentVariable("MSBUILDDONOTLAUNCHDEBUGGER", "1"); var e = Should.Throw <InternalErrorException>(() => aggregator.Aggregate()); e.Message.ShouldContain("Input caches should not contain entries for the same configuration"); } }
public void TestClearResultsCache() { ResultsCache cache = new ResultsCache(); cache.ClearResults(); BuildRequest request = new BuildRequest(1 /* submissionId */, 0, 1, new string[1] { "testTarget2" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("testTarget", TestUtilities.GetEmptyFailingTargetResult()); cache.AddResult(result); cache.ClearResults(); Assert.Null(cache.GetResultForRequest(request)); }
public void TestRetrieveSubsetTargetsFromResult() { ResultsCache cache = new ResultsCache(); BuildRequest request = new BuildRequest(1 /* submissionId */, 0, 1, new string[1] { "testTarget2" }, null, BuildEventContext.Invalid, null); BuildResult result = new BuildResult(request); result.AddResultsForTarget("testTarget", TestUtilities.GetEmptyFailingTargetResult()); result.AddResultsForTarget("testTarget2", TestUtilities.GetEmptySucceedingTargetResult()); cache.AddResult(result); ResultsCacheResponse response = cache.SatisfyRequest(request, new List <string>(), new List <string>(new string[] { "testTarget2" }), new List <string>(new string[] { "testTarget" }), skippedResultsAreOK: false); Assert.Equal(ResultsCacheResponseType.Satisfied, response.Type); Assert.True(AreResultsIdenticalForTarget(result, response.Results, "testTarget2")); Assert.False(response.Results.HasResultsForTarget("testTarget")); Assert.Equal(BuildResultCode.Failure, response.Results.OverallResult); }