diff options
Diffstat (limited to '')
4 files changed, 196 insertions, 207 deletions
diff --git a/src/internal/SetBuildNumber/Directory.Packages.props.pp b/src/internal/SetBuildNumber/Directory.Packages.props.pp index bb0f96d8..0c4b1dfb 100644 --- a/src/internal/SetBuildNumber/Directory.Packages.props.pp +++ b/src/internal/SetBuildNumber/Directory.Packages.props.pp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | <PackageVersion Include="WixToolset.Dtf.CustomAction" Version="{packageversion}" /> | 5 | <PackageVersion Include="WixToolset.Dtf.CustomAction" Version="{packageversion}" /> |
| 6 | <PackageVersion Include="WixToolset.Dtf.Resources" Version="{packageversion}" /> | 6 | <PackageVersion Include="WixToolset.Dtf.Resources" Version="{packageversion}" /> |
| 7 | <PackageVersion Include="WixToolset.Dtf.WindowsInstaller" Version="{packageversion}" /> | 7 | <PackageVersion Include="WixToolset.Dtf.WindowsInstaller" Version="{packageversion}" /> |
| 8 | <PackageVersion Include="WixToolset.Dtf.WindowsInstaller.Package" Version="{packageversion}" /> | ||
| 8 | 9 | ||
| 9 | <PackageVersion Include="WixInternal.TestSupport" Version="{packageversion}" /> | 10 | <PackageVersion Include="WixInternal.TestSupport" Version="{packageversion}" /> |
| 10 | <PackageVersion Include="WixInternal.TestSupport.Native" Version="{packageversion}" /> | 11 | <PackageVersion Include="WixInternal.TestSupport.Native" Version="{packageversion}" /> |
diff --git a/src/wix/WixToolset.Core/HarvestFilesCommand.cs b/src/wix/WixToolset.Core/HarvestFilesCommand.cs index 4f0c2e2a..9d2d0fe8 100644 --- a/src/wix/WixToolset.Core/HarvestFilesCommand.cs +++ b/src/wix/WixToolset.Core/HarvestFilesCommand.cs | |||
| @@ -128,7 +128,7 @@ namespace WixToolset.Core | |||
| 128 | private IEnumerable<WildcardFile> GetWildcardFiles(HarvestFilesSymbol harvestFile, IEnumerable<string> patterns) | 128 | private IEnumerable<WildcardFile> GetWildcardFiles(HarvestFilesSymbol harvestFile, IEnumerable<string> patterns) |
| 129 | { | 129 | { |
| 130 | var sourceLineNumbers = harvestFile.SourceLineNumbers; | 130 | var sourceLineNumbers = harvestFile.SourceLineNumbers; |
| 131 | var sourcePath = harvestFile.SourcePath; | 131 | var sourcePath = harvestFile.SourcePath?.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); |
| 132 | 132 | ||
| 133 | var files = new List<WildcardFile>(); | 133 | var files = new List<WildcardFile>(); |
| 134 | 134 | ||
| @@ -158,7 +158,7 @@ namespace WixToolset.Core | |||
| 158 | else if (!Path.IsPathRooted(directoryPortion)) | 158 | else if (!Path.IsPathRooted(directoryPortion)) |
| 159 | { | 159 | { |
| 160 | directoryPortion = Path.Combine(sourceDirectory, directoryPortion); | 160 | directoryPortion = Path.Combine(sourceDirectory, directoryPortion); |
| 161 | recursiveDirOffset = sourceDirectory.Length + 1; | 161 | recursiveDirOffset = directoryPortion.Length + 1; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | var foundFiles = Directory.EnumerateFiles(directoryPortion, filePortion, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); | 164 | var foundFiles = Directory.EnumerateFiles(directoryPortion, filePortion, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs index 8bf03ebb..821660ff 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | namespace WixToolsetTest.CoreIntegration | 3 | namespace WixToolsetTest.CoreIntegration |
| 4 | { | 4 | { |
| 5 | using System; | ||
| 5 | using System.Data; | 6 | using System.Data; |
| 6 | using System.IO; | 7 | using System.IO; |
| 7 | using System.Linq; | 8 | using System.Linq; |
| @@ -14,257 +15,293 @@ namespace WixToolsetTest.CoreIntegration | |||
| 14 | [Fact] | 15 | [Fact] |
| 15 | public void MustIncludeSomeFiles() | 16 | public void MustIncludeSomeFiles() |
| 16 | { | 17 | { |
| 17 | var messages = BuildAndQueryComponentFileDirectoryTables("BadAuthoring.wxs", isPackage: true, 10); | 18 | Build("BadAuthoring.wxs", (_, result) => |
| 18 | Assert.Equal(new[] | ||
| 19 | { | 19 | { |
| 20 | "10", | 20 | var messages = result.Messages.Select(m => m.Id); |
| 21 | }, messages); | 21 | Assert.Equal(new[] |
| 22 | { | ||
| 23 | 10, | ||
| 24 | }, messages); | ||
| 25 | }); | ||
| 22 | } | 26 | } |
| 23 | 27 | ||
| 24 | [Fact] | 28 | [Fact] |
| 25 | public void ZeroFilesHarvestedIsAWarning() | 29 | public void ZeroFilesHarvestedIsAWarning() |
| 26 | { | 30 | { |
| 27 | var messages = BuildAndQueryComponentFileDirectoryTables("ZeroFiles.wxs", isPackage: true, 8600); | 31 | Build("ZeroFiles.wxs", (_, result) => |
| 28 | Assert.Equal(new[] | ||
| 29 | { | 32 | { |
| 30 | "8600", | 33 | var messages = result.Messages.Select(m => m.Id); |
| 31 | }, messages); | 34 | Assert.Equal(new[] |
| 35 | { | ||
| 36 | 8600, | ||
| 37 | }, messages); | ||
| 38 | }); | ||
| 32 | } | 39 | } |
| 33 | 40 | ||
| 34 | [Fact] | 41 | [Fact] |
| 35 | public void MissingHarvestDirectoryIsAWarning() | 42 | public void MissingHarvestDirectoryIsAWarning() |
| 36 | { | 43 | { |
| 37 | var messages = BuildAndQueryComponentFileDirectoryTables("BadDirectory.wxs", isPackage: true, 8601); | 44 | Build("BadDirectory.wxs", (_, result) => |
| 38 | Assert.Equal(new[] | ||
| 39 | { | 45 | { |
| 40 | "8601", | 46 | var messages = result.Messages.Select(m => m.Id); |
| 41 | "8601", | 47 | Assert.Equal(new[] |
| 42 | }, messages); | 48 | { |
| 49 | 8601, | ||
| 50 | 8601, | ||
| 51 | }, messages); | ||
| 52 | }); | ||
| 43 | } | 53 | } |
| 44 | 54 | ||
| 45 | [Fact] | 55 | [Fact] |
| 46 | public void DuplicateFilesSomethingSomething() | 56 | public void DuplicateFilesSomethingSomething() |
| 47 | { | 57 | { |
| 48 | var messages = BuildAndQueryComponentFileDirectoryTables("DuplicateFiles.wxs", isPackage: true, 8602); | 58 | Build("DuplicateFiles.wxs", (_, result) => |
| 49 | Assert.Equal(new[] | ||
| 50 | { | 59 | { |
| 51 | "8602", | 60 | var messages = result.Messages.Select(m => m.Id); |
| 52 | "8602", | 61 | Assert.Equal(new[] |
| 53 | "8602", | 62 | { |
| 54 | "8602", | 63 | 8602, |
| 55 | }, messages); | 64 | 8602, |
| 65 | 8602, | ||
| 66 | 8602, | ||
| 67 | }, messages); | ||
| 68 | }); | ||
| 56 | } | 69 | } |
| 57 | 70 | ||
| 58 | [Fact] | 71 | [Fact] |
| 59 | public void CanHarvestFilesInComponentGroup() | 72 | public void HarvestedFilesUnderPackageWithAuthoredFeatureAreOrphaned() |
| 60 | { | 73 | { |
| 61 | BuildQueryAssertFiles("ComponentGroup.wxs", new[] | 74 | Build("PackageWithoutDefaultFeature.wxs", (_, result) => |
| 62 | { | 75 | { |
| 63 | "FileName.Extension", | 76 | var messages = result.Messages.Select(m => m.Id); |
| 64 | "test20.txt", | 77 | Assert.Equal(new[] |
| 65 | "test21.txt", | 78 | { |
| 66 | "test3.txt", | 79 | 267, |
| 67 | "test4.txt", | 80 | 267, |
| 81 | 267, | ||
| 82 | 267, | ||
| 83 | }, messages); | ||
| 68 | }); | 84 | }); |
| 69 | } | 85 | } |
| 70 | 86 | ||
| 71 | [Fact] | 87 | [Fact] |
| 88 | public void CanHarvestFilesInComponentGroup() | ||
| 89 | { | ||
| 90 | var expected = new[] | ||
| 91 | { | ||
| 92 | @"fls4di7CtiJhJnEwixr8_c5G8k8aNY=PFiles\MsiPackage\test3.txt", | ||
| 93 | @"flsk5E532wcxn9MfpYQYRnrPi3dsOA=PFiles\MsiPackage\test4.txt", | ||
| 94 | @"flsYh0SwdEpJEootWp2keHMLnnpeb4=PFiles\MsiPackage\files2_sub2\test20.txt", | ||
| 95 | @"flsI4uo74epTPY4TLIcWKVaH.HTbVQ=PFiles\MsiPackage\files2_sub2\test21.txt", | ||
| 96 | @"fls5xOtTcUOA9ZDnUsz1D4Arbw7l_A=PFiles\MsiPackage\files2_sub3\FileName.Extension", | ||
| 97 | }; | ||
| 98 | |||
| 99 | Build("ComponentGroup.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 100 | } | ||
| 101 | |||
| 102 | [Fact] | ||
| 72 | public void CanHarvestFilesInDirectory() | 103 | public void CanHarvestFilesInDirectory() |
| 73 | { | 104 | { |
| 74 | BuildQueryAssertFiles("Directory.wxs", new[] | 105 | var expected = new[] |
| 75 | { | 106 | { |
| 76 | "test10.txt", | 107 | @"flsD7JQZm.Ts2375WMT.zsTxqCAf.s=PFiles\MsiPackage\files1_sub1\test10.txt", |
| 77 | "test120.txt", | 108 | @"flslrDWblm4pE.4i4jR58_XyYMmR8I=PFiles\MsiPackage\files1_sub1\files1_sub2\test120.txt", |
| 78 | "test2.txt", | 109 | @"flsj.cb0sFWqIPHPFSKJSEEaPDuAQ4=PFiles\MsiPackage\test2.txt", |
| 79 | "test3.txt", | 110 | @"flsaFu0CvigRX6Psea0ic6ZWevzLmI=PFiles\MsiPackage\test3.txt", |
| 80 | "test4.txt", | 111 | @"flsJBy_HKCNejalUyud4HisGqhd72E=PFiles\MsiPackage\test4.txt", |
| 81 | }); | 112 | }; |
| 113 | |||
| 114 | Build("Directory.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 82 | } | 115 | } |
| 83 | 116 | ||
| 84 | [Fact] | 117 | [Fact] |
| 85 | public void CanHarvestFilesInDirectoryRef() | 118 | public void CanHarvestFilesInDirectoryRef() |
| 86 | { | 119 | { |
| 87 | BuildQueryAssertFiles("DirectoryRef.wxs", new[] | 120 | var expected = new[] |
| 88 | { | 121 | { |
| 89 | "notatest.txt", | 122 | @"flsYgiwrDUkZnBEK6iUMkxxaJlD8yQ=PFiles\MsiPackage\test1.txt", |
| 90 | "pleasedontincludeme.dat", | 123 | @"flsj.cb0sFWqIPHPFSKJSEEaPDuAQ4=PFiles\MsiPackage\test2.txt", |
| 91 | "test1.txt", | 124 | @"flslrDWblm4pE.4i4jR58_XyYMmR8I=PFiles\MsiPackage\files1_sub1\files1_sub2\test120.txt", |
| 92 | "test120.txt", | 125 | @"flsIpBotASYdALXxudRqekdQdKEKdQ=PFiles\MsiPackage\notatest.txt", |
| 93 | "test2.txt", | 126 | @"flsaFu0CvigRX6Psea0ic6ZWevzLmI=PFiles\MsiPackage\test3.txt", |
| 94 | "test20.txt", | 127 | @"flsJBy_HKCNejalUyud4HisGqhd72E=PFiles\MsiPackage\test4.txt", |
| 95 | "test21.txt", | 128 | @"flsLXU67KiOVU00lZL1jaDaBVpg.Dw=PFiles\MsiPackage\files2_sub2\pleasedontincludeme.dat", |
| 96 | "test3.txt", | 129 | @"fls05.yw49T0FVAq3Wvq2ihNp3KWfI=PFiles\MsiPackage\files2_sub2\test20.txt", |
| 97 | "test4.txt", | 130 | @"flsf0falU_gCTJjtbSCNiFpJQ1d8EM=PFiles\MsiPackage\files2_sub2\test21.txt", |
| 98 | }); | 131 | }; |
| 132 | |||
| 133 | Build("DirectoryRef.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 99 | } | 134 | } |
| 100 | 135 | ||
| 101 | [Fact] | 136 | [Fact] |
| 102 | public void CanHarvestFilesInFeature() | 137 | public void CanHarvestFilesInFeature() |
| 103 | { | 138 | { |
| 104 | var rows = BuildAndQueryComponentFileDirectoryTables("Feature.wxs"); | 139 | var expected = new[] |
| 140 | { | ||
| 141 | @"flsFGp4MRR_h3Qm.CuBFwC0AJo6b6M=PFiles\Example Product\test2.txt", | ||
| 142 | @"flsTCB.ifIor30C7HfezIDjMB3mrdk=PFiles\Example Product\Assets\test3.txt", | ||
| 143 | @"flsTIP5QnXmYzSzwEM2casYcyn1eR4=PFiles\Example Product\Assets\test4.txt", | ||
| 144 | }; | ||
| 105 | 145 | ||
| 106 | AssertFileComponentIds(3, rows); | 146 | Build("Feature.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); |
| 107 | } | 147 | } |
| 108 | 148 | ||
| 109 | [Fact] | 149 | [Fact] |
| 110 | public void CanHarvestFilesInFeatureGroup() | 150 | public void CanHarvestFilesInFeatureGroup() |
| 111 | { | 151 | { |
| 112 | BuildQueryAssertFiles("FeatureGroup.wxs", new[] | 152 | var expected = new[] |
| 113 | { | 153 | { |
| 114 | "FileName.Extension", | 154 | @"flsYgiwrDUkZnBEK6iUMkxxaJlD8yQ=PFiles\MsiPackage\test1.txt", |
| 115 | "notatest.txt", | 155 | @"flsj.cb0sFWqIPHPFSKJSEEaPDuAQ4=PFiles\MsiPackage\test2.txt", |
| 116 | "pleasedontincludeme.dat", | 156 | @"flsXCzqPnLIc2S0BUeTH_BHeaHJgbw=PFiles\MsiPackage\assets\notatest.txt", |
| 117 | "test1.txt", | 157 | @"flsiPGfLix0PMEZQ.BGdIfMp43g0m0=PFiles\MsiPackage\assets\test3.txt", |
| 118 | "test2.txt", | 158 | @"flsQp7vl8wg1R6a9pWOuj0y8X9tFdk=PFiles\MsiPackage\assets\test4.txt", |
| 119 | "test20.txt", | 159 | @"flsROfaiHyEp8AGBy4ZIkz26B8x0QE=PFiles\MsiPackage\assets\files2_sub2\pleasedontincludeme.dat", |
| 120 | "test21.txt", | 160 | @"flsR7cMdABXp6bHg2a89trPLf9NuKU=PFiles\MsiPackage\assets\files2_sub2\test20.txt", |
| 121 | "test3.txt", | 161 | @"flse0V.F.q.LFFjytlCECxjK5io7g0=PFiles\MsiPackage\assets\files2_sub2\test21.txt", |
| 122 | "test4.txt", | 162 | @"flsQk6.O4lkg78pGc4Ye64mosdl3hY=PFiles\MsiPackage\assets\files2_sub3\FileName.Extension", |
| 123 | }); | 163 | }; |
| 164 | |||
| 165 | Build("FeatureGroup.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 124 | } | 166 | } |
| 125 | 167 | ||
| 126 | [Fact] | 168 | [Fact] |
| 127 | public void CanHarvestFilesInStraightAndCrookedTrees() | 169 | public void CanHarvestFilesInStraightAndCrookedTrees() |
| 128 | { | 170 | { |
| 129 | var rows = BuildAndQueryComponentFileDirectoryTables("CrookedTree.wxs"); | 171 | var expected = new[] |
| 130 | var directoryRows = rows.Where(row => row.StartsWith("Directory:")).Select(d => d.Substring(10)).ToArray(); | ||
| 131 | |||
| 132 | var rootDirectoryId = directoryRows.Single(r => r.EndsWith("\troot")).Split('\t')[0]; | ||
| 133 | |||
| 134 | foreach (var ch in new[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'z' }) | ||
| 135 | { | 172 | { |
| 136 | var directoryRow = directoryRows.Single(r => r.EndsWith($"\t{ch}")); | 173 | @"flsKwXKj_Znab7ED_V5tgmdm6I35Mk=PFiles\root\a\file.ext", |
| 137 | var parentDirectory = directoryRow.Split('\t')[1]; | 174 | @"flsG_e554dKs4hJ6VckjXfvHVbrQ_c=PFiles\root\b\file.ext", |
| 138 | Assert.Equal(rootDirectoryId, parentDirectory); | 175 | @"fls6QPA6Lio8i18jzGOvfZpb2vxh9M=PFiles\root\c\file.ext", |
| 139 | } | 176 | @"flsfPnakkQEQynhlS0Z9wVZMXLjKx4=PFiles\root\d\file.ext", |
| 177 | @"fls9z8lqK0ZvjlnUEzCDIE7bF01zXU=PFiles\root\e\file.ext", | ||
| 178 | @"flsFqGICaLl5ZLPsdJY.Z2m6xC2Khs=PFiles\root\f\file.ext", | ||
| 179 | @"flsUT96SVd6kTNE4X7vBFL7r3Zl4sM=PFiles\root\g\file.ext", | ||
| 180 | @"fls.i3qm35eVOQoWBJFaj3c9792GKc=PFiles\root\h\file.ext", | ||
| 181 | @"flsgKGasxQIkFWfpTA6kQurqEL4Afg=PFiles\root\file.ext", | ||
| 182 | @"flsZGaHZm_l9M8jaQS8XSgxnlykcKI=PFiles\root\z\y\x\w\v\u\t\s\r\q\file.ext", | ||
| 183 | }; | ||
| 184 | |||
| 185 | Build("CrookedTree.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 140 | } | 186 | } |
| 141 | 187 | ||
| 142 | [Fact] | 188 | [Fact] |
| 143 | public void CanHarvestFilesInFeatureRef() | 189 | public void CanHarvestFilesInFeatureRef() |
| 144 | { | 190 | { |
| 145 | BuildQueryAssertFiles("FeatureRef.wxs", new[] | 191 | var expected = new[] |
| 146 | { | 192 | { |
| 147 | "FileName.Extension", | 193 | @"flsYgiwrDUkZnBEK6iUMkxxaJlD8yQ=PFiles\MsiPackage\test1.txt", |
| 148 | "notatest.txt", | 194 | @"flsj.cb0sFWqIPHPFSKJSEEaPDuAQ4=PFiles\MsiPackage\test2.txt", |
| 149 | "pleasedontincludeme.dat", | 195 | @"flsXCzqPnLIc2S0BUeTH_BHeaHJgbw=PFiles\MsiPackage\assets\notatest.txt", |
| 150 | "test1.txt", | 196 | @"flsiPGfLix0PMEZQ.BGdIfMp43g0m0=PFiles\MsiPackage\assets\test3.txt", |
| 151 | "test2.txt", | 197 | @"flsQp7vl8wg1R6a9pWOuj0y8X9tFdk=PFiles\MsiPackage\assets\test4.txt", |
| 152 | "test20.txt", | 198 | @"flsROfaiHyEp8AGBy4ZIkz26B8x0QE=PFiles\MsiPackage\assets\files2_sub2\pleasedontincludeme.dat", |
| 153 | "test21.txt", | 199 | @"flsR7cMdABXp6bHg2a89trPLf9NuKU=PFiles\MsiPackage\assets\files2_sub2\test20.txt", |
| 154 | "test3.txt", | 200 | @"flse0V.F.q.LFFjytlCECxjK5io7g0=PFiles\MsiPackage\assets\files2_sub2\test21.txt", |
| 155 | "test4.txt", | 201 | @"flsQk6.O4lkg78pGc4Ye64mosdl3hY=PFiles\MsiPackage\assets\files2_sub3\FileName.Extension", |
| 156 | }); | 202 | }; |
| 203 | |||
| 204 | Build("FeatureRef.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 157 | } | 205 | } |
| 158 | 206 | ||
| 159 | [Fact] | 207 | [Fact] |
| 160 | public void CanHarvestFilesInFragments() | 208 | public void CanHarvestFilesInFragments() |
| 161 | { | 209 | { |
| 162 | BuildQueryAssertFiles("Fragment.wxs", new[] | 210 | var expected = new[] |
| 163 | { | 211 | { |
| 164 | "notatest.txt", | 212 | @"flsOQDmBHyBKZnyRziE3.z5HjmBv4k=PFiles\MsiPackage\test1.txt", |
| 165 | "test1.txt", | 213 | @"flsHjzoVbTTY2jQbthZHKG7Rn4yMZo=PFiles\MsiPackage\test2.txt", |
| 166 | "test2.txt", | 214 | @"flsPLx4KqFVkbnYyg3Uo4QdiRLFbL8=PFiles\MsiPackage\notatest.txt", |
| 167 | "test3.txt", | 215 | @"fls4di7CtiJhJnEwixr8_c5G8k8aNY=PFiles\MsiPackage\test3.txt", |
| 168 | "test4.txt", | 216 | @"flsk5E532wcxn9MfpYQYRnrPi3dsOA=PFiles\MsiPackage\test4.txt", |
| 169 | }); | 217 | }; |
| 218 | |||
| 219 | Build("Fragment.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 170 | } | 220 | } |
| 171 | 221 | ||
| 172 | [Fact] | 222 | [Fact] |
| 173 | public void CanHarvestFilesInModules() | 223 | public void CanHarvestFilesInModules() |
| 174 | { | 224 | { |
| 175 | BuildQueryAssertFiles("Module.wxs", new[] | 225 | var expected = new[] |
| 176 | { | 226 | { |
| 177 | "notatest.txt", | 227 | @"flsgrgAVAsCQ8tCCxfnbBNis66623c.E535B765_1019_4A4F_B3EA_AE28870E6D73=PFiles\MergeModule\test1.txt", |
| 178 | "test1.txt", | 228 | @"flsDBWSWjpVSU3Zs33bREsJa2ygSQM.E535B765_1019_4A4F_B3EA_AE28870E6D73=PFiles\MergeModule\test2.txt", |
| 179 | "test2.txt", | 229 | @"flsehdwEdXusUijRShuTszSxwf8joA.E535B765_1019_4A4F_B3EA_AE28870E6D73=PFiles\MergeModule\test3.txt", |
| 180 | "test3.txt", | 230 | @"flsBvxG729t7hKBa4KOmfvNMPptZkM.E535B765_1019_4A4F_B3EA_AE28870E6D73=PFiles\MergeModule\test4.txt", |
| 181 | "test4.txt", | 231 | @"flskqOUVMfAE13k2h.ZkPhurwO4Y1c.E535B765_1019_4A4F_B3EA_AE28870E6D73=PFiles\MergeModule\notatest.txt", |
| 182 | }, isPackage: false); | 232 | }; |
| 233 | |||
| 234 | Build("Module.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected), isPackage: false); | ||
| 183 | } | 235 | } |
| 184 | 236 | ||
| 185 | [Fact] | 237 | [Fact] |
| 186 | public void CanHarvestFilesWithBindPaths() | 238 | public void CanHarvestFilesWithBindPaths() |
| 187 | { | 239 | { |
| 188 | BuildQueryAssertFiles("BindPaths.wxs", new[] | 240 | var expected = new[] |
| 189 | { | 241 | { |
| 190 | "FileName.Extension", | 242 | @"flsNNsTNrgmjASmTBbP.45J1F50dEc=PFiles\HarvestedFiles\test1.txt", |
| 191 | "test1.txt", | 243 | @"flsASLR5pHQzLmWRE.Snra7ndH7sIA=PFiles\HarvestedFiles\test2.txt", |
| 192 | "test10.txt", | 244 | @"flsTZFPiMHb.qfUxdGKQYrnXOhZ.8M=PFiles\HarvestedFiles\files1_sub1\test10.txt", |
| 193 | "test120.txt", | 245 | @"flsLGcTTZPIU3ELiWybqnm.PQ0Ih_g=PFiles\HarvestedFiles\files1_sub1\files1_sub2\test120.txt", |
| 194 | "test2.txt", | 246 | @"fls1Jx2Y9Vea_.WZBH_h2e79arvDRU=PFiles\HarvestedFiles\test3.txt", |
| 195 | "test20.txt", | 247 | @"flsJ9gNxWaau2X3ufphQuCV9WwAgcw=PFiles\HarvestedFiles\test4.txt", |
| 196 | "test21.txt", | 248 | @"flswcmX9dpMQytmD_5QA5aJ5szoQVA=PFiles\HarvestedFiles\files2_sub2\test20.txt", |
| 197 | "test3.txt", | 249 | @"flskKeCKFUtCYMuvw564rgPLJmyBx0=PFiles\HarvestedFiles\files2_sub2\test21.txt", |
| 198 | "test4.txt", | 250 | @"fls2agLZFnQwjoijShwT9Z0RwHyGrI=PFiles\HarvestedFiles\files2_sub3\FileName.Extension", |
| 199 | }); | 251 | }; |
| 200 | } | 252 | |
| 201 | 253 | Build("BindPaths.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | |
| 202 | [Fact] | ||
| 203 | public void HarvestedFilesUnderPackageWithAuthoredFeatureAreOrphaned() | ||
| 204 | { | ||
| 205 | var messages = BuildAndQueryComponentFileDirectoryTables("PackageWithoutDefaultFeature.wxs", isPackage: true, 267); | ||
| 206 | Assert.Equal(new[] | ||
| 207 | { | ||
| 208 | "267", | ||
| 209 | "267", | ||
| 210 | "267", | ||
| 211 | "267", | ||
| 212 | }, messages); | ||
| 213 | } | 254 | } |
| 214 | 255 | ||
| 215 | [Fact] | 256 | [Fact] |
| 216 | public void CanHarvestFilesInStandardDirectory() | 257 | public void CanHarvestFilesInStandardDirectory() |
| 217 | { | 258 | { |
| 218 | BuildQueryAssertFiles("StandardDirectory.wxs", new[] | 259 | var expected = new[] |
| 219 | { | 260 | { |
| 220 | "FileName.Extension", | 261 | @"flsxKKnXWKGChnZD8KSNY4Mwb48nHc=PFiles\MsiPackage\test1.txt", |
| 221 | "notatest.txt", | 262 | @"flsVa.JZ23qQ1vXrc1jjOLIyJMyuqM=PFiles\MsiPackage\test2.txt", |
| 222 | "pleasedontincludeme.dat", | 263 | @"fls4_TTxMCivlzpVJiyNHQRa2eU2ZA=PFiles\MsiPackage\files1_sub1\test10.txt", |
| 223 | "test1.txt", | 264 | @"flsBQqnyJp3XnmzomCYT_1qJqKLeSA=PFiles\MsiPackage\files1_sub1\files1_sub2\test120.txt", |
| 224 | "test10.txt", | 265 | @"flsbr7Ii_L1MRmxOImvY3N7np5FqAU=PFiles\MsiPackage\notatest.txt", |
| 225 | "test120.txt", | 266 | @"fls5VacfuX4Iub..BmTvssAOUcUI1o=PFiles\MsiPackage\test3.txt", |
| 226 | "test2.txt", | 267 | @"flsTtxen6j9kDjhKw2rnKSlYn5e2_k=PFiles\MsiPackage\test4.txt", |
| 227 | "test20.txt", | 268 | @"flsKEAYr7hAov7KfiRTjHg1VBg6T38=PFiles\MsiPackage\files2_sub2\pleasedontincludeme.dat", |
| 228 | "test21.txt", | 269 | @"flsvw4WMs4foeBokT9VUN3qjPDg8jc=PFiles\MsiPackage\files2_sub2\test20.txt", |
| 229 | "test3.txt", | 270 | @"flspraz8bfD0UXdCBW9CS2jr49hl1k=PFiles\MsiPackage\files2_sub2\test21.txt", |
| 230 | "test4.txt", | 271 | @"flsCgt3Noa1VJHlHG5HOVjD5vdJm5Q=PFiles\MsiPackage\files2_sub3\FileName.Extension", |
| 231 | }); | 272 | }; |
| 273 | |||
| 274 | Build("StandardDirectory.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 232 | } | 275 | } |
| 233 | 276 | ||
| 234 | [Fact] | 277 | [Fact] |
| 235 | public void CanHarvestFilesInFiveLines() | 278 | public void CanHarvestFilesInFiveLines() |
| 236 | { | 279 | { |
| 237 | BuildQueryAssertFiles("PackageFiveLiner.wxs", new[] | 280 | var expected = new[] |
| 238 | { | 281 | { |
| 239 | "FileName.Extension", | 282 | @"flsIpBotASYdALXxudRqekdQdKEKdQ=PFiles\Example Corporation MsiPackage\notatest.txt", |
| 240 | "notatest.txt", | 283 | @"flsaFu0CvigRX6Psea0ic6ZWevzLmI=PFiles\Example Corporation MsiPackage\test3.txt", |
| 241 | "pleasedontincludeme.dat", | 284 | @"flsJBy_HKCNejalUyud4HisGqhd72E=PFiles\Example Corporation MsiPackage\test4.txt", |
| 242 | "test20.txt", | 285 | @"flsLXU67KiOVU00lZL1jaDaBVpg.Dw=PFiles\Example Corporation MsiPackage\files2_sub2\pleasedontincludeme.dat", |
| 243 | "test21.txt", | 286 | @"fls05.yw49T0FVAq3Wvq2ihNp3KWfI=PFiles\Example Corporation MsiPackage\files2_sub2\test20.txt", |
| 244 | "test3.txt", | 287 | @"flsf0falU_gCTJjtbSCNiFpJQ1d8EM=PFiles\Example Corporation MsiPackage\files2_sub2\test21.txt", |
| 245 | "test4.txt", | 288 | @"fls6Dd0lNq_VzYLYjK7ty5WxNy5KCs=PFiles\Example Corporation MsiPackage\files2_sub3\FileName.Extension", |
| 246 | }); | 289 | }; |
| 290 | |||
| 291 | Build("PackageFiveLiner.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected)); | ||
| 247 | } | 292 | } |
| 248 | 293 | ||
| 249 | private static void BuildQueryAssertFiles(string file, string[] expectedFileNames, bool isPackage = true, int? exitCode = null) | 294 | private static void AssertFileIdsAndTargetPaths(string msiPath, string[] expected) |
| 250 | { | 295 | { |
| 251 | var rows = BuildAndQueryComponentFileDirectoryTables(file, isPackage, exitCode); | 296 | var pkg = new WixToolset.Dtf.WindowsInstaller.Package.InstallPackage(msiPath, |
| 297 | WixToolset.Dtf.WindowsInstaller.DatabaseOpenMode.ReadOnly); | ||
| 298 | var sortedExpected = expected.OrderBy(s => s); | ||
| 299 | var actual = pkg.Files.OrderBy(kvp => kvp.Key).Select(kvp => $"{kvp.Key}={kvp.Value.TargetPath}"); | ||
| 252 | 300 | ||
| 253 | var fileNames = AssertFileComponentIds(expectedFileNames.Length, rows); | 301 | Assert.Equal(sortedExpected, actual); |
| 254 | |||
| 255 | Assert.Equal(expectedFileNames, fileNames); | ||
| 256 | } | 302 | } |
| 257 | 303 | ||
| 258 | private static void BuildQueryDirectoryComponent(string file, string[] expectedFileNames, bool isPackage = true, int? exitCode = null) | 304 | private static void Build(string file, Action<string, WixRunnerResult> tester, bool isPackage = true) |
| 259 | { | ||
| 260 | var rows = BuildAndQueryComponentFileDirectoryTables(file, isPackage, exitCode); | ||
| 261 | |||
| 262 | var fileNames = AssertFileComponentIds(expectedFileNames.Length, rows); | ||
| 263 | |||
| 264 | Assert.Equal(expectedFileNames, fileNames); | ||
| 265 | } | ||
| 266 | |||
| 267 | private static string[] BuildAndQueryComponentFileDirectoryTables(string file, bool isPackage = true, int? exitCode = null) | ||
| 268 | { | 305 | { |
| 269 | var folder = TestData.Get("TestData", "HarvestFiles"); | 306 | var folder = TestData.Get("TestData", "HarvestFiles"); |
| 270 | 307 | ||
| @@ -288,57 +325,7 @@ namespace WixToolsetTest.CoreIntegration | |||
| 288 | 325 | ||
| 289 | var result = WixRunner.Execute(arguments); | 326 | var result = WixRunner.Execute(arguments); |
| 290 | 327 | ||
| 291 | if (exitCode.HasValue) | 328 | tester(msiPath, result); |
| 292 | { | ||
| 293 | Assert.Equal(exitCode.Value, result.ExitCode); | ||
| 294 | |||
| 295 | return result.Messages.Select(m => m.Id.ToString()).ToArray(); | ||
| 296 | } | ||
| 297 | else | ||
| 298 | { | ||
| 299 | result.AssertSuccess(); | ||
| 300 | |||
| 301 | return Query.QueryDatabase(msiPath, new[] { "Component", "File", "Directory" }) | ||
| 302 | .OrderBy(s => s) | ||
| 303 | .ToArray(); | ||
| 304 | } | ||
| 305 | } | ||
| 306 | } | ||
| 307 | |||
| 308 | private static string[] AssertFileComponentIds(int fileCount, string[] rows) | ||
| 309 | { | ||
| 310 | var componentRows = rows.Where(row => row.StartsWith("Component:")).ToArray(); | ||
| 311 | var fileRows = rows.Where(row => row.StartsWith("File:")).ToArray(); | ||
| 312 | |||
| 313 | Assert.Equal(componentRows.Length, fileRows.Length); | ||
| 314 | |||
| 315 | // Component id == Component keypath == File id | ||
| 316 | foreach (var componentRow in componentRows) | ||
| 317 | { | ||
| 318 | var columns = componentRow.Split(':', '\t'); | ||
| 319 | Assert.Equal(columns[1], columns[6]); | ||
| 320 | } | ||
| 321 | |||
| 322 | foreach (var fileRow in fileRows) | ||
| 323 | { | ||
| 324 | var columns = fileRow.Split(':', '\t'); | ||
| 325 | Assert.Equal(columns[1], columns[2]); | ||
| 326 | } | ||
| 327 | |||
| 328 | Assert.Equal(fileCount, componentRows.Length); | ||
| 329 | |||
| 330 | var files = fileRows.Select(row => row.Split('\t')[2]); | ||
| 331 | var lfns = files.Select(name => name.Split('|')); | ||
| 332 | |||
| 333 | return fileRows | ||
| 334 | .Select(row => row.Split('\t')[2]) | ||
| 335 | .Select(GetLFN) | ||
| 336 | .OrderBy(name => name).ToArray(); | ||
| 337 | |||
| 338 | static string GetLFN(string possibleSfnLfnPair) | ||
| 339 | { | ||
| 340 | var parts = possibleSfnLfnPair.Split('|'); | ||
| 341 | return parts[parts.Length - 1]; | ||
| 342 | } | 329 | } |
| 343 | } | 330 | } |
| 344 | } | 331 | } |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj b/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj index 7d7c9a0c..e0b5afd4 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj +++ b/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj | |||
| @@ -22,5 +22,6 @@ | |||
| 22 | 22 | ||
| 23 | <ItemGroup> | 23 | <ItemGroup> |
| 24 | <PackageReference Include="WixInternal.TestSupport" /> | 24 | <PackageReference Include="WixInternal.TestSupport" /> |
| 25 | <PackageReference Include="WixToolset.Dtf.WindowsInstaller.Package" /> | ||
| 25 | </ItemGroup> | 26 | </ItemGroup> |
| 26 | </Project> | 27 | </Project> |
