1 // 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.
5 #include "base/memory/scoped_ptr.h"
6 #include "base/message_loop/message_loop.h"
7 #include "base/run_loop.h"
8 #include "base/version.h"
9 #include "components/component_updater/component_updater_ping_manager.h"
10 #include "components/component_updater/crx_update_item.h"
11 #include "components/component_updater/test/test_configurator.h"
12 #include "components/component_updater/test/url_request_post_interceptor.h"
13 #include "net/url_request/url_request_test_util.h"
14 #include "testing/gtest/include/gtest/gtest.h"
16 namespace component_updater {
18 class ComponentUpdaterPingManagerTest : public testing::Test {
20 ComponentUpdaterPingManagerTest();
21 virtual ~ComponentUpdaterPingManagerTest() {}
23 void RunThreadsUntilIdle();
25 // Overrides from testing::Test.
26 virtual void SetUp() OVERRIDE;
27 virtual void TearDown() OVERRIDE;
30 scoped_ptr<TestConfigurator> config_;
31 scoped_ptr<PingManager> ping_manager_;
34 base::MessageLoopForIO loop_;
37 ComponentUpdaterPingManagerTest::ComponentUpdaterPingManagerTest()
38 : config_(new TestConfigurator(base::MessageLoopProxy::current(),
39 base::MessageLoopProxy::current())) {
42 void ComponentUpdaterPingManagerTest::SetUp() {
43 ping_manager_.reset(new PingManager(*config_));
46 void ComponentUpdaterPingManagerTest::TearDown() {
47 ping_manager_.reset();
51 void ComponentUpdaterPingManagerTest::RunThreadsUntilIdle() {
52 base::RunLoop().RunUntilIdle();
55 // Test is flaky: http://crbug.com/349547
56 TEST_F(ComponentUpdaterPingManagerTest, DISABLED_PingManagerTest) {
57 scoped_ptr<InterceptorFactory> interceptor_factory(
58 new InterceptorFactory(base::MessageLoopProxy::current()));
59 URLRequestPostInterceptor* interceptor =
60 interceptor_factory->CreateInterceptor();
61 EXPECT_TRUE(interceptor);
63 // Test eventresult="1" is sent for successful updates.
66 item.status = CrxUpdateItem::kUpdated;
67 item.previous_version = base::Version("1.0");
68 item.next_version = base::Version("2.0");
70 ping_manager_->OnUpdateComplete(&item);
71 base::RunLoop().RunUntilIdle();
73 EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
74 EXPECT_NE(string::npos,
75 interceptor->GetRequests()[0].find(
76 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
77 "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
78 << interceptor->GetRequestsAsString();
81 // Test eventresult="0" is sent for failed updates.
82 item = CrxUpdateItem();
84 item.status = CrxUpdateItem::kNoUpdate;
85 item.previous_version = base::Version("1.0");
86 item.next_version = base::Version("2.0");
88 ping_manager_->OnUpdateComplete(&item);
89 base::RunLoop().RunUntilIdle();
91 EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
92 EXPECT_NE(string::npos,
93 interceptor->GetRequests()[0].find(
94 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
95 "<event eventtype=\"3\" eventresult=\"0\"/></app>"))
96 << interceptor->GetRequestsAsString();
99 // Test the error values and the fingerprints.
100 item = CrxUpdateItem();
102 item.status = CrxUpdateItem::kNoUpdate;
103 item.previous_version = base::Version("1.0");
104 item.next_version = base::Version("2.0");
105 item.previous_fp = "prev fp";
106 item.next_fp = "next fp";
107 item.error_category = 1;
109 item.extra_code1 = -1;
110 item.diff_error_category = 10;
111 item.diff_error_code = 20;
112 item.diff_extra_code1 = -10;
113 item.diff_update_failed = true;
114 item.crx_diffurls.push_back(GURL("http://host/path"));
116 ping_manager_->OnUpdateComplete(&item);
117 base::RunLoop().RunUntilIdle();
119 EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
120 EXPECT_NE(string::npos,
121 interceptor->GetRequests()[0].find(
122 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
123 "<event eventtype=\"3\" eventresult=\"0\" errorcat=\"1\" "
124 "errorcode=\"2\" extracode1=\"-1\" diffresult=\"0\" "
125 "differrorcat=\"10\" "
126 "differrorcode=\"20\" diffextracode1=\"-10\" "
127 "previousfp=\"prev fp\" nextfp=\"next fp\"/></app>"))
128 << interceptor->GetRequestsAsString();
129 interceptor->Reset();
131 // Test the download metrics.
132 item = CrxUpdateItem();
134 item.status = CrxUpdateItem::kUpdated;
135 item.previous_version = base::Version("1.0");
136 item.next_version = base::Version("2.0");
138 CrxDownloader::DownloadMetrics download_metrics;
139 download_metrics.url = GURL("http://host1/path1");
140 download_metrics.downloader = CrxDownloader::DownloadMetrics::kUrlFetcher;
141 download_metrics.error = -1;
142 download_metrics.downloaded_bytes = 123;
143 download_metrics.total_bytes = 456;
144 download_metrics.download_time_ms = 987;
145 item.download_metrics.push_back(download_metrics);
147 download_metrics = CrxDownloader::DownloadMetrics();
148 download_metrics.url = GURL("http://host2/path2");
149 download_metrics.downloader = CrxDownloader::DownloadMetrics::kBits;
150 download_metrics.error = 0;
151 download_metrics.downloaded_bytes = 1230;
152 download_metrics.total_bytes = 4560;
153 download_metrics.download_time_ms = 9870;
154 item.download_metrics.push_back(download_metrics);
156 ping_manager_->OnUpdateComplete(&item);
157 base::RunLoop().RunUntilIdle();
159 EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
162 interceptor->GetRequests()[0].find(
163 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
164 "<event eventtype=\"3\" eventresult=\"1\"/>"
165 "<event eventtype=\"14\" eventresult=\"0\" downloader=\"direct\" "
166 "errorcode=\"-1\" url=\"http://host1/path1\" downloaded=\"123\" "
167 "total=\"456\" download_time_ms=\"987\"/>"
168 "<event eventtype=\"14\" eventresult=\"1\" downloader=\"bits\" "
169 "url=\"http://host2/path2\" downloaded=\"1230\" total=\"4560\" "
170 "download_time_ms=\"9870\"/></app>"))
171 << interceptor->GetRequestsAsString();
172 interceptor->Reset();
175 } // namespace component_updater