Skip to content

Commit e7807db

Browse files
committed
Serialize and deserialize full version string from cache file
1 parent 4a115f9 commit e7807db

5 files changed

Lines changed: 83 additions & 17 deletions

File tree

src/NuGet.Server/DataServices/Packages.svc.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using System.IO;
1010
using System.Linq;
1111
using System.ServiceModel.Web;
12-
using System.Text.RegularExpressions;
1312
using System.Web;
1413
using NuGet.Server.Infrastructure;
1514

src/NuGet.Server/Infrastructure/JsonNetPackagesSerializer.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public class JsonNetPackagesSerializer
1717

1818
private readonly JsonSerializer _serializer = new JsonSerializer
1919
{
20-
Formatting = Formatting.None
20+
Formatting = Formatting.None,
21+
NullValueHandling = NullValueHandling.Ignore
2122
};
2223

2324
public void Serialize(IEnumerable<ServerPackage> packages, Stream stream)
@@ -40,11 +41,11 @@ public IEnumerable<ServerPackage> Deserialize(Stream stream)
4041
{
4142
var packages = _serializer.Deserialize<SerializedServerPackages>(reader);
4243

43-
if (packages.SchemaVersion != CurrentSchemaVersion)
44+
if (packages == null || packages.SchemaVersion != CurrentSchemaVersion)
4445
{
4546
throw new SerializationException(
4647
$"The expected schema version of the packages file is '{CurrentSchemaVersion}', not " +
47-
$"'{packages.SchemaVersion}'.");
48+
$"'{packages?.SchemaVersion}'.");
4849
}
4950

5051
return packages.Packages;

src/NuGet.Server/Infrastructure/SemanticVersionJsonConverter.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,15 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
3939

4040
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
4141
{
42-
_serializer.Serialize(writer, value.ToString());
42+
var semanticVersion = value as SemanticVersion;
43+
if (semanticVersion != null)
44+
{
45+
_serializer.Serialize(writer, semanticVersion.ToOriginalString());
46+
}
47+
else
48+
{
49+
_serializer.Serialize(writer, value.ToString());
50+
}
4351
}
4452
}
4553
}

