From e25b29f5ded38e281f3a686bc5ce7cbe1d872d3b Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Thu, 21 May 2020 18:42:42 -0400 Subject: Handle updating entries in a WixOutput. --- src/WixToolset.Data/WixOutput.cs | 13 ++++ src/test/WixToolsetTest.Data/SerializeFixture.cs | 83 +++++++++++++++++++++--- 2 files changed, 86 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/WixToolset.Data/WixOutput.cs b/src/WixToolset.Data/WixOutput.cs index 27e7827a..bb546821 100644 --- a/src/WixToolset.Data/WixOutput.cs +++ b/src/WixToolset.Data/WixOutput.cs @@ -183,6 +183,8 @@ namespace WixToolset.Data /// Stream to the data of the file. public Stream CreateDataStream(string name) { + this.DeleteExistingEntry(name); + var entry = this.archive.CreateEntry(name); return entry.Open(); @@ -195,6 +197,8 @@ namespace WixToolset.Data /// Path to file on disk to include in the output. public void ImportDataStream(string name, string path) { + this.DeleteExistingEntry(name); + this.archive.CreateEntryFromFile(path, name, System.IO.Compression.CompressionLevel.Optimal); } @@ -256,5 +260,14 @@ namespace WixToolset.Data this.disposed = true; } + + private void DeleteExistingEntry(string name) + { + var entry = this.archive.GetEntry(name); + if (entry != null) + { + entry.Delete(); + } + } } } diff --git a/src/test/WixToolsetTest.Data/SerializeFixture.cs b/src/test/WixToolsetTest.Data/SerializeFixture.cs index c07124ef..6e224438 100644 --- a/src/test/WixToolsetTest.Data/SerializeFixture.cs +++ b/src/test/WixToolsetTest.Data/SerializeFixture.cs @@ -32,20 +32,83 @@ namespace WixToolsetTest.Data intermediate.UpdateLevel(IntermediateLevels.Resolved); var path = Path.GetTempFileName(); - intermediate.Save(path); + try + { + intermediate.Save(path); + + var loaded = Intermediate.Load(path); + + Assert.True(loaded.HasLevel(IntermediateLevels.Compiled)); + Assert.True(loaded.HasLevel(IntermediateLevels.Linked)); + Assert.True(loaded.HasLevel(IntermediateLevels.Resolved)); + + var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single(); + + Assert.Equal("TestComponent", tuple.Id.Id); + Assert.Equal(AccessModifier.Public, tuple.Id.Access); + Assert.Equal("TestFolder", tuple.DirectoryRef); + Assert.Equal(ComponentLocation.Either, tuple.Location); + } + finally + { + File.Delete(path); + } + } + + [Fact] + public void CanUpdateIntermediate() + { + var sln = new SourceLineNumber("test.wxs", 1); + var section = new IntermediateSection("test", SectionType.Product, 65001); + + section.Tuples.Add(new ComponentTuple(sln, new Identifier(AccessModifier.Public, "TestComponent")) + { + ComponentId = new Guid(1, 0, 0, new byte[8]).ToString("B"), + DirectoryRef = "TestFolder", + Location = ComponentLocation.Either, + }); + + var intermediate = new Intermediate("TestIntermediate", IntermediateLevels.Compiled, new[] { section }, null); + + var path = Path.GetTempFileName(); + try + { + intermediate.Save(path); - var loaded = Intermediate.Load(path); + var uri = new Uri(Path.GetFullPath(path)); + var stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite); - Assert.True(loaded.HasLevel(IntermediateLevels.Compiled)); - Assert.True(loaded.HasLevel(IntermediateLevels.Linked)); - Assert.True(loaded.HasLevel(IntermediateLevels.Resolved)); + using (var wixout = WixOutput.Read(uri, stream)) + { + var loaded = Intermediate.Load(wixout); + var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single(); + + Assert.Equal("TestComponent", tuple.Id.Id); + Assert.Equal(AccessModifier.Public, tuple.Id.Access); + + wixout.Reopen(writable: true); + + section.Tuples.Add(new ComponentTuple(sln, new Identifier(AccessModifier.Public, "NewComponent")) + { + ComponentId = new Guid(1, 0, 0, new byte[8]).ToString("B"), + }); + + intermediate.Save(wixout); + loaded = Intermediate.Load(wixout); + + var newTuple = loaded.Sections.Single().Tuples.Where(t => t.Id.Id == "NewComponent"); + Assert.Single(newTuple); + } - var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single(); + var loadedAfterDispose = Intermediate.Load(path); + var newTupleStillThere = loadedAfterDispose.Sections.Single().Tuples.Where(t => t.Id.Id == "NewComponent"); + Assert.Single(newTupleStillThere); - Assert.Equal("TestComponent", tuple.Id.Id); - Assert.Equal(AccessModifier.Public, tuple.Id.Access); - Assert.Equal("TestFolder", tuple.DirectoryRef); - Assert.Equal(ComponentLocation.Either, tuple.Location); + } + finally + { + File.Delete(path); + } } [Fact] -- cgit v1.2.3-55-g6feb