public void NameFilter_filters_internal_atoms_by_equality()
        {
            PackedExecution.Builder builder = ConstructExecution();

            NameIndex nameIndex = new NameIndex(builder.PackedExecution.PipTable.PipNameTable);

            // should match "alpha.bravo" pip substrings
            NameFilter <PipId> nameFilter = new NameFilter <PipId>(
                builder.PackedExecution.PipTable,
                nameIndex,
                pid => builder.PackedExecution.PipTable[pid].Name,
                '.',
                "a.bravo.d");

            PipId[] results = nameFilter.Filter().ToArray();

            XAssert.AreEqual(1, results.Count());
            XAssert.AreEqual(new PipId(2), results.First());

            // should match "alpha.bravo" pip substrings
            NameFilter <PipId> nameFilter2 = new NameFilter <PipId>(
                builder.PackedExecution.PipTable,
                nameIndex,
                pid => builder.PackedExecution.PipTable[pid].Name,
                '.',
                "t.golf.h");

            PipId[] results2 = nameFilter2.Filter().ToArray();

            XAssert.AreEqual(1, results2.Count());
            XAssert.AreEqual(new PipId(3), results2.First());
        }
        public void NameFilter_filters_substrings_correctly()
        {
            PackedExecution.Builder builder = ConstructExecution();

            NameIndex nameIndex = new NameIndex(builder.PackedExecution.PipTable.PipNameTable);

            NameFilter <PipId> nameFilter = new NameFilter <PipId>(
                builder.PackedExecution.PipTable,
                nameIndex,
                pid => builder.PackedExecution.PipTable[pid].Name,
                '.',
                "rav");

            PipId[] results = nameFilter.Filter().OrderBy(pid => pid).ToArray();

            XAssert.AreEqual(2, results.Count());
            XAssert.AreEqual(new PipId(1), results.First());
            XAssert.AreEqual(new PipId(2), results.Last());

            NameFilter <PipId> nameFilter2 = new NameFilter <PipId>(
                builder.PackedExecution.PipTable,
                nameIndex,
                pid => builder.PackedExecution.PipTable[pid].Name,
                '.',
                "RAV");

            PipId[] results2 = nameFilter2.Filter().OrderBy(pid => pid).ToArray();

            XAssert.AreArraysEqual(results, results2, true);
        }
Esempio n. 3
0
        public void RelationTable_can_be_built()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);
            long   hash   = 1;
            string name   = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId1 = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);
            PipId  pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process);
            PipId  pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.SealDirectory);
            PipId  pipId4 = packedExecutionBuilder.PipTableBuilder.Add(hash + 3, $"{name}4", PipType.Process);

            packedExecution.ConstructRelationTables();

            RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies;

            RelationTable <PipId, PipId> .Builder builder = new RelationTable <PipId, PipId> .Builder(relationTable);

            // add relations in any order (but without cycles)
            // 1 <- 2
            // 1 <- 3
            // 2 <- 4
            // 3 <- 4
            builder.Add(pipId2, pipId1);
            builder.Add(pipId3, pipId1);
            builder.Add(pipId4, pipId2);
            builder.Add(pipId4, pipId3);

            // done adding relations; flush to table
            builder.Complete();

            CheckRelation(packedExecution, pipId1, pipId2, pipId3, pipId4, relationTable);
        }
Esempio n. 4
0
        public void RelationTable_can_store_one_relation()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);
            long   hash  = 1;
            string name  = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);

            packedExecution.ConstructRelationTables();

            RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies;

            relationTable.Add(new[] { pipId }.AsSpan());

            XAssert.AreEqual(1, relationTable[pipId].Length);

            ReadOnlySpan <PipId> relations = relationTable[pipId];

            XAssert.AreEqual(pipId, relations[0]);

            RelationTable <PipId, PipId> inverseRelationTable = relationTable.Invert();

            XAssert.AreEqual(1, inverseRelationTable[pipId].Length);
            XAssert.AreEqual(pipId, inverseRelationTable[pipId][0]);
        }
