public void MetadataReferenceCache_CachesObjectCorrectly()
        {
            //// Arrange
            var objectToCache = new ObjectCacheTest();

            var cache = new MetadataReferenceCache();

            //// Act 1
            var stringCachedBefore = cache.GetString(ObjectCacheTest.TestStringCachedBefore);
            var stringCachedOnce   = ObjectCacheTest.TestStringCachedOnce;

            //// Assert 1

            // Assert that all equal objects that will be cached should be:
            // 1 - Equal.
            // 2 - Not the same reference.

            // Strings
            Assert.NotSame(objectToCache.StringCachedBefore, stringCachedBefore);
            Assert.Equal(objectToCache.StringCachedBefore, stringCachedBefore);

            Assert.NotSame(objectToCache.StringCachedDuring1, objectToCache.StringCachedDuring2);
            Assert.Equal(objectToCache.StringCachedDuring1, objectToCache.StringCachedDuring2);

            Assert.NotSame(objectToCache.StringCachedOnce, stringCachedOnce);
            Assert.Equal(objectToCache.StringCachedOnce, stringCachedOnce);

            // Versions
            Assert.NotSame(objectToCache.VersionCachedDuring1, objectToCache.VersionCachedDuring2);
            Assert.Equal(objectToCache.VersionCachedDuring1, objectToCache.VersionCachedDuring2);

            //// Act 2
            var cachedObject           = cache.GetObject(objectToCache);
            var cachedStringCachedOnce = cache.GetString(stringCachedOnce);

            //// Assert 2

            // Assert that all equal objects that were cached should be:
            // 1 - Equal to their original value.
            // 2 - The same reference.

            // Strings
            Assert.Same(objectToCache.StringCachedBefore, stringCachedBefore);
            Assert.Equal(objectToCache.StringCachedBefore, ObjectCacheTest.TestStringCachedBefore);

            Assert.Same(objectToCache.StringCachedDuring1, objectToCache.StringCachedDuring2);
            Assert.Equal(objectToCache.StringCachedDuring1, ObjectCacheTest.TestStringCachedDuring);

            Assert.Same(objectToCache.StringCachedOnce, cachedStringCachedOnce);
            Assert.Equal(objectToCache.StringCachedOnce, ObjectCacheTest.TestStringCachedOnce);

            // Check that uncached fields are untouched.
            Assert.Equal(objectToCache.DateTimeNeverCached, ObjectCacheTest.TestDateTimeNeverCached);
        }
        public void MetadataReferenceCache_ReturnsCachedString()
        {
            // Arrange
            var hello = "hello";
            var there = " there";

            // Using StringBuilder because if assigning to "hello there" directly results in a constant that is an equal reference.
            var string1 = new StringBuilder().Append(hello).Append(there).ToString();
            var string2 = new StringBuilder().Append(hello).Append(there).ToString();

            var cache = new MetadataReferenceCache();

            // Act
            var cachedString1 = cache.GetString(string1);
            var cachedString2 = cache.GetString(string2);

            // Assert
            Assert.Equal(string1, string2);
            Assert.NotSame(string1, string2);
            Assert.Same(cachedString1, cachedString2);
        }
