public void Given_NoUniqueLogFileName_When_RequestToLogAuditEntry_Then_NoFileWritten() { // Arrange var mydirMock = new Mock <IMyDirectory>(); var myFileMock = new Mock <IMyFile>(MockBehavior.Strict); myFileMock.Setup(f => f.Exists(It.IsAny <string>())).Returns(true); var myDateTimeMock = new Mock <IMyDateTime>(MockBehavior.Strict); var currentDate = new DateTime(2015, 06, 14); myDateTimeMock.Setup(dt => dt.UtcNow()).Returns(currentDate); var cleanerMock = new Mock <IOldLogCleaner>(); var config = new ToFileAuditLoggerConfig() { LogDirectory = @"FAKE:\" }; // Act var logger = new ToFileAuditLogger <PlainTextKey, DecryptPlainTextEntryWorkflowOptions>(config, mydirMock.Object, myFileMock.Object, myDateTimeMock.Object, cleanerMock.Object); logger.LogDecryption(new DecryptPlainTextEntryWorkflowOptions(), new EnvCryptDat(), new List <PlainTextKey>(), new List <EntriesDecrypterResult <PlainTextKey> >()); // Assert myFileMock.Verify(file => file.Exists(It.IsAny <string>()), Times.Exactly(config.MaxTriesToGetUniqueFileName + 1)); }
public OldLogCleaner( ToFileAuditLoggerConfig config, IMyDirectory myDirectory, IMyFile myFile, IMyFileInfoFactory myFileInfoFactory) { Contract.Requires <ArgumentNullException>(config != null, "options"); Contract.Requires <ArgumentNullException>(myDirectory != null, "myDirectory"); Contract.Requires <ArgumentNullException>(myFile != null, "myFile"); Contract.Requires <ArgumentNullException>(myFileInfoFactory != null, "myFileInfoFactory"); // _config = config; _myDirectory = myDirectory; _myFile = myFile; _myFileInfoFactory = myFileInfoFactory; }
public void Given_AesEntries_When_DecryptWithAudit_Then_FilesWrittenWithCorrectContent() { // Arrange // Generate random key const string keyName = "key to test audit"; var aesKeyGen = new AesKeyGenerator(); var aesKey = aesKeyGen.GetNewKey(new AesKeyGenerationOptions() { KeySize = GenerateAesKeyBuilder.DefaultAesKeySize, NewKeyName = keyName }); var keyLoaderMock = new Mock <IKeyLoader <AesKey, KeyFromFileDetails> >(MockBehavior.Strict); keyLoaderMock.Setup(l => l.Load(It.IsAny <KeyFromFileDetails>())) .Returns(aesKey); IUserStringConverter converter = new Utf16LittleEndianUserStringConverter(); const string categoryName = "my category"; const string entryName1 = "my entry"; const string entryName2 = "my entry2"; var datPoco = new EnvCryptDat() { Categories = new[] { new Category() { Name = categoryName, Entries = new[] { new Entry() { Name = entryName1, EncryptedValue = new[] { new byte[1] }, // not important for this test EncryptionAlgorithm = aesKey.Algorithm, KeyName = aesKey.Name, KeyHash = aesKey.GetHashCode() }, new Entry() { Name = entryName2, EncryptedValue = new[] { new byte[1] }, // not important for this test EncryptionAlgorithm = aesKey.Algorithm, KeyName = aesKey.Name, KeyHash = aesKey.GetHashCode() } } } } }; var datLoaderMock = new Mock <IDatLoader <DatFromFileLoaderOptions> >(); datLoaderMock.Setup(l => l.Load(It.IsAny <DatFromFileLoaderOptions>())) .Returns(datPoco); var encryptionAlgoMock = new Mock <ISegmentEncryptionAlgo <AesKey> >(); encryptionAlgoMock.Setup(a => a.Decrypt(It.IsAny <IList <byte[]> >(), aesKey)) .Returns(converter.Encode("not important for this test")); var processName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); var utcNow = new DateTime(2015, 01, 01); var dateTimeMock = new Mock <IMyDateTime>(); dateTimeMock.Setup(t => t.UtcNow()).Returns(utcNow); var fileInfoFactoryMock = new Mock <IMyFileInfoFactory>(); var fileInfoMock = new Mock <IMyFileInfo>(); fileInfoMock.Setup(f => f.CreationTimeUtc) .Returns(utcNow.AddDays(-2)); fileInfoFactoryMock.Setup(f => f.GetNewInstance(It.Is <string>(s => s.Contains(processName)))) .Returns <string>(s => new MyFileInfo(s)); fileInfoFactoryMock.Setup(f => f.GetNewInstance(It.IsRegex(@".+deleteme"))) .Returns(fileInfoMock.Object); using (var tempDir = new TempDir()) { var loggerConfig = new ToFileAuditLoggerConfig() { LogDirectory = tempDir.TempDirectory, NumberOfDaysSinceCreationToKeep = 1 }; var auditLogger = new ToFileAuditLogger <AesKey, DecryptEntryWorkflowOptions>( loggerConfig, new MyDirectory(), new MyFile(), dateTimeMock.Object, new OldLogCleaner(loggerConfig, new MyDirectory(), new MyFile(), fileInfoFactoryMock.Object)); // Act var deleteFile1Path = Path.Combine(tempDir.TempDirectory, ".deleteme.log"); File.WriteAllText(deleteFile1Path, "somerandomtext"); var deleteFile2Path = Path.Combine(tempDir.TempDirectory, "asd.deleteme.log"); File.WriteAllText(deleteFile2Path, "somerandomtext2"); const string datFilePath = @"C:\my dat file"; new DecryptAesEntryWorkflowBuilder() .WithAesSegmentEncryptionAlgo(encryptionAlgoMock.Object) .WithKeyLoader(keyLoaderMock.Object) .WithDatLoader(datLoaderMock.Object) .WithAuditLogger(auditLogger) .Build().Run(new DecryptEntryWorkflowOptions() { CategoryEntryPair = new[] { new CategoryEntryPair(categoryName, entryName1), new CategoryEntryPair(categoryName, entryName2) }, DatFilePath = datFilePath, KeyFilePaths = new[] { "null" } }); // Assert File.Exists(deleteFile1Path).Should().BeFalse(); File.Exists(deleteFile2Path).Should().BeFalse(); var expectedFilePath = Path.Combine(tempDir.TempDirectory, string.Format(loggerConfig.FileNameFormat, utcNow.ToString(ToFileAuditLogger <AesKey, DecryptEntryWorkflowOptions> .DateTimeFormatInFileName), processName) + loggerConfig.LogFileExtension); File.Exists(expectedFilePath) .Should().BeTrue(); var lines = File.ReadAllLines(expectedFilePath); lines.Should().HaveCount(5); lines[1].Should().Be(datFilePath); lines[3].Should().Be(categoryName + "\t" + entryName1 + "\t" + keyName + "\t" + EnvCryptAlgoEnum.Aes); lines[4].Should().Be(categoryName + "\t" + entryName2 + "\t" + keyName + "\t" + EnvCryptAlgoEnum.Aes); } }