public async ValueTask <IReadOnlyCollection <VersionInfoContextInfo> > GetPackageVersionsAsync(
            PackageIdentity identity,
            IReadOnlyCollection <PackageSourceContextInfo> packageSources,
            bool includePrerelease,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(identity);
            Assumes.NotNullOrEmpty(packageSources);

            string cacheId = PackageSearchMetadataCacheItem.GetCacheId(identity.Id, includePrerelease, packageSources);
            PackageSearchMetadataCacheItem?backgroundDataCache = PackageSearchMetadataMemoryCache.Get(cacheId) as PackageSearchMetadataCacheItem;

            if (backgroundDataCache != null)
            {
                return(await backgroundDataCache.AllVersionsContextInfo);
            }

            IPackageMetadataProvider packageMetadataProvider = await GetPackageMetadataProviderAsync(packageSources, cancellationToken);

            IPackageSearchMetadata packageMetadata = await packageMetadataProvider.GetPackageMetadataAsync(identity, includePrerelease, cancellationToken);

            IEnumerable <VersionInfo> versions = await packageMetadata.GetVersionsAsync();

            return(await Task.WhenAll(versions.Select(v => VersionInfoContextInfo.CreateAsync(v).AsTask())));
        }
        public void SerializeThenDeserialize_WithValidArguments_RoundTrips(VersionInfoContextInfo expectedResult)
        {
            var formatters = new IMessagePackFormatter[]
            {
                PackageSearchMetadataContextInfoFormatter.Instance,
                PackageVulnerabilityMetadataContextInfoFormatter.Instance
            };
            var resolvers = new IFormatterResolver[] { MessagePackSerializerOptions.Standard.Resolver };
            var options   = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData).WithResolver(CompositeResolver.Create(formatters, resolvers));

            VersionInfoContextInfo?actualResult = SerializeThenDeserialize(VersionInfoContextInfoFormatter.Instance, expectedResult, options);

            Assert.NotNull(actualResult);
            Assert.Equal(expectedResult.DownloadCount, actualResult !.DownloadCount);
            Assert.Equal(expectedResult.Version, actualResult.Version);
            Assert.Equal(expectedResult.PackageDeprecationMetadata is null, actualResult.PackageDeprecationMetadata is null);

            if (expectedResult.PackageDeprecationMetadata is object)
            {
                Assert.Equal(expectedResult.PackageDeprecationMetadata.Message, actualResult.PackageDeprecationMetadata !.Message);
            }

            Assert.Equal(expectedResult.PackageSearchMetadata is null, actualResult.PackageSearchMetadata is null);

            if (expectedResult.PackageSearchMetadata is object)
            {
                Assert.Equal(expectedResult.PackageSearchMetadata.Identity, actualResult.PackageSearchMetadata !.Identity);
            }
        }
        private async ValueTask <IReadOnlyCollection <VersionInfoContextInfo> > GetVersionInfoContextInfoAsync()
        {
            IEnumerable <VersionInfo> versions = await _packageSearchMetadata.GetVersionsAsync();

            IEnumerable <Task <VersionInfoContextInfo> > versionContextInfoTasks = versions.Select(async v => await VersionInfoContextInfo.CreateAsync(v));

            return(await Task.WhenAll(versionContextInfoTasks));
        }