Esempio n. 5
0
        public void RelationTable_can_be_built_unordered()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);
            long   hash   = 1;
            string name   = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId1 = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);
            PipId  pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process);
            PipId  pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.SealDirectory);
            PipId  pipId4 = packedExecutionBuilder.PipTableBuilder.Add(hash + 3, $"{name}4", PipType.Process);

            packedExecution.ConstructRelationTables();

            RelationTable <PipId, PipId> pipDependencyTable = packedExecution.PipDependencies;

            pipDependencyTable.FillToBaseTableCount();
            pipDependencyTable.AddUnordered(pipId4, new PipId[] { pipId2, pipId3 });
            pipDependencyTable.AddUnordered(pipId3, new PipId[] { pipId1 });
            pipDependencyTable.AddUnordered(pipId2, new PipId[] { pipId1 });

            XAssert.IsTrue(pipDependencyTable.MayBeUnordered);

            CheckRelation(packedExecution, pipId1, pipId2, pipId3, pipId4, pipDependencyTable);
        }
Esempio n. 6
0
        public void RelationTable_can_be_built()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);
            long   hash   = 1;
            string name   = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId  = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);
            PipId  pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process);
            PipId  pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.Process);

            packedExecution.ConstructRelationTables();

            RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies;

            RelationTable <PipId, PipId> .Builder builder = new RelationTable <PipId, PipId> .Builder(relationTable);

            // add relations in any order
            builder.Add(pipId3, pipId2);
            builder.Add(pipId3, pipId);
            builder.Add(pipId, pipId3);
            builder.Add(pipId, pipId2);

            // done adding relations; flush to table
            builder.Complete();

            XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable[pipId].ToArray(), true);
            XAssert.AreArraysEqual(new PipId[0], relationTable[pipId2].ToArray(), true);
            XAssert.AreArraysEqual(new[] { pipId, pipId2 }, relationTable[pipId3].ToArray(), true);

            XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable.Enumerate(pipId).ToArray(), true);
            XAssert.AreArraysEqual(new PipId[0], relationTable.Enumerate(pipId2).ToArray(), true);
            XAssert.AreArraysEqual(new[] { pipId, pipId2 }, relationTable.Enumerate(pipId3).ToArray(), true);
        }
Esempio n. 7
0
        public void PackedExecution_can_store_files()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);

            string path = "d:\\os\\bin\\shellcommon\\shell\\merged\\winmetadata\\appresolverux.winmd";
            FileId id   = packedExecutionBuilder.FileTableBuilder.GetOrAdd(path, 1024 * 1024, default, default);
        public static PackedExecution.Builder ConstructExecution()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder builder = new PackedExecution.Builder(packedExecution);

            builder.PipTableBuilder.Add(0, "alpha.bravo.charlie", PipType.Process);
            builder.PipTableBuilder.Add(1, "alpha.bravo.delta.echo", PipType.Process);
            builder.PipTableBuilder.Add(2, "alpha.foxtrot.golf.hotel", PipType.Process);

            return(builder);
        }
Esempio n. 9
0
        public void RelationTable_can_store_multiple_relations()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);
            long   hash   = 1;
            string name   = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId  = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);
            PipId  pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process);
            PipId  pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.Process);

            XAssert.AreNotEqual(pipId, pipId2);
            XAssert.AreNotEqual(pipId, pipId3);
            XAssert.AreNotEqual(pipId2, pipId3);

            packedExecution.ConstructRelationTables();

            RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies;

            relationTable.Add(new[] { pipId2, pipId3 }.AsSpan());

            XAssert.AreEqual(2, relationTable[pipId].Length);

            ReadOnlySpan <PipId> relations = relationTable[pipId];

            XAssert.AreEqual(pipId2, relations[0]);
            XAssert.AreEqual(pipId3, relations[1]);

            relationTable.Add(new[] { pipId }.AsSpan());

            XAssert.AreEqual(1, relationTable[pipId2].Length);

            relationTable.Add(new[] { pipId, pipId2, pipId3 }.AsSpan());

            XAssert.AreEqual(3, relationTable[pipId3].Length);
            XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable[pipId].ToArray(), true);
            XAssert.AreArraysEqual(new[] { pipId, pipId2, pipId3 }, relationTable[pipId3].ToArray(), true);

            RelationTable <PipId, PipId> inverseRelationTable = relationTable.Invert();

            XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, inverseRelationTable[pipId].ToArray(), true);
            XAssert.AreArraysEqual(new[] { pipId, pipId3 }, inverseRelationTable[pipId2].ToArray(), true);
            XAssert.AreArraysEqual(new[] { pipId, pipId3 }, inverseRelationTable[pipId3].ToArray(), true);
        }
