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. 4 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" 15 16 namespace component_updater { 17 18 class ComponentUpdaterPingManagerTest : public testing::Test { 19 public: 20 ComponentUpdaterPingManagerTest(); 21 virtual ~ComponentUpdaterPingManagerTest() {} 22 23 void RunThreadsUntilIdle(); 24 25 // Overrides from testing::Test. 26 virtual void SetUp() OVERRIDE; 27 virtual void TearDown() OVERRIDE; 28 29 protected: 30 scoped_ptr<TestConfigurator> config_; 31 scoped_ptr<PingManager> ping_manager_; 32 33 private: 34 base::MessageLoopForIO loop_; 35 }; 36 37 ComponentUpdaterPingManagerTest::ComponentUpdaterPingManagerTest() 38 : config_(new TestConfigurator(base::MessageLoopProxy::current(), 39 base::MessageLoopProxy::current())) { 40 } 41 42 void ComponentUpdaterPingManagerTest::SetUp() { 43 ping_manager_.reset(new PingManager(*config_)); 44 } 45 46 void ComponentUpdaterPingManagerTest::TearDown() { 47 ping_manager_.reset(); 48 config_.reset(); 49 } 50 51 void ComponentUpdaterPingManagerTest::RunThreadsUntilIdle() { 52 base::RunLoop().RunUntilIdle(); 53 } 54 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); 62 63 // Test eventresult="1" is sent for successful updates. 64 CrxUpdateItem item; 65 item.id = "abc"; 66 item.status = CrxUpdateItem::kUpdated; 67 item.previous_version = base::Version("1.0"); 68 item.next_version = base::Version("2.0"); 69 70 ping_manager_->OnUpdateComplete(&item); 71 base::RunLoop().RunUntilIdle(); 72 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(); 79 interceptor->Reset(); 80 81 // Test eventresult="0" is sent for failed updates. 82 item = CrxUpdateItem(); 83 item.id = "abc"; 84 item.status = CrxUpdateItem::kNoUpdate; 85 item.previous_version = base::Version("1.0"); 86 item.next_version = base::Version("2.0"); 87 88 ping_manager_->OnUpdateComplete(&item); 89 base::RunLoop().RunUntilIdle(); 90 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(); 97 interceptor->Reset(); 98 99 // Test the error values and the fingerprints. 100 item = CrxUpdateItem(); 101 item.id = "abc"; 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; 108 item.error_code = 2; 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")); 115 116 ping_manager_->OnUpdateComplete(&item); 117 base::RunLoop().RunUntilIdle(); 118 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(); 130 131 // Test the download metrics. 132 item = CrxUpdateItem(); 133 item.id = "abc"; 134 item.status = CrxUpdateItem::kUpdated; 135 item.previous_version = base::Version("1.0"); 136 item.next_version = base::Version("2.0"); 137 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); 146 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); 155 156 ping_manager_->OnUpdateComplete(&item); 157 base::RunLoop().RunUntilIdle(); 158 159 EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString(); 160 EXPECT_NE( 161 string::npos, 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(); 173 } 174 175 } // namespace component_updater 176