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

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: 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 055b883e9364a894b1b77c7fe48a1220d93caefe..be6fda0d620870841d7f2fba9777c9ce0baac966 100644
--- a/content/browser/download/download_file_unittest.cc
+++ b/content/browser/download/download_file_unittest.cc
@@ -396,7 +396,8 @@ class DownloadFileTest : public testing::Test {
}
// Prepare two byte streams to write to the same file sink.
- void PrepareMultipleStreams(int64_t second_stream_length) {
+ void PrepareMultipleStreams(bool first_stream_write_all_data,
+ int64_t second_stream_length) {
// Create a sparse file.
ASSERT_TRUE(CreateDownloadFile(0, true, true));
base::FilePath initial_path(download_file_->FullPath());
@@ -405,6 +406,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.
@@ -421,8 +423,16 @@ 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);
+ }
+
+
SetupFinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, input_stream_, s0);
// Expectation on MockByteStreamReader for MultipleStreams tests:
@@ -433,7 +443,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();
@@ -903,7 +913,7 @@ TEST_F(DownloadFileTest, StreamNonEmptyError) {
//
// Activate both streams at the same time.
TEST_F(DownloadFileTest, MutipleStreamsWrite) {
- PrepareMultipleStreams(0);
+ PrepareMultipleStreams(false, 0);
EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
int64_t stream_0_length =
@@ -927,7 +937,7 @@ TEST_F(DownloadFileTest, MutipleStreamsWrite) {
// Activate and deplete one stream, later add the second stream.
TEST_F(DownloadFileTest, MutipleStreamsOneStreamFirst) {
- PrepareMultipleStreams(0);
+ PrepareMultipleStreams(false, 0);
int64_t stream_0_length =
static_cast<int64_t>(strlen(kTestData1) + strlen(kTestData2));
@@ -970,7 +980,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(stream_1_length);
+ PrepareMultipleStreams(false, stream_1_length);
EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
@@ -1000,4 +1010,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, 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