Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(944)

Unified Diff: content/browser/download/download_file_unittest.cc

Issue 2744793003: Move the logic to determine how much data can be written to another function (Closed)
Patch Set: comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/download/download_file_unittest.cc
diff --git a/content/browser/download/download_file_unittest.cc b/content/browser/download/download_file_unittest.cc
index f61b5a0d4e65dbcc2fabadf86e9dab36af98b1a0..d2baf16188590f1f488c0f3514a9f066eb7efc9a 100644
--- a/content/browser/download/download_file_unittest.cc
+++ b/content/browser/download/download_file_unittest.cc
@@ -395,10 +395,13 @@ class DownloadFileTest : public testing::Test {
return result_reason;
}
+
// Prepare two byte streams to write to the same file sink. If
// |first_stream_completes_early| is true, the first stream will complete
- // before the second stream starts.
+ // before the second stream starts. If |first_stream_write_all_data| is true,
+ // the first stream will write all the data before the 2nd stream starts.
void PrepareMultipleStreams(bool first_stream_completes_early,
+ bool first_stream_write_all_data,
int64_t second_stream_length) {
// Create a sparse file.
ASSERT_TRUE(CreateDownloadFile(0, true, true));
@@ -408,6 +411,7 @@ class DownloadFileTest : public testing::Test {
const char* stream_0_data[] = {kTestData1, kTestData2};
const char* stream_1_data[] = {kTestData4, kTestData5};
+ const char* all_data[] = {kTestData1, kTestData2, kTestData4, kTestData5};
size_t stream_1_offset = strlen(kTestData1) + strlen(kTestData2);
// Register second SourceStream entry for the second stream.
@@ -424,8 +428,15 @@ class DownloadFileTest : public testing::Test {
::testing::Sequence s0;
::testing::Sequence s1;
- SetupDataAppend(stream_1_data, 2, input_stream_1_, s1, stream_1_offset);
- SetupDataAppend(stream_0_data, 2, input_stream_, s0, 0);
+ if (first_stream_write_all_data) {
+ SetupDataAppend(all_data, 4, input_stream_, s0, 0);
+ // The 2nd stream will abort after the first read
+ SetupDataAppend(stream_1_data, 1, input_stream_1_, s1, stream_1_offset);
+ } else {
+ SetupDataAppend(stream_0_data, 2, input_stream_, s0, 0);
+ SetupDataAppend(stream_1_data, 2, input_stream_1_, s1, stream_1_offset);
+ }
+
// If the first stream doesn't finish before the second stream starts
// writing, its length will be cut short by the second stream. So
// STREAM_COMPLETE will never get called.
@@ -442,7 +453,7 @@ class DownloadFileTest : public testing::Test {
// The stream may terminate in the middle and less Read calls are expected.
// 3. GetStatus: Only called if the stream is completed and last Read call
// returns STREAM_COMPLETE.
- if (second_stream_length == 0)
+ if (second_stream_length == 0 && !first_stream_write_all_data)
SetupFinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, input_stream_1_, s1);
else
EXPECT_CALL(*input_stream_1_, RegisterCallback(_)).RetiresOnSaturation();
@@ -912,7 +923,7 @@ TEST_F(DownloadFileTest, StreamNonEmptyError) {
//
// Activate both streams at the same time.
TEST_F(DownloadFileTest, MutipleStreamsWrite) {
- PrepareMultipleStreams(false, 0);
+ PrepareMultipleStreams(false, false, 0);
EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
int64_t stream_0_length =
@@ -936,7 +947,7 @@ TEST_F(DownloadFileTest, MutipleStreamsWrite) {
// Activate and deplete one stream, later add the second stream.
TEST_F(DownloadFileTest, MutipleStreamsOneStreamFirst) {
- PrepareMultipleStreams(true, 0);
+ PrepareMultipleStreams(true, false, 0);
int64_t stream_0_length =
static_cast<int64_t>(strlen(kTestData1) + strlen(kTestData2));
@@ -979,7 +990,7 @@ TEST_F(DownloadFileTest, MutipleStreamsLimitedLength) {
int64_t stream_0_length =
static_cast<int64_t>(strlen(kTestData1) + strlen(kTestData2));
int64_t stream_1_length = static_cast<int64_t>(strlen(kTestData4)) - 1;
- PrepareMultipleStreams(false, stream_1_length);
+ PrepareMultipleStreams(false, false, stream_1_length);
EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
@@ -1009,4 +1020,33 @@ TEST_F(DownloadFileTest, MutipleStreamsLimitedLength) {
DestroyDownloadFile(0, false);
}
+// Two streams write to one sink, the first stream writes the whole file before
+// the seconds stream was able to start
+TEST_F(DownloadFileTest, MutipleStreamsFirstStreamWriteAllData) {
+ PrepareMultipleStreams(true, true, 0);
+ int64_t stream_0_length =
+ static_cast<int64_t>(strlen(kTestData1) + strlen(kTestData2) +
+ strlen(kTestData4) + strlen(kTestData5));
+ int64_t stream_1_length =
+ static_cast<int64_t>(strlen(kTestData4) + strlen(kTestData5));
+ sink_callback_.Run();
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
+
+ download_file_->AddByteStream(
+ std::unique_ptr<MockByteStreamReader>(input_stream_1_),
+ stream_0_length - stream_1_length);
+ base::RunLoop().RunUntilIdle();
+
+ SourceStreamTestData stream_data_0(0, stream_0_length, true);
+ SourceStreamTestData stream_data_1(
+ stream_0_length - stream_1_length, 0, true);
+ VerifySourceStreamsStates(stream_data_0);
+ VerifySourceStreamsStates(stream_data_1);
+ EXPECT_EQ(stream_0_length, TotalBytesReceived());
+
+ DestroyDownloadFile(0);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698