public Facts(ITestOutputHelper output) { _id = "NuGet.Versioning"; _accessCondition = new Mock <IAccessCondition>(); _versionList = new VersionListData(new Dictionary <string, VersionPropertiesData> { { "2.0.0", new VersionPropertiesData(listed: true, semVer2: false) }, }); _cloudBlobClient = new Mock <ICloudBlobClient>(); _cloudBlobContainer = new Mock <ICloudBlobContainer>(); _cloudBlob = new Mock <ISimpleCloudBlob>(); _options = new Mock <IOptionsSnapshot <AzureSearchJobConfiguration> >(); _logger = output.GetLogger <VersionListDataClient>(); _config = new AzureSearchJobConfiguration { StorageContainer = "unit-test-container", }; _options .Setup(x => x.Value) .Returns(() => _config); _cloudBlobClient .Setup(x => x.GetContainerReference(It.IsAny <string>())) .Returns(() => _cloudBlobContainer.Object); _cloudBlobContainer .Setup(x => x.GetBlobReference(It.IsAny <string>())) .Returns(() => _cloudBlob.Object); _cloudBlob .Setup(x => x.UploadFromStreamAsync(It.IsAny <Stream>(), It.IsAny <AccessCondition>())) .Returns(Task.CompletedTask) .Callback <Stream, AccessCondition>((s, _) => { using (s) using (var buffer = new MemoryStream()) { s.CopyTo(buffer); var bytes = buffer.ToArray(); _savedBytes.Add(bytes); _savedStrings.Add(Encoding.UTF8.GetString(bytes)); } }); _cloudBlob .Setup(x => x.OpenReadAsync(It.IsAny <AccessCondition>())) .ThrowsAsync(new StorageException( new RequestResult { HttpStatusCode = (int)HttpStatusCode.NotFound, }, message: "Not found.", inner: null)); _cloudBlob .Setup(x => x.Properties) .Returns(new CloudBlockBlob(new Uri("https://example/blob")).Properties); _target = new VersionListDataClient( _cloudBlobClient.Object, _options.Object, _logger); }
public async Task SerializesVersionsInSemVerOrder() { var versionList = new VersionListData(new Dictionary <string, VersionPropertiesData> { { "2.0.0", new VersionPropertiesData(listed: true, semVer2: false) }, { "1.0.0-beta.2", new VersionPropertiesData(listed: true, semVer2: true) }, { "10.0.0", new VersionPropertiesData(listed: false, semVer2: false) }, { "1.0.0-beta.10", new VersionPropertiesData(listed: true, semVer2: true) }, }); await _target.TryReplaceAsync(_id, versionList, _accessCondition.Object); var json = Assert.Single(_savedStrings); Assert.Equal(@"{ ""VersionProperties"": { ""1.0.0-beta.2"": { ""Listed"": true, ""SemVer2"": true }, ""1.0.0-beta.10"": { ""Listed"": true, ""SemVer2"": true }, ""2.0.0"": { ""Listed"": true }, ""10.0.0"": {} } }", json); }
public async Task <ResultAndAccessCondition <VersionListData> > ReadAsync(string id) { var blobReference = Container.GetBlobReference(GetFileName(id)); _logger.LogInformation("Reading the version list for package ID {PackageId}.", id); VersionListData data; IAccessCondition accessCondition; try { using (var stream = await blobReference.OpenReadAsync(AccessCondition.GenerateEmptyCondition())) using (var streamReader = new StreamReader(stream)) using (var jsonTextReader = new JsonTextReader(streamReader)) { data = Serializer.Deserialize <VersionListData>(jsonTextReader); } accessCondition = AccessConditionWrapper.GenerateIfMatchCondition(blobReference.ETag); } catch (StorageException ex) when(ex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.NotFound) { data = new VersionListData(new Dictionary <string, VersionPropertiesData>()); accessCondition = AccessConditionWrapper.GenerateIfNotExistsCondition(); } return(new ResultAndAccessCondition <VersionListData>(data, accessCondition)); }
public async Task ReplaceAsync(string id, VersionListData data, IAccessCondition accessCondition) { using (var stream = new MemoryStream()) { using (var streamWriter = new StreamWriter( stream, encoding: new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true), bufferSize: 1024, leaveOpen: true)) using (var jsonTextWriter = new JsonTextWriter(streamWriter)) { Serializer.Serialize(jsonTextWriter, data); } stream.Position = 0; _logger.LogInformation("Replacing the version list for package ID {PackageId}.", id); var mappedAccessCondition = new AccessCondition { IfNoneMatchETag = accessCondition.IfNoneMatchETag, IfMatchETag = accessCondition.IfMatchETag, }; var blobReference = Container.GetBlobReference(GetFileName(id)); blobReference.Properties.ContentType = "application/json"; await blobReference.UploadFromStreamAsync( stream, mappedAccessCondition); } }
public VersionLists(VersionListData data) { var allVersions = data .VersionProperties .Select(p => new VersionProperties(p.Key, p.Value)) .OrderBy(x => x.ParsedVersion) .ToList(); _versionProperties = new SortedDictionary <NuGetVersion, KeyValuePair <string, VersionPropertiesData> >(); foreach (var version in allVersions) { _versionProperties.Add(version.ParsedVersion, KeyValuePair.Create(version.FullVersion, version.Data)); } _versionLists = new Dictionary <SearchFilters, FilteredVersionList>(); foreach (var pair in SearchFilterPredicates) { var searchFilter = pair.Key; var predicate = pair.Value; var listState = new FilteredVersionList(allVersions .Where(predicate) .Select(x => x.Filtered)); _versionLists.Add(searchFilter, listState); } }