// Uncomment this integration test only during investigations. // Create unit tests to test for specific error conditions it uncovers. // [TestMethod] public void IsThreadSafe() { const int NumberOfThreads = 16; const int NumberOfFilesPerThread = 64; var storage = new TransmissionStorage(); storage.Initialize(new ApplicationFolderProvider()); try { string s = new string('c', 500); byte[] content = Encoding.Unicode.GetBytes(s); var tasks = new Task[NumberOfThreads]; for (int t = 0; t < tasks.Length; t++) { tasks[t] = TaskEx.Run(async () => { await TaskEx.Delay(new Random(t).Next(50)); for (int f = 0; f < NumberOfFilesPerThread; f++) { storage.Enqueue(() => new Transmission(new Uri("http://address"), content, string.Empty, string.Empty)); storage.Dequeue(); } }); } TaskEx.WhenAll(tasks).GetAwaiter().GetResult(); } finally { while (storage.Dequeue() != null) { } } }
public void LoadsTransmissionFromTheOldestTransmissionFileInTheFolder() { var newestAddress = new Uri("http://newest"); StubPlatformFile newestFile = CreateTransmissionFile(newestAddress); newestFile.OnGetDateCreated = () => DateTimeOffset.MaxValue; var oldestAddress = new Uri("http://oldest"); StubPlatformFile oldestFile = CreateTransmissionFile(oldestAddress); oldestFile.OnGetDateCreated = () => DateTimeOffset.Now.AddDays(-1); // Create file newer than the 2 day old limit. var folder = CreateFolder(newestFile, oldestFile); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(); storage.Initialize(provider); Transmission dequeued = storage.Dequeue(); Assert.Equal(oldestAddress, dequeued.EndpointAddress); }
public void ReturnsNullIfApplicationFolderIsNotAvailable() { var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => null }; var storage = new TransmissionStorage(provider); Transmission result = storage.Dequeue(); Assert.Null(result); }
public void MakesSpaceAvailableForNextTransmission() { var storage = new TransmissionStorage(new StubApplicationFolderProvider()) { Capacity = 1 }; storage.Enqueue(() => new Transmission(new Uri("any://address"), new byte[1], "any/content", "any/encoding")); storage.Dequeue(); Assert.True(storage.Enqueue(() => new StubTransmission())); }
public void DoesNotMakeMoreSpaceAvailableWhenTransmissionCouldNotBeDequeued() { var storage = new TransmissionStorage(new StubApplicationFolderProvider()) { Capacity = 0 }; storage.Enqueue(() => new StubTransmission()); storage.Dequeue(); Assert.False(storage.Enqueue(() => new StubTransmission())); }
public void SkipsTransmissionFileBeingCurrentlyLoadedByAnotherThreadAndTriesLoadingNextFile() { var files = new List<IPlatformFile>(); StubPlatformFile fileBeingLoadedByAnotherThread = CreateTransmissionFile(); fileBeingLoadedByAnotherThread.OnRename = newName => { files.Remove(fileBeingLoadedByAnotherThread); throw new UnauthorizedAccessException(); }; StubPlatformFile nextFile = CreateTransmissionFile(); files.Add(fileBeingLoadedByAnotherThread); files.Add(nextFile); var folder = new StubPlatformFolder { OnGetFiles = () => files }; var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.NotNull(dequeued); }
public void DoesNotEndlesslyTryToLoadFileTheProcessNoLongerHasAccessTo() { StubPlatformFile inaccessibleFile = CreateFile("InaccessibleFile.trn"); inaccessibleFile.OnRename = newName => { throw new UnauthorizedAccessException(); }; StubPlatformFolder folder = CreateFolder(inaccessibleFile); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Assert.Throws<UnauthorizedAccessException>(() => storage.Dequeue()); }
public void LoadsTransmissionFromTemporaryFile() { var expectedAddress = new Uri("http://" + Guid.NewGuid().ToString("N")); StubPlatformFile file = CreateTransmissionFile(expectedAddress); StubPlatformFolder folder = CreateFolder(file); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.Equal(expectedAddress, dequeued.EndpointAddress); }
public void SkipsTransmissionFileAlreadyLoadedByAnotherThreadAndTriesLoadingNextFile() { var files = new List<IPlatformFile>(); StubPlatformFile loadedFile = CreateTransmissionFile(); loadedFile.OnRename = newName => { files.Remove(loadedFile); throw new FileNotFoundException(); }; StubPlatformFile nextFile = CreateTransmissionFile(); files.Add(loadedFile); files.Add(nextFile); var folder = new StubPlatformFolder { OnGetFiles = () => files }; var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.NotNull(dequeued); }
public void GetsMultipleFilesFromFolderOnceAndCachesThemToReduceDiskAccess() { int numberOfGetFilesAsyncCalls = 0; var files = new StubPlatformFile[] { CreateTransmissionFile(), CreateTransmissionFile() }; var folder = new StubPlatformFolder(); folder.OnGetFiles = () => { numberOfGetFilesAsyncCalls += 1; return files; }; var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Assert.NotNull(storage.Dequeue()); Assert.NotNull(storage.Dequeue()); Assert.Equal(2, numberOfGetFilesAsyncCalls); // 1 for initializing size and 1 for 1 dequeue }
public void ReturnsNullWhenFolderIsEmpty() { var storage = new TransmissionStorage(new StubApplicationFolderProvider()); Transmission transmission = storage.Dequeue(); Assert.Null(transmission); }
public void LoadsTransmissionOnlyFromFilesWithTransmissionExtension() { StubPlatformFile unknownFile = CreateFile("Unknown.file"); var expectedAddress = new Uri("http://" + Guid.NewGuid().ToString("N")); StubPlatformFile transmissionFile = CreateTransmissionFile(expectedAddress); StubPlatformFolder folder = CreateFolder(unknownFile, transmissionFile); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.Equal(expectedAddress, dequeued.EndpointAddress); }
public void LoadsTransmissionFromTheOldestTransmissionFileInTheFolder() { var newestAddress = new Uri("http://newest"); StubPlatformFile newestFile = CreateTransmissionFile(newestAddress); newestFile.OnGetDateCreated = () => DateTimeOffset.MaxValue; var oldestAddress = new Uri("http://oldest"); StubPlatformFile oldestFile = CreateTransmissionFile(oldestAddress); oldestFile.OnGetDateCreated = () => DateTimeOffset.MinValue; var folder = CreateFolder(newestFile, oldestFile); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.Equal(oldestAddress, dequeued.EndpointAddress); }
public void DeletesTemporaryFileAfterLoadingToFreeDiskSpace() { bool fileDeleted = false; StubPlatformFile file = CreateTransmissionFile(); file.OnDelete = () => fileDeleted = true; StubPlatformFolder folder = CreateFolder(file); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); storage.Dequeue(); Assert.True(fileDeleted); }
public void ClosesFileStreamToEnsureFileCanBeDeleted() { bool fileStreamDisposed = false; var fileStream = new StubStream { OnDispose = disposing => fileStreamDisposed = true }; StubPlatformFile file = CreateFile("TestFile" + TransmissionStorage.TransmissionFileExtension, fileStream); bool fileStreamDisposedBeforeDeletion = false; file.OnDelete = () => fileStreamDisposedBeforeDeletion = fileStreamDisposed; StubPlatformFolder folder = CreateFolder(file); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); storage.Dequeue(); Assert.True(fileStreamDisposedBeforeDeletion); }
public void ReturnsNullWhenFolderContainsSingleCorruptFile() { StubPlatformFile file = CreateTransmissionFile(); file.OnOpen = () => new MemoryStream(); StubPlatformFolder folder = CreateFolder(file); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.Null(dequeued); }
public void ReturnsNullIfApplicationFolderIsNotAccessible() { var folder = new StubPlatformFolder { OnGetFiles = () => { throw new UnauthorizedAccessException(); } }; var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission result = storage.Dequeue(); Assert.Null(result); }
public void SkipsCorruptTransmissionFileAndTriesLoadingFromNextTransmissionFile() { StubPlatformFile corruptFile = CreateFile("Corrupt" + TransmissionStorage.TransmissionFileExtension); StubPlatformFile validFile = CreateTransmissionFile(); StubPlatformFolder folder = CreateFolder(corruptFile, validFile); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Transmission dequeued = storage.Dequeue(); Assert.NotNull(dequeued); }
public void DoesNotCacheSameFilesTwiceWhenIvokedByMultipleThreads() { int numberOfGetFilesAsyncCalls = 0; var returnFiles = new ManualResetEventSlim(); var files = new StubPlatformFile[] { CreateTransmissionFile(), CreateTransmissionFile() }; var folder = new StubPlatformFolder(); folder.OnGetFiles = () => { numberOfGetFilesAsyncCalls += 1; returnFiles.Wait(); return files; }; var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); Task<Transmission> dequeue1 = TaskEx.Run(() => storage.Dequeue()); Task<Transmission> dequeue2 = TaskEx.Run(() => storage.Dequeue()); returnFiles.Set(); TaskEx.WhenAll(dequeue1, dequeue2).GetAwaiter().GetResult(); Assert.Equal(2, numberOfGetFilesAsyncCalls); // 1 for initializing size and 1 for 1 dequeue }
public void ChangesTransmissionFileExtensionToTemporaryToPreventConflictsWithOtherThreads() { string temporaryFileName = null; StubPlatformFile file = CreateTransmissionFile(); file.OnRename = desiredName => temporaryFileName = desiredName; StubPlatformFolder folder = CreateFolder(file); var provider = new StubApplicationFolderProvider { OnGetApplicationFolder = () => folder }; var storage = new TransmissionStorage(provider); storage.Dequeue(); Assert.True(temporaryFileName.EndsWith(TransmissionStorage.TemporaryFileExtension, StringComparison.OrdinalIgnoreCase)); }