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

Unified Diff: chrome/browser/chromeos/policy/system_log_uploader_unittest.cc

Issue 1216643002: Added unittests for SystemLogUploader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased patch. Created 5 years, 4 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
« no previous file with comments | « chrome/browser/chromeos/policy/system_log_uploader.cc ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
diff --git a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a1e16e7b76d817fac13fac6d8c75bc02eee4eb8a
--- /dev/null
+++ b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
@@ -0,0 +1,217 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/strings/stringprintf.h"
+#include "base/test/test_simple_task_runner.h"
+#include "base/time/time.h"
+#include "chrome/browser/chromeos/policy/system_log_uploader.h"
+#include "net/http/http_request_headers.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace policy {
+
+namespace {
+
+// The list of tested system log file names.
+const char* const kTestSystemLogFileNames[] = {"name1.txt", "name32.txt"};
+
+// Generate the fake system log files.
+SystemLogUploader::SystemLogs GenerateTestSystemLogFiles() {
+ SystemLogUploader::SystemLogs system_logs;
+ for (auto const file_path : kTestSystemLogFileNames) {
+ system_logs.push_back(std::make_pair(file_path, file_path));
+ }
+ return system_logs;
+}
+
+class MockUploadJob : public UploadJob {
+ public:
+ // If is_upload_error is false OnSuccess() will be invoked when the
+ // Start() method is called, otherwise OnFailure() will be invoked.
+ MockUploadJob(const GURL& upload_url,
+ UploadJob::Delegate* delegate,
+ bool is_upload_error,
+ int max_files);
+ ~MockUploadJob() override;
+
+ // policy::UploadJob:
+ void AddDataSegment(const std::string& name,
+ const std::string& filename,
+ const std::map<std::string, std::string>& header_entries,
+ scoped_ptr<std::string> data) override;
+ void Start() override;
+
+ protected:
+ UploadJob::Delegate* delegate_;
+ bool is_upload_error_;
+ int file_index_;
+ int max_files_;
+};
+
+MockUploadJob::MockUploadJob(const GURL& upload_url,
+ UploadJob::Delegate* delegate,
+ bool is_upload_error,
+ int max_files)
+ : delegate_(delegate),
+ is_upload_error_(is_upload_error),
+ file_index_(0),
+ max_files_(max_files) {}
+
+MockUploadJob::~MockUploadJob() {}
+
+void MockUploadJob::AddDataSegment(
+ const std::string& name,
+ const std::string& filename,
+ const std::map<std::string, std::string>& header_entries,
+ scoped_ptr<std::string> data) {
+ // Test all fields to upload.
+ EXPECT_LT(file_index_, max_files_);
+ EXPECT_GE(file_index_, 0);
+
+ EXPECT_EQ(base::StringPrintf(SystemLogUploader::kNameFieldTemplate,
+ file_index_ + 1),
+ name);
+
+ EXPECT_EQ(kTestSystemLogFileNames[file_index_], filename);
+
+ EXPECT_EQ(2U, header_entries.size());
+ EXPECT_EQ(
+ SystemLogUploader::kFileTypeLogFile,
+ header_entries.find(SystemLogUploader::kFileTypeHeaderName)->second);
+ EXPECT_EQ(SystemLogUploader::kContentTypePlainText,
+ header_entries.find(net::HttpRequestHeaders::kContentType)->second);
+
+ EXPECT_EQ(kTestSystemLogFileNames[file_index_], *data);
+
+ file_index_++;
+}
+
+void MockUploadJob::Start() {
+ DCHECK(delegate_);
+ // Check if all files were uploaded.
+ EXPECT_EQ(max_files_, file_index_);
+
+ if (is_upload_error_) {
+ // Send any ErrorCode.
+ delegate_->OnFailure(UploadJob::ErrorCode::NETWORK_ERROR);
+ } else {
+ delegate_->OnSuccess();
+ }
+}
+
+// MockSystemLogDelegate - mock class that creates an upload job and runs upload
+// callback.
+class MockSystemLogDelegate : public SystemLogUploader::Delegate {
+ public:
+ MockSystemLogDelegate(bool is_upload_error,
+ const SystemLogUploader::SystemLogs& system_logs)
+ : is_upload_error_(is_upload_error), system_logs_(system_logs) {}
+ ~MockSystemLogDelegate() override {}
+
+ void LoadSystemLogs(const LogUploadCallback& upload_callback) override {
+ upload_callback.Run(
+ make_scoped_ptr(new SystemLogUploader::SystemLogs(system_logs_)));
+ }
+
+ scoped_ptr<UploadJob> CreateUploadJob(
+ const GURL& url,
+ UploadJob::Delegate* delegate) override {
+ return make_scoped_ptr(new MockUploadJob(url, delegate, is_upload_error_,
+ system_logs_.size()));
+ }
+
+ private:
+ bool is_upload_error_;
+ SystemLogUploader::SystemLogs system_logs_;
+};
+
+} // namespace
+
+class SystemLogUploaderTest : public testing::Test {
+ public:
+ SystemLogUploaderTest() : task_runner_(new base::TestSimpleTaskRunner()) {}
+
+ // Given a pending task to upload system logs.
+ void RunPendingUploadTaskAndCheckNext(const SystemLogUploader& uploader,
+ base::TimeDelta expected_delay) {
+ EXPECT_FALSE(task_runner_->GetPendingTasks().empty());
+ task_runner_->RunPendingTasks();
+
+ // The previous task should have uploaded another log upload task.
+ EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
+
+ CheckPendingTaskDelay(uploader, expected_delay);
+ }
+
+ void CheckPendingTaskDelay(const SystemLogUploader& uploader,
+ base::TimeDelta expected_delay) {
+ // The next task should be scheduled sometime between
+ // |last_upload_attempt| + |expected_delay| and
+ // |now| + |expected_delay|.
+ base::Time now = base::Time::NowFromSystemTime();
+ base::Time next_task = now + task_runner_->NextPendingTaskDelay();
+
+ EXPECT_LE(next_task, now + expected_delay);
+ EXPECT_GE(next_task, uploader.last_upload_attempt() + expected_delay);
+ }
+
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+};
+
+// One success task pending.
+TEST_F(SystemLogUploaderTest, SuccessTest) {
+ EXPECT_TRUE(task_runner_->GetPendingTasks().empty());
+
+ SystemLogUploader uploader(make_scoped_ptr(new MockSystemLogDelegate(
+ false, SystemLogUploader::SystemLogs())),
+ task_runner_);
+
+ EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
+
+ RunPendingUploadTaskAndCheckNext(
+ uploader, base::TimeDelta::FromMilliseconds(
+ SystemLogUploader::kDefaultUploadDelayMs));
+}
+
+// Three failed responses recieved.
+TEST_F(SystemLogUploaderTest, ThreeFailureTest) {
+ EXPECT_TRUE(task_runner_->GetPendingTasks().empty());
+
+ SystemLogUploader uploader(make_scoped_ptr(new MockSystemLogDelegate(
+ true, SystemLogUploader::SystemLogs())),
+ task_runner_);
+
+ EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
+
+ // Do not retry two times consequentially.
+ RunPendingUploadTaskAndCheckNext(uploader,
+ base::TimeDelta::FromMilliseconds(
+ SystemLogUploader::kErrorUploadDelayMs));
+ // We are using the kDefaultUploadDelayMs and not the kErrorUploadDelayMs here
+ // because there's just one retry.
+ RunPendingUploadTaskAndCheckNext(
+ uploader, base::TimeDelta::FromMilliseconds(
+ SystemLogUploader::kDefaultUploadDelayMs));
+ RunPendingUploadTaskAndCheckNext(uploader,
+ base::TimeDelta::FromMilliseconds(
+ SystemLogUploader::kErrorUploadDelayMs));
+}
+
+// Check header fields of system log files to upload.
+TEST_F(SystemLogUploaderTest, CheckHeaders) {
+ EXPECT_TRUE(task_runner_->GetPendingTasks().empty());
+
+ SystemLogUploader::SystemLogs system_logs = GenerateTestSystemLogFiles();
+ SystemLogUploader uploader(
+ make_scoped_ptr(new MockSystemLogDelegate(false, system_logs)),
+ task_runner_);
+
+ EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
+
+ RunPendingUploadTaskAndCheckNext(
+ uploader, base::TimeDelta::FromMilliseconds(
+ SystemLogUploader::kDefaultUploadDelayMs));
+}
+
+} // namespace policy
« no previous file with comments | « chrome/browser/chromeos/policy/system_log_uploader.cc ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698