Example #1
0
            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);
            }
Example #2
0
            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);
            }
Example #3
0
        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));
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
            }
        }