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

Unified Diff: download_action_unittest.cc

Issue 5009009: AU: Fix potential issues with premature destruction of HTTP fetchers. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/update_engine.git@master
Patch Set: review comments Created 10 years, 1 month 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
« no previous file with comments | « download_action.cc ('k') | http_fetcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: download_action_unittest.cc
diff --git a/download_action_unittest.cc b/download_action_unittest.cc
index 2f37dfbfdbc59a0d527cc29e2889d9a8fcf7ccd1..8135841a9011ba49bddb644f83ecf6a1a9d1f8ab 100644
--- a/download_action_unittest.cc
+++ b/download_action_unittest.cc
@@ -49,9 +49,11 @@ class DownloadActionTestProcessorDelegate : public ActionProcessorDelegate {
g_main_loop_quit(loop_);
vector<char> found_data;
ASSERT_TRUE(utils::ReadFile(path_, &found_data));
- ASSERT_EQ(expected_data_.size(), found_data.size());
- for (unsigned i = 0; i < expected_data_.size(); i++) {
- EXPECT_EQ(expected_data_[i], found_data[i]);
+ if (expected_code_ != kActionCodeDownloadWriteError) {
+ ASSERT_EQ(expected_data_.size(), found_data.size());
+ for (unsigned i = 0; i < expected_data_.size(); i++) {
+ EXPECT_EQ(expected_data_[i], found_data[i]);
+ }
}
processing_done_called_ = true;
}
@@ -74,6 +76,24 @@ class DownloadActionTestProcessorDelegate : public ActionProcessorDelegate {
ActionExitCode expected_code_;
};
+class TestDirectFileWriter : public DirectFileWriter {
+ public:
+ TestDirectFileWriter() : fail_write_(0), current_write_(0) {}
+ void set_fail_write(int fail_write) { fail_write_ = fail_write; }
+
+ virtual ssize_t Write(const void* bytes, size_t count) {
+ if (++current_write_ == fail_write_) {
+ return -EINVAL;
+ }
+ return DirectFileWriter::Write(bytes, count);
+ }
+
+ private:
+ // If positive, fail on the |fail_write_| call to Write.
+ int fail_write_;
+ int current_write_;
+};
+
struct EntryPointArgs {
const vector<char> *data;
GMainLoop *loop;
@@ -98,12 +118,14 @@ gboolean StartProcessorInRunLoop(gpointer data) {
void TestWithData(const vector<char>& data,
bool hash_test,
bool size_test,
+ int fail_write,
bool use_download_delegate) {
GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
// TODO(adlr): see if we need a different file for build bots
ScopedTempFile output_temp_file;
- DirectFileWriter writer;
+ TestDirectFileWriter writer;
+ writer.set_fail_write(fail_write);
// We pull off the first byte from data and seek past it.
@@ -134,8 +156,7 @@ void TestWithData(const vector<char>& data,
if (data.size() > kMockHttpFetcherChunkSize)
EXPECT_CALL(download_delegate,
BytesReceived(1 + kMockHttpFetcherChunkSize, _));
-
- EXPECT_CALL(download_delegate, BytesReceived(_, _)).Times(AtLeast(1));
+ EXPECT_CALL(download_delegate, BytesReceived(_, _)).Times(AtLeast(1));
EXPECT_CALL(download_delegate, SetDownloadStatus(false)).Times(1);
}
ActionExitCode expected_code = kActionCodeSuccess;
@@ -143,6 +164,8 @@ void TestWithData(const vector<char>& data,
expected_code = kActionCodeDownloadHashMismatchError;
else if (size_test)
expected_code = kActionCodeDownloadSizeMismatchError;
+ else if (fail_write > 0)
+ expected_code = kActionCodeDownloadWriteError;
DownloadActionTestProcessorDelegate delegate(expected_code);
delegate.loop_ = loop;
delegate.expected_data_ = vector<char>(data.begin() + 1, data.end());
@@ -168,6 +191,7 @@ TEST(DownloadActionTest, SimpleTest) {
TestWithData(small,
false, // hash_test
false, // size_test
+ 0, // fail_write
true); // use_download_delegate
}
@@ -176,14 +200,26 @@ TEST(DownloadActionTest, LargeTest) {
char c = '0';
for (unsigned int i = 0; i < big.size(); i++) {
big[i] = c;
- if ('9' == c)
- c = '0';
- else
- c++;
+ c = ('9' == c) ? '0' : c + 1;
+ }
+ TestWithData(big,
+ false, // hash_test
+ false, // size_test
+ 0, // fail_write
+ true); // use_download_delegate
+}
+
+TEST(DownloadActionTest, FailWriteTest) {
+ vector<char> big(5 * kMockHttpFetcherChunkSize);
+ char c = '0';
+ for (unsigned int i = 0; i < big.size(); i++) {
+ big[i] = c;
+ c = ('9' == c) ? '0' : c + 1;
}
TestWithData(big,
false, // hash_test
false, // size_test
+ 2, // fail_write
true); // use_download_delegate
}
@@ -194,6 +230,7 @@ TEST(DownloadActionTest, BadHashTest) {
TestWithData(small,
true, // hash_test
false, // size_test
+ 0, // fail_write
true); // use_download_delegate
}
@@ -203,6 +240,7 @@ TEST(DownloadActionTest, BadSizeTest) {
TestWithData(small,
false, // hash_test
true, // size_test
+ 0, // fail_write
true); // use_download_delegate
}
@@ -213,6 +251,7 @@ TEST(DownloadActionTest, NoDownloadDelegateTest) {
TestWithData(small,
false, // hash_test
false, // size_test
+ 0, // fail_write
false); // use_download_delegate
}
« no previous file with comments | « download_action.cc ('k') | http_fetcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698