Esempio n. 10
0
        /// <summary>
        /// Construct a PackedExecutionExporter.
        /// </summary>
        public PackedExecutionExporter(PipGraph input, string outputDirectoryPath, bool threadSafe = true)
            : base(input)
        {
#if NET_CORE
            m_outputDirectoryPath = outputDirectoryPath;

            m_packedExecution = new PackedExecution();
            // we'll be building these right away, not loading the tables first
            m_packedExecution.ConstructRelationTables();

            m_packedExecutionBuilder = new PackedExecution.Builder(m_packedExecution);
            m_concurrentPipProcessor = new ConcurrentPipProcessor(this);

            if (threadSafe)
            {
                m_lockObject = this;
            }
#endif
        }
        public void NameFilter_filters_starts_and_ends_correctly()
        {
            PackedExecution.Builder builder = ConstructExecution();

            NameIndex nameIndex = new NameIndex(builder.PackedExecution.PipTable.PipNameTable);

            // should match "alpha.bravo" pip substrings
            NameFilter <PipId> nameFilter = new NameFilter <PipId>(
                builder.PackedExecution.PipTable,
                nameIndex,
                pid => builder.PackedExecution.PipTable[pid].Name,
                '.',
                "a.b");

            PipId[] results = nameFilter.Filter().OrderBy(pid => pid).ToArray();

            XAssert.AreEqual(2, results.Count());
            XAssert.AreEqual(new PipId(1), results.First());
            XAssert.AreEqual(new PipId(2), results.Last());
        }
Esempio n. 12
0
        public void PackedExecution_can_store_pips()
        {
            PackedExecution packedExecution = new PackedExecution();

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);

            long   hash = 1;
            string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  id   = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);

            XAssert.AreEqual(0, packedExecution.DirectoryTable.Count);
            XAssert.AreEqual(0, packedExecution.FileTable.Count);
            XAssert.AreEqual(0, packedExecution.PathTable.Count);
            XAssert.AreEqual(1, packedExecution.PipTable.Count);
            XAssert.AreEqual(4, packedExecution.StringTable.Count);
            XAssert.AreEqual(0, packedExecution.WorkerTable.Count);

            PipEntry entry = packedExecution.PipTable[id];

            XAssert.AreEqual(hash, entry.SemiStableHash);
            XAssert.AreEqual(name, packedExecution.PipTable.PipNameTable.GetText(entry.Name));
        }
Esempio n. 13
0
        public void DerivedTable_can_save_and_load()
        {
            PackedExecution packedExecution            = new PackedExecution();
            SingleValueTable <PipId, int> derivedTable = new SingleValueTable <PipId, int>(packedExecution.PipTable);

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);

            long   hash  = 1;
            string name  = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);

            derivedTable.Add(1000);

            derivedTable.SaveToFile(TemporaryDirectory, "PipInt.bin");

            SingleValueTable <PipId, int> derivedTable2 = new SingleValueTable <PipId, int>(packedExecution.PipTable);

            derivedTable2.LoadFromFile(TemporaryDirectory, "PipInt.bin");

            XAssert.AreEqual(1, derivedTable2.Count);
            XAssert.AreEqual(1, derivedTable2.Ids.Count());
            XAssert.AreEqual(1000, derivedTable2[pipId]);
        }
Esempio n. 14
0
        public void DerivedTable_can_store_one_element()
        {
            PackedExecution packedExecution            = new PackedExecution();
            SingleValueTable <PipId, int> derivedTable = new SingleValueTable <PipId, int>(packedExecution.PipTable);

            XAssert.AreEqual(0, derivedTable.Count);
            XAssert.AreEqual(0, derivedTable.Ids.Count());

            PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution);

            long   hash  = 1;
            string name  = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata";
            PipId  pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process);

            XAssert.AreEqual(0, derivedTable.Count);
            XAssert.AreEqual(0, derivedTable.Ids.Count());

            derivedTable.Add(1000);

            XAssert.AreEqual(1, derivedTable.Count);
            XAssert.AreEqual(1, derivedTable.Ids.Count());
            XAssert.AreEqual(1000, derivedTable[pipId]);
        }