示例#3
0
        private static V2FeedPackageInfo ParsePackage(XElement element, MetadataReferenceCache metadataCache)
        {
            var properties   = element.Element(_xnameProperties);
            var idElement    = properties.Element(_xnameId);
            var titleElement = element.Element(_xnameTitle);

            // If 'Id' element exist, use its value as accurate package Id
            // Otherwise, use the value of 'title' if it exist
            // Use the given Id as final fallback if all elements above don't exist
            string       identityId    = metadataCache.GetString(idElement?.Value ?? titleElement?.Value);
            string       versionString = properties.Element(_xnameVersion).Value;
            NuGetVersion version       = metadataCache.GetVersion(metadataCache.GetString(versionString));
            string       downloadUrl   = metadataCache.GetString(element.Element(_xnameContent).Attribute("src").Value);

            string title          = metadataCache.GetString(titleElement?.Value);
            string summary        = metadataCache.GetString(GetString(element, _xnameSummary));
            string description    = metadataCache.GetString(GetString(properties, _xnameDescription));
            string iconUrl        = metadataCache.GetString(GetString(properties, _xnameIconUrl));
            string licenseUrl     = metadataCache.GetString(GetString(properties, _xnameLicenseUrl));
            string projectUrl     = metadataCache.GetString(GetString(properties, _xnameProjectUrl));
            string reportAbuseUrl = metadataCache.GetString(GetString(properties, _xnameReportAbuseUrl));
            string tags           = metadataCache.GetString(GetString(properties, _xnameTags));
            string dependencies   = metadataCache.GetString(GetString(properties, _xnameDependencies));

            string downloadCount            = metadataCache.GetString(GetString(properties, _xnameDownloadCount));
            bool   requireLicenseAcceptance = StringComparer.OrdinalIgnoreCase.Equals(bool.TrueString, GetString(properties, _xnameRequireLicenseAcceptance));

            string packageHash          = metadataCache.GetString(GetString(properties, _xnamePackageHash));
            string packageHashAlgorithm = metadataCache.GetString(GetString(properties, _xnamePackageHashAlgorithm));

            NuGetVersion minClientVersion = null;

            var minClientVersionString = GetString(properties, _xnameMinClientVersion);

            if (!string.IsNullOrEmpty(minClientVersionString))
            {
                if (NuGetVersion.TryParse(minClientVersionString, out minClientVersion))
                {
                    minClientVersion = metadataCache.GetVersion(minClientVersionString);
                }
            }

            DateTimeOffset?created    = GetDate(properties, _xnameCreated);
            DateTimeOffset?lastEdited = GetDate(properties, _xnameLastEdited);
            DateTimeOffset?published  = GetDate(properties, _xnamePublished);

            IEnumerable <string> owners  = null;
            IEnumerable <string> authors = null;

            var authorNode = element.Element(_xnameAuthor);

            if (authorNode != null)
            {
                authors = authorNode.Elements(_xnameName).Select(e => metadataCache.GetString(e.Value));
            }

            return(new V2FeedPackageInfo(new PackageIdentity(identityId, version), title, summary, description, authors,
                                         owners, iconUrl, licenseUrl, projectUrl, reportAbuseUrl, tags, created, lastEdited, published,
                                         dependencies, requireLicenseAcceptance, downloadUrl, downloadCount, packageHash, packageHashAlgorithm,
                                         minClientVersion));
        }
