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); }
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); }
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]); }
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); }
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); }
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); }
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); }
/// <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()); }
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)); }
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]); }
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]); }