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); }
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)); }
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 });