Beispiel #1
0
        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);
        }
Beispiel #4
0
        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
        }