public void SingleSegmentUploader_UploadNonBinaryFile() { var fe = new InMemoryFrontEnd(); var metadata = CreateMetadata(_textFilePath, _textFileContents.Length); metadata.IsBinary = false; var progressTracker = new TestProgressTracker(); var ssu = new SingleSegmentUploader(0, metadata, fe, progressTracker); ssu.UseBackOffRetryStrategy = false; ssu.Upload(); //verify the entire file is identical to the source file var actualContents = fe.GetStreamContents(StreamPath); AssertExtensions.AreEqual(_textFileContents, actualContents, "Unexpected uploaded stream contents."); //verify the append blocks start/end on record boundaries var appendBlocks = fe.GetAppendBlocks(StreamPath); int lengthSoFar = 0; foreach (var append in appendBlocks) { lengthSoFar += append.Length; if (lengthSoFar < actualContents.Length) { Assert.Equal('\n', (char)append[append.Length - 1]); } } VerifyTracker(progressTracker, true); }
public void SingleSegmentUploader_UploadNonBinaryFileTooLargeRecord() { var fe = new InMemoryFrontEnd(); var metadata = CreateMetadata(_badTextFilePath, _badTextFileContents.Length); metadata.IsBinary = false; var progressTracker = new TestProgressTracker(); var ssu = new SingleSegmentUploader(0, metadata, fe, progressTracker); ssu.UseBackOffRetryStrategy = false; Assert.Throws <UploadFailedException>(() => ssu.Upload()); }
public void TestRetryBlock(int failCount) { bool expectSuccess = failCount < SingleSegmentUploader.MaxBufferUploadAttemptCount; int callCount = 0; var workingFrontEnd = new InMemoryFrontEnd(); var fe = new MockableFrontEnd(workingFrontEnd); fe.CreateStreamImplementation = (streamPath, overwrite, data, byteCount) => { callCount++; if (callCount <= failCount) { throw new IntentionalException(); } workingFrontEnd.CreateStream(streamPath, overwrite, data, byteCount); }; fe.AppendToStreamImplementation = (streamPath, data, offset, byteCount) => { callCount++; if (callCount <= failCount) { throw new IntentionalException(); } workingFrontEnd.AppendToStream(streamPath, data, offset, byteCount); }; var metadata = CreateMetadata(_smallFilePath, _smallFileContents.Length); var progressTracker = new TestProgressTracker(); var ssu = new SingleSegmentUploader(0, metadata, fe, progressTracker); ssu.UseBackOffRetryStrategy = false; if (expectSuccess) { ssu.Upload(); var actualContents = workingFrontEnd.GetStreamContents(StreamPath); AssertExtensions.AreEqual(_smallFileContents, actualContents, "Unexpected uploaded stream contents."); } else { Assert.Throws <IntentionalException>(() => { ssu.Upload(); }); } VerifyTracker(progressTracker, expectSuccess); }
public void SingleSegmentUploader_UploadSingleBlockStream() { var fe = new InMemoryFrontEnd(); var metadata = CreateMetadata(_smallFilePath, _smallFileContents.Length); var progressTracker = new TestProgressTracker(); var ssu = new SingleSegmentUploader(0, metadata, fe, progressTracker); ssu.UseBackOffRetryStrategy = false; ssu.Upload(); var actualContents = fe.GetStreamContents(StreamPath); AssertExtensions.AreEqual(_smallFileContents, actualContents, "Unexpected uploaded stream contents."); VerifyTracker(progressTracker, true); }
public void SingleSegmentUploader_UploadFileRange() { int length = _smallFileContents.Length / 3; var fe = new InMemoryFrontEnd(); var metadata = CreateMetadata(_smallFilePath, length); var progressTracker = new TestProgressTracker(); var ssu = new SingleSegmentUploader(0, metadata, fe, progressTracker); ssu.UseBackOffRetryStrategy = false; ssu.Upload(); var actualContents = fe.GetStreamContents(StreamPath); var expectedContents = new byte[length]; Array.Copy(_smallFileContents, 0, expectedContents, 0, length); AssertExtensions.AreEqual(expectedContents, actualContents, "Unexpected uploaded stream contents."); VerifyTracker(progressTracker, true); }
private void VerifyTracker(TestProgressTracker tracker, bool isSuccessfulUpload) { Assert.True(0 < tracker.Reports.Count, "No progress reports tracked"); long lastIndication = 0; for (int i = 0; i < tracker.Reports.Count; i++) { var currentReport = tracker.Reports[i]; if (!isSuccessfulUpload && i == tracker.Reports.Count - 1) { Assert.True(currentReport.IsFailed, "Last report did not indicate failure for a failed upload"); Assert.Equal(lastIndication, currentReport.UploadedByteCount); } else { Assert.False(currentReport.IsFailed, "Progress report indicated failure but failure was not expected"); Assert.True(lastIndication < currentReport.UploadedByteCount, "Progress reports are not in increasing order"); } lastIndication = currentReport.UploadedByteCount; } }