/// <nodoc /> public void Serialize(Stream stream) { using (var writer = new BuildXLWriter(false, stream, true, true)) { writer.WriteNullableString(m_arguments); writer.WriteNullableString(m_commandLine); writer.Write(DisableConHostSharing); writer.WriteNullableString(FileName); writer.Write(StandardInputEncoding, (w, v) => w.Write(v)); writer.Write(StandardOutputEncoding, (w, v) => w.Write(v)); writer.Write(StandardErrorEncoding, (w, v) => w.Write(v)); writer.WriteNullableString(WorkingDirectory); writer.Write( EnvironmentVariables, (w, v) => w.WriteReadOnlyList( v.ToDictionary().ToList(), (w2, kvp) => { w2.Write(kvp.Key); w2.Write(kvp.Value); })); writer.Write( AllowedSurvivingChildProcessNames, (w, v) => w.WriteReadOnlyList(v, (w2, v2) => w2.Write(v2))); writer.Write(MaxLengthInMemory); writer.Write(Timeout, (w, v) => w.Write(v)); writer.Write(NestedProcessTerminationTimeout); writer.Write(PipSemiStableHash); writer.WriteNullableString(TimeoutDumpDirectory); writer.Write((byte)SandboxKind); writer.WriteNullableString(PipDescription); if (SandboxedProcessStandardFiles == null) { SandboxedProcessStandardFiles.From(FileStorage).Serialize(writer); } else { SandboxedProcessStandardFiles.Serialize(writer); } writer.Write(StandardInputSourceInfo, (w, v) => v.Serialize(w)); writer.Write(StandardObserverDescriptor, (w, v) => v.Serialize(w)); // File access manifest should be serialize the last. writer.Write(FileAccessManifest, (w, v) => FileAccessManifest.Serialize(stream)); } }
/// <summary> /// Tests file access manifest. /// </summary> public static void TestManifestRetrieval(IEnumerable <ValidationData> validationData, FileAccessManifest fam, bool serializeManifest) { foreach (var line in fam.Describe()) { Console.WriteLine(line); } if (serializeManifest) { var writtenFlag = fam.Flag; var writtenDirectoryTranslator = fam.DirectoryTranslator; using (var stream = new MemoryStream()) { fam.Serialize(stream); stream.Position = 0; fam = FileAccessManifest.Deserialize(stream); } XAssert.AreEqual(writtenFlag, fam.Flag); XAssert.AreEqual(writtenDirectoryTranslator == null, fam.DirectoryTranslator == null); if (writtenDirectoryTranslator != null) { XAssert.AreEqual(writtenDirectoryTranslator.Count, fam.DirectoryTranslator.Count); var writtenTranslations = writtenDirectoryTranslator.Translations.ToArray(); var readTranslations = fam.DirectoryTranslator.Translations.ToArray(); for (int i = 0; i < writtenTranslations.Length; ++i) { XAssert.AreEqual(writtenTranslations[i].SourcePath, readTranslations[i].SourcePath); XAssert.AreEqual(writtenTranslations[i].TargetPath, readTranslations[i].TargetPath); } } } byte[] manifestTreeBytes = fam.GetManifestTreeBytes(); foreach (ValidationData dataItem in validationData) { uint nodePolicy; uint conePolicy; uint pathId; Usn expectedUsn; bool success = global::BuildXL.Native.Processes.Windows.ProcessUtilitiesWin.FindFileAccessPolicyInTree( manifestTreeBytes, dataItem.Path, new UIntPtr((uint)dataItem.Path.Length), out conePolicy, out nodePolicy, out pathId, out expectedUsn); XAssert.IsTrue(success, "Unable to find path in manifest"); XAssert.AreEqual( unchecked ((uint)dataItem.PathId), pathId, "PathId for '{0}' did not match", dataItem.Path); if (dataItem.NodePolicy.HasValue) { XAssert.AreEqual( unchecked ((uint)dataItem.NodePolicy.Value), nodePolicy, "Policy for '{0}' did not match", dataItem.Path); } if (dataItem.ConePolicy.HasValue) { XAssert.AreEqual( unchecked ((uint)dataItem.ConePolicy.Value), conePolicy, "Policy for '{0}' did not match", dataItem.Path); } XAssert.AreEqual( dataItem.ExpectedUsn, expectedUsn, "Usn for '{0}' did not match", dataItem.Path); } }