public void ObjectPools() { // make sure that the pool returns distinct objects using (PooledObjectWrapper <StringBuilder> wrap = Pools.GetStringBuilder()) { StringBuilder sb = wrap.Instance; using (PooledObjectWrapper <StringBuilder> wrap2 = Pools.GetStringBuilder()) { StringBuilder sb2 = wrap2.Instance; XAssert.AreNotSame(sb2, sb); } } // the pool's counts should be at least 2 XAssert.IsTrue(Pools.StringBuilderPool.ObjectsInPool >= 2); XAssert.IsTrue(Pools.StringBuilderPool.UseCount >= 2); // try out the core APIs directly { PooledObjectWrapper <StringBuilder> wrap = Pools.StringBuilderPool.GetInstance(); Pools.StringBuilderPool.PutInstance(wrap); } }
public void EngineStateIsUpdated() { SetupHelloWorld(); SetUpConfig(); EngineState lastEngineState = RunEngine("Engine State is Updated"); XAssert.IsTrue(EngineState.IsUsable(lastEngineState)); var previousEngineState = lastEngineState; FreshSetUp(); lastEngineState = RunEngine("Engine State is Updated again", engineState: lastEngineState); XAssert.IsNotNull(lastEngineState); XAssert.IsTrue(EngineState.IsUsable(lastEngineState)); XAssert.IsFalse(EngineState.IsUsable(previousEngineState)); XAssert.AreNotSame(previousEngineState, lastEngineState); }
public void EngineStateIsUpdatedAfterFailedExecution() { SetupHelloWorld(); SetUpConfig(); EngineState afterFirst = RunEngine("First build"); FreshSetUp(); Configuration.Filter = "tag='IDontMatchAnything'"; // Build should fail var afterFail = RunEngine("Engine State is Updated", expectSuccess: false, engineState: afterFirst); AssertErrorEventLogged(global::BuildXL.Pips.Tracing.LogEventId.NoPipsMatchedFilter); XAssert.IsNotNull(afterFail); XAssert.IsTrue(EngineState.IsUsable(afterFail)); XAssert.IsFalse(EngineState.IsUsable(afterFirst)); XAssert.AreNotSame(afterFirst, afterFail); }
public void ObjectPoolWillReturnNewInstanceIfCleanupMethodCreatesNewInstance() { ObjectPool <StringBuilder> disabledPool = new ObjectPool <StringBuilder>( creator: () => new StringBuilder(), cleanup: sb => new StringBuilder()); StringBuilder firstInstanceFromDisabledPool; using (var wrap = disabledPool.GetInstance()) { firstInstanceFromDisabledPool = wrap.Instance; } StringBuilder secondInstanceFromDisabledPool; using (var wrap = disabledPool.GetInstance()) { secondInstanceFromDisabledPool = wrap.Instance; } XAssert.AreNotSame(firstInstanceFromDisabledPool, secondInstanceFromDisabledPool, "Disabled pool should return new instance each time."); ObjectPool <StringBuilder> regularPool = new ObjectPool <StringBuilder>( creator: () => new StringBuilder(), cleanup: sb => sb.Clear()); StringBuilder firstInstanceFromRegularPool; using (var wrap = regularPool.GetInstance()) { firstInstanceFromRegularPool = wrap.Instance; } StringBuilder secondInstanceFromRegularPool; using (var wrap = regularPool.GetInstance()) { secondInstanceFromRegularPool = wrap.Instance; } XAssert.AreSame(firstInstanceFromRegularPool, secondInstanceFromRegularPool, "Regular pool should return each object every time."); }
public void EngineStateIsUpdatedAfterFailedScheduling() { SetupHelloWorld(); SetUpConfig(); EngineState afterFirst = RunEngine("First build"); RestartEngine(); AddModule("HelloWorld", ("hello.dsc", "invalid spec content"), placeInRoot: true); // Invalid spec SetUpConfig(); // Build should fail var afterFail = RunEngine("Engine State is Updated", expectSuccess: false, engineState: afterFirst); AssertErrorEventLogged(global::BuildXL.FrontEnd.Core.Tracing.LogEventId.TypeScriptSyntaxError, 5); AssertErrorEventLogged(global::BuildXL.FrontEnd.Core.Tracing.LogEventId.CannotBuildWorkspace); XAssert.IsNotNull(afterFail); XAssert.IsTrue(EngineState.IsUsable(afterFail)); XAssert.IsFalse(EngineState.IsUsable(afterFirst)); XAssert.AreNotSame(afterFirst, afterFail); }
public void TestMultipleReuses() { SetupHelloWorld(); SetUpConfig(); EngineState firstEngineState = RunEngine("First build"); FreshSetUp("bar"); EngineState secondEngineState = RunEngine("Second build", engineState: firstEngineState); XAssert.IsTrue(!EngineState.IsUsable(firstEngineState)); XAssert.IsNotNull(secondEngineState); XAssert.IsTrue(!secondEngineState.IsDisposed); XAssert.AreNotSame(firstEngineState, secondEngineState); FreshSetUp("baz"); EngineState thirdEngineState = RunEngine("Third build", engineState: secondEngineState); XAssert.IsTrue(!EngineState.IsUsable(secondEngineState)); XAssert.IsNotNull(EngineState.IsUsable(thirdEngineState)); XAssert.IsTrue(!thirdEngineState.IsDisposed); XAssert.AreNotSame(secondEngineState, thirdEngineState); }
public void TestEngineStateFileContentTableReuse() { SetupHelloWorld(); SetUpConfig(); EngineState lastEngineState = RunEngine("First build"); var firstFCT = lastEngineState.FileContentTable; XAssert.IsNotNull(firstFCT); FileIdAndVolumeId inFileIdentity = GetIdentity(GetFullPath(InputFilename)); FileIdAndVolumeId outFileIdentity = GetIdentity(GetFullPath(OutputFilename)); Usn inFileUsn = Usn.Zero; Usn outFileUsn = Usn.Zero; ISet <FileIdAndVolumeId> ids = new HashSet <FileIdAndVolumeId>(); XAssert.IsTrue(FileContentTableAccessorFactory.TryCreate(out var accesor, out string error)); firstFCT.VisitKnownFiles(accesor, FileShare.ReadWrite | FileShare.Delete, (fileIdAndVolumeId, fileHandle, path, knownUsn, knownHash) => { if (fileIdAndVolumeId == inFileIdentity) { inFileUsn = knownUsn; } else if (fileIdAndVolumeId == outFileIdentity) { outFileUsn = knownUsn; } ids.Add(fileIdAndVolumeId); return(true); }); XAssert.AreNotEqual(Usn.Zero, inFileUsn); XAssert.AreNotEqual(Usn.Zero, outFileUsn); // Run engine again FreshSetUp("change some stuff"); lastEngineState = RunEngine("Second build", engineState: lastEngineState); var secondFCT = lastEngineState.FileContentTable; XAssert.AreNotSame(firstFCT, secondFCT); // The FCT gets updated at the end of the run outFileIdentity = GetIdentity(GetFullPath(OutputFilename)); // Output file changed bool visitedInput = false; bool visitedOutput = false; secondFCT.VisitKnownFiles(accesor, FileShare.ReadWrite | FileShare.Delete, (fileIdAndVolumeId, fileHandle, path, knownUsn, knownHash) => { if (fileIdAndVolumeId == inFileIdentity) { XAssert.IsTrue(ids.Contains(fileIdAndVolumeId)); XAssert.IsTrue(inFileUsn < knownUsn); // We modified the file inFileUsn = knownUsn; visitedInput = true; } else if (fileIdAndVolumeId == outFileIdentity) { XAssert.IsFalse(ids.Contains(fileIdAndVolumeId)); XAssert.IsTrue(outFileUsn < knownUsn); // New output file outFileUsn = knownUsn; visitedOutput = true; } else { XAssert.IsTrue(ids.Contains(fileIdAndVolumeId)); // Other entries are still there } return(true); }); XAssert.IsTrue(visitedInput); XAssert.IsTrue(visitedOutput); XAssert.IsTrue(inFileUsn < outFileUsn); XAssert.AreEqual(firstFCT.Count + 1, secondFCT.Count); // There's a new entry because the new output file has a different fileId }