| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- // Copyright (c) .NET Foundation. All rights reserved.
- // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
- using System;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Xml.Linq;
- using Microsoft.Extensions.Logging.Abstractions;
- using Xunit;
- namespace Microsoft.AspNetCore.DataProtection.Repositories
- {
- public class FileSystemXmlRepositoryTests
- {
- [Fact]
- public void DefaultKeyStorageDirectory_Property()
- {
- var baseDir = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
- ? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ASP.NET")
- : Path.Combine(Environment.GetEnvironmentVariable("HOME"), ".aspnet");
- var expectedDir = new DirectoryInfo(Path.Combine(baseDir, "DataProtection-Keys")).FullName;
- // Act
- var defaultDirInfo = FileSystemXmlRepository.DefaultKeyStorageDirectory;
- // Assert
- Assert.Equal(expectedDir, defaultDirInfo.FullName);
- }
- [Fact]
- public void Directory_Property()
- {
- WithUniqueTempDirectory(dirInfo =>
- {
- // Arrange
- var repository = new FileSystemXmlRepository(dirInfo, NullLoggerFactory.Instance);
- // Act
- var retVal = repository.Directory;
- // Assert
- Assert.Equal(dirInfo, retVal);
- });
- }
- [Fact]
- public void GetAllElements_EmptyOrNonexistentDirectory_ReturnsEmptyCollection()
- {
- WithUniqueTempDirectory(dirInfo =>
- {
- // Arrange
- var repository = new FileSystemXmlRepository(dirInfo, NullLoggerFactory.Instance);
- // Act
- var allElements = repository.GetAllElements();
- // Assert
- Assert.Equal(0, allElements.Count);
- });
- }
- [Fact]
- public void StoreElement_WithValidFriendlyName_UsesFriendlyName()
- {
- WithUniqueTempDirectory(dirInfo =>
- {
- // Arrange
- var element = XElement.Parse("<element1 />");
- var repository = new FileSystemXmlRepository(dirInfo, NullLoggerFactory.Instance);
- // Act
- repository.StoreElement(element, "valid-friendly-name");
- // Assert
- var fileInfos = dirInfo.GetFiles();
- var fileInfo = fileInfos.Single(); // only one file should've been created
- // filename should be "valid-friendly-name.xml"
- Assert.Equal("valid-friendly-name.xml", fileInfo.Name, StringComparer.OrdinalIgnoreCase);
- // file contents should be "<element1 />"
- var parsedElement = XElement.Parse(File.ReadAllText(fileInfo.FullName));
- XmlAssert.Equal("<element1 />", parsedElement);
- });
- }
- [Theory]
- [InlineData(null)]
- [InlineData("")]
- [InlineData(" ")]
- [InlineData("..")]
- [InlineData("not*friendly")]
- public void StoreElement_WithInvalidFriendlyName_CreatesNewGuidAsName(string friendlyName)
- {
- WithUniqueTempDirectory(dirInfo =>
- {
- // Arrange
- var element = XElement.Parse("<element1 />");
- var repository = new FileSystemXmlRepository(dirInfo, NullLoggerFactory.Instance);
- // Act
- repository.StoreElement(element, friendlyName);
- // Assert
- var fileInfos = dirInfo.GetFiles();
- var fileInfo = fileInfos.Single(); // only one file should've been created
- // filename should be "{GUID}.xml"
- var filename = fileInfo.Name;
- Assert.EndsWith(".xml", filename, StringComparison.OrdinalIgnoreCase);
- var filenameNoSuffix = filename.Substring(0, filename.Length - ".xml".Length);
- Guid parsedGuid = Guid.Parse(filenameNoSuffix);
- Assert.NotEqual(Guid.Empty, parsedGuid);
- // file contents should be "<element1 />"
- var parsedElement = XElement.Parse(File.ReadAllText(fileInfo.FullName));
- XmlAssert.Equal("<element1 />", parsedElement);
- });
- }
- [Fact]
- public void StoreElements_ThenRetrieve_SeesAllElements()
- {
- WithUniqueTempDirectory(dirInfo =>
- {
- // Arrange
- var repository = new FileSystemXmlRepository(dirInfo, NullLoggerFactory.Instance);
- // Act
- repository.StoreElement(new XElement("element1"), friendlyName: null);
- repository.StoreElement(new XElement("element2"), friendlyName: null);
- repository.StoreElement(new XElement("element3"), friendlyName: null);
- var allElements = repository.GetAllElements();
- // Assert
- var orderedNames = allElements.Select(el => el.Name.LocalName).OrderBy(name => name);
- Assert.Equal(new[] { "element1", "element2", "element3" }, orderedNames);
- });
- }
- /// <summary>
- /// Runs a test and cleans up the temp directory afterward.
- /// </summary>
- private static void WithUniqueTempDirectory(Action<DirectoryInfo> testCode)
- {
- string uniqueTempPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
- var dirInfo = new DirectoryInfo(uniqueTempPath);
- try
- {
- testCode(dirInfo);
- }
- finally
- {
- // clean up when test is done
- if (dirInfo.Exists)
- {
- dirInfo.Delete(recursive: true);
- }
- }
- }
- }
- }
|