blob: 98d0488662e039fa410a4eead638f630bbfdab28 [file] [log] [blame]
[email protected]48372252013-12-20 12:18:011// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/feedback/feedback_uploader.h"
6
7#include "base/bind.h"
8#include "base/message_loop/message_loop.h"
9#include "base/run_loop.h"
10#include "chrome/browser/feedback/feedback_uploader_factory.h"
11#include "chrome/test/base/testing_profile.h"
12#include "content/public/test/test_browser_thread.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace {
16
17const char kReportOne[] = "one";
18const char kReportTwo[] = "two";
19const char kReportThree[] = "three";
20const char kReportFour[] = "four";
21const char kReportFive[] = "five";
22
23const base::TimeDelta kRetryDelayForTest =
24 base::TimeDelta::FromMilliseconds(100);
25
26BrowserContextKeyedService* CreateFeedbackUploaderService(
27 content::BrowserContext* context) {
28 return new feedback::FeedbackUploader(Profile::FromBrowserContext(context));
29}
30
31} // namespace
32
33namespace feedback {
34
35class FeedbackUploaderTest : public testing::Test {
36 protected:
37 FeedbackUploaderTest()
38 : ui_thread_(content::BrowserThread::UI, &message_loop_),
39 profile_(new TestingProfile()),
40 expected_reports_(0) {
41 FeedbackUploaderFactory::GetInstance()->SetTestingFactory(
42 profile_.get(), &CreateFeedbackUploaderService);
43
44 uploader_ = FeedbackUploaderFactory::GetForBrowserContext(profile_.get());
45 uploader_->setup_for_test(
46 base::Bind(&FeedbackUploaderTest::MockDispatchReport,
47 base::Unretained(this)),
48 kRetryDelayForTest);
49 }
50
51 virtual ~FeedbackUploaderTest() {
52 FeedbackUploaderFactory::GetInstance()->SetTestingFactory(
53 profile_.get(), NULL);
54 }
55
56 void QueueReport(const std::string& data) {
57 uploader_->QueueReport(make_scoped_ptr(new std::string(data)));
58 }
59
60 void ReportFailure(const std::string& data) {
61 uploader_->RetryReport(make_scoped_ptr(new std::string(data)));
62 }
63
64 void MockDispatchReport(scoped_ptr<std::string> report_data) {
65 dispatched_reports_.push_back(*report_data.get());
66
67 // Dispatch will always update the timer, whether successful or not,
68 // simulate the same behavior.
69 uploader_->UpdateUploadTimer();
70
71 if (dispatched_reports_.size() >= expected_reports_) {
72 if (run_loop_.get())
73 run_loop_->Quit();
74 }
75 }
76
77 void RunMessageLoop() {
78 run_loop_.reset(new base::RunLoop());
79 run_loop_->Run();
80 }
81
82 base::MessageLoop message_loop_;
83 scoped_ptr<base::RunLoop> run_loop_;
84 content::TestBrowserThread ui_thread_;
85 scoped_ptr<TestingProfile> profile_;
86
87 FeedbackUploader* uploader_;
88
89 std::vector<std::string> dispatched_reports_;
90 size_t expected_reports_;
91};
92
93TEST_F(FeedbackUploaderTest, QueueMultiple) {
94 dispatched_reports_.clear();
95 QueueReport(kReportOne);
96 QueueReport(kReportTwo);
97 QueueReport(kReportThree);
98 QueueReport(kReportFour);
99
100 EXPECT_EQ(dispatched_reports_.size(), 4u);
101 EXPECT_EQ(dispatched_reports_[0], kReportOne);
102 EXPECT_EQ(dispatched_reports_[1], kReportTwo);
103 EXPECT_EQ(dispatched_reports_[2], kReportThree);
104 EXPECT_EQ(dispatched_reports_[3], kReportFour);
105}
106
[email protected]f1007112013-12-23 19:04:16107// crbug.com/330547
108TEST_F(FeedbackUploaderTest, DISABLED_QueueMultipleWithFailures) {
[email protected]48372252013-12-20 12:18:01109 dispatched_reports_.clear();
110 QueueReport(kReportOne);
111 QueueReport(kReportTwo);
112 QueueReport(kReportThree);
113 QueueReport(kReportFour);
114
115 ReportFailure(kReportThree);
116 ReportFailure(kReportTwo);
117 QueueReport(kReportFive);
118
119 expected_reports_ = 7;
120 RunMessageLoop();
121
122 EXPECT_EQ(dispatched_reports_.size(), 7u);
123 EXPECT_EQ(dispatched_reports_[0], kReportOne);
124 EXPECT_EQ(dispatched_reports_[1], kReportTwo);
125 EXPECT_EQ(dispatched_reports_[2], kReportThree);
126 EXPECT_EQ(dispatched_reports_[3], kReportFour);
127 EXPECT_EQ(dispatched_reports_[4], kReportFive);
128 EXPECT_EQ(dispatched_reports_[5], kReportThree);
129 EXPECT_EQ(dispatched_reports_[6], kReportTwo);
130}
131
132} // namespace feedback