test/NuGet.Server.Tests/SemanticVersionJsonConverterTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public void CanConvertVersion()
3737
[InlineData("2.0.0.0", "2.0.0.0")]
3838
[InlineData("3.0.0-alpha1", "3.0.0-alpha1")]
3939
[InlineData("4.0.0-0test.zero", "4.0.0-0test.zero")]
40-
[InlineData("4.0.0-0test.zero+tagParses", "4.0.0-0test.zero")]
41-
[InlineData("4.0.0-test.more.parts+tagsHash", "4.0.0-test.more.parts")]
40+
[InlineData("4.0.0-0test.zero+tagParses", "4.0.0-0test.zero+tagParses")]
41+
[InlineData("4.0.0-test.more.parts+tagsHash", "4.0.0-test.more.parts+tagsHash")]
4242
public void SerializesSemanticVersionAsString(string version, string expected)
4343
{
4444
// Arrange

test/NuGet.Server.Tests/ServerPackageStoreTest.cs

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ namespace NuGet.Server.Tests
1212
{
1313
public class ServerPackageStoreTest
1414
{
15+
private const string PackageId = "NuGet.Versioning";
16+
private const string PackageVersionString = "3.5.0";
17+
private const string CacheFileName = "store.json";
18+
private const string SemVer2VersionString = "3.5.0-rc.1+githash";
19+
private static readonly SemanticVersion SemVer2Version = new SemanticVersion(SemVer2VersionString);
20+
1521
[Theory]
1622
[InlineData("[")]
1723
[InlineData("]")]
@@ -20,6 +26,7 @@ public class ServerPackageStoreTest
2026
[InlineData("[{")]
2127
[InlineData("[{}")]
2228
[InlineData("[]")]
29+
[InlineData("\0")]
2330
[InlineData("[{\"foo\": \"bar\"}]")]
2431
[InlineData("{\"SchemaVersion\":null,\"Packages\":[]}")]
2532
[InlineData("{\"SchemaVersion\":\"1.0.0\",\"Packages\":null}")]
@@ -29,44 +36,95 @@ public class ServerPackageStoreTest
2936
public void Constructor_IgnoresAndDeletesInvalidCacheFile(string content)
3037
{
3138
// Arrange
32-
var fileName = "store.json";
3339
var fileSystem = new Mock<IFileSystem>();
3440
fileSystem
35-
.Setup(x => x.FileExists(fileName))
41+
.Setup(x => x.FileExists(CacheFileName))
3642
.Returns(true);
3743
fileSystem
38-
.Setup(x => x.OpenFile(fileName))
44+
.Setup(x => x.OpenFile(CacheFileName))
3945
.Returns(() => new MemoryStream(Encoding.UTF8.GetBytes(content)));
4046

4147
// Act
42-
var actual = new ServerPackageStore(fileSystem.Object, fileName);
48+
var actual = new ServerPackageStore(fileSystem.Object, CacheFileName);
4349

4450
// Assert
4551
Assert.Empty(actual.GetAll());
46-
fileSystem.Verify(x => x.DeleteFile(fileName), Times.Once);
52+
fileSystem.Verify(x => x.DeleteFile(CacheFileName), Times.Once);
4753
}
4854

4955
[Theory]
5056
[InlineData("{\"SchemaVersion\":\"2.0.0\",\"Packages\":[]}", 0)]
51-
[InlineData("{\"SchemaVersion\":\"2.0.0\",\"Packages\":[{\"Id\":\"NuGet.Versioning\",\"Version\":\"3.5.0\"}]}", 1)]
57+
[InlineData("{\"SchemaVersion\":\"2.0.0\",\"Packages\":[{\"Id\":\"" + PackageId + "\",\"Version\":\"" + PackageVersionString + "\"}]}", 1)]
5258
public void Constructor_LeavesValidCacheFile(string content, int count)
5359
{
5460
// Arrange
55-
var fileName = "store.json";
5661
var fileSystem = new Mock<IFileSystem>();
5762
fileSystem
58-
.Setup(x => x.FileExists(fileName))
63+
.Setup(x => x.FileExists(CacheFileName))
5964
.Returns(true);
6065
fileSystem
61-
.Setup(x => x.OpenFile(fileName))
66+
.Setup(x => x.OpenFile(CacheFileName))
6267
.Returns(() => new MemoryStream(Encoding.UTF8.GetBytes(content)));
6368

6469
// Act
65-
var actual = new ServerPackageStore(fileSystem.Object, fileName);
70+
var actual = new ServerPackageStore(fileSystem.Object, CacheFileName);
6671

6772
// Assert
6873
Assert.Equal(count, actual.GetAll().Count());
6974
fileSystem.Verify(x => x.DeleteFile(It.IsAny<string>()), Times.Never);
7075
}
76+
77+
[Fact]
78+
public void Constructor_DeserializesSemVer2Version()
79+
{
80+
// Arrange
81+
var cacheFile = "{\"SchemaVersion\":\"2.0.0\",\"Packages\":[{\"Id\":\"" + PackageId + "\",\"Version\":\"" + SemVer2VersionString + "\"}]}";
82+
var fileSystem = new Mock<IFileSystem>();
83+
fileSystem
84+
.Setup(x => x.FileExists(CacheFileName))
85+
.Returns(true);
86+
fileSystem
87+
.Setup(x => x.OpenFile(CacheFileName))
88+
.Returns(() => new MemoryStream(Encoding.UTF8.GetBytes(cacheFile)));
89+
90+
// Act
91+
var actual = new ServerPackageStore(fileSystem.Object, CacheFileName);
92+
93+
// Assert
94+
Assert.Equal(1, actual.GetAll().Count());
95+
var package = actual.GetAll().First();
96+
Assert.Equal(SemVer2Version.ToOriginalString(), package.Version.ToOriginalString());
97+
Assert.Equal(SemVer2Version.ToFullString(), package.Version.ToFullString());
98+
Assert.Equal(SemVer2Version.ToNormalizedString(), package.Version.ToNormalizedString());
99+
}
100+
101+
[Fact]
102+
public void Persist_RetainsSemVer2Version()
103+
{
104+
// Arrange
105+
var fileSystem = new Mock<IFileSystem>();
106+
fileSystem
107+
.Setup(x => x.FileExists(CacheFileName))
108+
.Returns(false);
109+
110+
var memoryStream = new MemoryStream();
111+
fileSystem
112+
.Setup(x => x.CreateFile(CacheFileName))
113+
.Returns(memoryStream);
114+
115+
var actual = new ServerPackageStore(fileSystem.Object, CacheFileName);
116+
actual.Store(new ServerPackage
117+
{
118+
Id = PackageId,
119+
Version = SemVer2Version
120+
});
121+
122+
// Act
123+
actual.Persist();
124+
125+
// Assert
126+
var content = Encoding.UTF8.GetString(memoryStream.ToArray());
127+
Assert.Contains(SemVer2VersionString, content);
128+
}
71129
}
72130
}

0 commit comments

Comments
 (0)