示例#4
0
        private static FeedPackage ParsePackage(string id, XElement element, MetadataReferenceCache metadataCache)
        {
            var properties               = element.Element(_xnameProperties);
            var idElement                = properties.Element(_xnameId);
            var titleElement             = element.Element(_xnameTitle);
            var identityId               = metadataCache.GetString(idElement?.Value ?? titleElement?.Value ?? id);
            var versionString            = properties.Element(_xnameVersion).Value;
            var downloadUrl              = metadataCache.GetString(element.Element(_xnameContent).Attribute("src").Value);
            var title                    = metadataCache.GetString(titleElement?.Value);
            var summary                  = metadataCache.GetString(GetString(element, _xnameSummary));
            var description              = metadataCache.GetString(GetString(properties, _xnameDescription));
            var iconUrl                  = metadataCache.GetString(GetString(properties, _xnameIconUrl));
            var licenseUrl               = metadataCache.GetString(GetString(properties, _xnameLicenseUrl));
            var projectUrl               = metadataCache.GetString(GetString(properties, _xnameProjectUrl));
            var reportAbuseUrl           = metadataCache.GetString(GetString(properties, _xnameReportAbuseUrl));
            var tags                     = metadataCache.GetString(GetString(properties, _xnameTags));
            var dependencies             = metadataCache.GetString(GetString(properties, _xnameDependencies));
            var downloadCount            = metadataCache.GetString(GetString(properties, _xnameDownloadCount));
            var requireLicenseAcceptance = StringComparer.OrdinalIgnoreCase.Equals(bool.TrueString, GetString(properties, _xnameRequireLicenseAcceptance));
            var packageHash              = metadataCache.GetString(GetString(properties, _xnamePackageHash));
            var packageHashAlgorithm     = metadataCache.GetString(GetString(properties, _xnamePackageHashAlgorithm));
            var copyright                = metadataCache.GetString(GetString(properties, _xnameCopyright));
            var galleryDetailsUrl        = metadataCache.GetString(GetString(properties, _xnameGalleryDetailsUrl));
            var releaseNotes             = metadataCache.GetString(GetString(properties, _xnameReleaseNotes));
            var minClientVersionString   = GetString(properties, _xnameMinClientVersion);
            var created                  = GetDate(properties, _xnameCreated);
            var published                = GetDate(properties, _xnamePublished);
            var lastUpdated              = GetDate(properties, _xnameLastUpdated);
            var lastEdited               = GetDate(properties, _xnameLastEdited);
            var isAbsoluteLatestVersion  = StringComparer.OrdinalIgnoreCase.Equals(bool.TrueString, GetString(properties, _xnameIsAbsoluteLatestVersion));
            var isLatestVersion          = StringComparer.OrdinalIgnoreCase.Equals(bool.TrueString, GetString(properties, _xnameIsLatestVersion));
            var isPrerelease             = StringComparer.OrdinalIgnoreCase.Equals(bool.TrueString, GetString(properties, _xnameIsPrelease));
            var language                 = metadataCache.GetString(GetString(properties, _xnameLanguage));
            var licenseNames             = metadataCache.GetString(GetString(properties, _xnameLicenseNames));
            var licenseReportUrl         = metadataCache.GetString(GetString(properties, _xnameLicenseReportUrl));
            var packageUrl               = metadataCache.GetString(GetString(properties, _xnamePackageUrl));
            var packageSize              = GetLong(properties, _xnamePackageSize);
            var versionDownloadCount     = GetInt(properties, _xnameVersionDownloadCount);

            string authors    = null;
            var    authorNode = element.Element(_xnameAuthor);

            if (authorNode != null)
            {
                authors = string.Join(" ", authorNode.Elements(_xnameName).Select(e => metadataCache.GetString(e.Value)));
            }

            return(new FeedPackage
            {
                Authors = authors,
                Copyright = copyright,
                Created = created,
                Dependencies = dependencies,
                Description = description,
                DownloadCount = int.TryParse(downloadCount, out int d) ? d : 0,
                DownloadUrl = downloadUrl,
                GalleryDetailsUrl = galleryDetailsUrl,
                IconUrl = iconUrl,
                Id = identityId,
                IsAbsoluteLatestVersion = isAbsoluteLatestVersion,
                IsLatestVersion = isLatestVersion,
                IsPreRelease = isPrerelease,
                Language = language,
                LastUpdated = lastUpdated,
                LastEdited = lastEdited,
                LicenseNames = licenseNames,
                LicenseReportUrl = licenseReportUrl,
                LicenseUrl = licenseUrl,
                MinClientVersion = minClientVersionString,
                PackageHash = packageHash,
                PackageHashAlgorithm = packageHashAlgorithm,
                ProjectUrl = projectUrl,
                PackageSize = packageSize,
                PackageUrl = packageUrl,
                Published = published,
                ReleaseNotes = releaseNotes,
                ReportAbuseUrl = reportAbuseUrl,
                RequireLicenseAcceptance = requireLicenseAcceptance,
                Summary = summary,
                Tags = tags,
                Title = title,
                Version = versionString,
                VersionDownloadCount = versionDownloadCount
            });