|
1 | | -// Copyright (c) .NET Foundation. All rights reserved. |
| 1 | +// Copyright (c) .NET Foundation. All rights reserved. |
2 | 2 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. |
3 | 3 |
|
4 | 4 | using System; |
@@ -69,6 +69,108 @@ public void GetNupkgMetadata_WhenNuspecNotFound_Throws() |
69 | 69 | } |
70 | 70 | } |
71 | 71 |
|
| 72 | + [Fact] |
| 73 | + public void GetNupkgMetadata_WhenNuspecAtRootLevel_Succeeds() |
| 74 | + { |
| 75 | + using (var stream = new MemoryStream()) |
| 76 | + { |
| 77 | + using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true)) |
| 78 | + { |
| 79 | + var entry = zipArchive.CreateEntry("package.nuspec"); |
| 80 | + using (var writer = new StreamWriter(entry.Open())) |
| 81 | + { |
| 82 | + writer.Write("<?xml version=\"1.0\"?><package xmlns=\"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\"><metadata><id>TestPackage</id><version>1.0.0</version><authors>Test</authors><description>Test</description></metadata></package>"); |
| 83 | + } |
| 84 | + } |
| 85 | + |
| 86 | + stream.Position = 0; |
| 87 | + |
| 88 | + var metadata = Utils.GetNupkgMetadata(stream, packageHash: null); |
| 89 | + |
| 90 | + Assert.NotNull(metadata); |
| 91 | + Assert.NotNull(metadata.Nuspec); |
| 92 | + } |
| 93 | + } |
| 94 | + |
| 95 | + [Fact] |
| 96 | + public void GetNupkgMetadata_WhenNuspecInSubdirectoryWithForwardSlash_Throws() |
| 97 | + { |
| 98 | + using (var stream = new MemoryStream()) |
| 99 | + { |
| 100 | + using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true)) |
| 101 | + { |
| 102 | + var entry = zipArchive.CreateEntry("subdir/package.nuspec"); |
| 103 | + using (var writer = new StreamWriter(entry.Open())) |
| 104 | + { |
| 105 | + writer.Write("<?xml version=\"1.0\"?><package></package>"); |
| 106 | + } |
| 107 | + } |
| 108 | + |
| 109 | + stream.Position = 0; |
| 110 | + |
| 111 | + var exception = Assert.Throws<InvalidDataException>( |
| 112 | + () => Utils.GetNupkgMetadata(stream, packageHash: null)); |
| 113 | + |
| 114 | + Assert.StartsWith("Unable to find nuspec", exception.Message); |
| 115 | + } |
| 116 | + } |
| 117 | + |
| 118 | + [Fact] |
| 119 | + public void GetNupkgMetadata_WhenNuspecInSubdirectoryWithBackslash_Throws() |
| 120 | + { |
| 121 | + using (var stream = new MemoryStream()) |
| 122 | + { |
| 123 | + using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true)) |
| 124 | + { |
| 125 | + var entry = zipArchive.CreateEntry("subdir\\package.nuspec"); |
| 126 | + using (var writer = new StreamWriter(entry.Open())) |
| 127 | + { |
| 128 | + writer.Write("<?xml version=\"1.0\"?><package></package>"); |
| 129 | + } |
| 130 | + } |
| 131 | + |
| 132 | + stream.Position = 0; |
| 133 | + |
| 134 | + var exception = Assert.Throws<InvalidDataException>( |
| 135 | + () => Utils.GetNupkgMetadata(stream, packageHash: null)); |
| 136 | + |
| 137 | + Assert.StartsWith("Unable to find nuspec", exception.Message); |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | + |
| 142 | + [Fact] |
| 143 | + public void GetNupkgMetadata_WhenNuspecAtRootAndInSubdirectory_UsesRootNuspec() |
| 144 | + { |
| 145 | + using (var stream = new MemoryStream()) |
| 146 | + { |
| 147 | + using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true)) |
| 148 | + { |
| 149 | + var subdirEntry = zipArchive.CreateEntry("subdir\\malicious.nuspec"); |
| 150 | + using (var writer = new StreamWriter(subdirEntry.Open())) |
| 151 | + { |
| 152 | + writer.Write("<?xml version=\"1.0\"?><package xmlns=\"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\"><metadata><id>MaliciousPackage</id><version>2.0.0</version><authors>MaliciousAuthor</authors><description>Malicious Description</description></metadata></package>"); |
| 153 | + } |
| 154 | + |
| 155 | + var rootEntry = zipArchive.CreateEntry("package.nuspec"); |
| 156 | + using (var writer = new StreamWriter(rootEntry.Open())) |
| 157 | + { |
| 158 | + writer.Write("<?xml version=\"1.0\"?><package xmlns=\"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\"><metadata><id>RootPackage</id><version>1.0.0</version><authors>RootAuthor</authors><description>Root Description</description></metadata></package>"); |
| 159 | + } |
| 160 | + } |
| 161 | + |
| 162 | + stream.Position = 0; |
| 163 | + |
| 164 | + var metadata = Utils.GetNupkgMetadata(stream, packageHash: null); |
| 165 | + |
| 166 | + Assert.NotNull(metadata); |
| 167 | + Assert.NotNull(metadata.Nuspec); |
| 168 | + var packageId = metadata.Nuspec.Descendants().FirstOrDefault(x => x.Name.LocalName == "id"); |
| 169 | + Assert.NotNull(packageId); |
| 170 | + Assert.Equal("RootPackage", packageId.Value); |
| 171 | + } |
| 172 | + } |
| 173 | + |
72 | 174 | [Theory] |
73 | 175 | [InlineData(null)] |
74 | 176 | [InlineData("")] |
|
0 commit comments