Index: chrome/browser/component_updater/test/component_updater_service_unittest.cc |
=================================================================== |
--- chrome/browser/component_updater/test/component_updater_service_unittest.cc (revision 236831) |
+++ chrome/browser/component_updater/test/component_updater_service_unittest.cc (working copy) |
@@ -12,9 +12,13 @@ |
#include "chrome/browser/component_updater/test/test_installer.h" |
#include "chrome/common/chrome_paths.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/resource_controller.h" |
+#include "content/public/browser/resource_request_info.h" |
+#include "content/public/browser/resource_throttle.h" |
#include "libxml/globals.h" |
#include "net/base/upload_bytes_element_reader.h" |
#include "net/url_request/url_fetcher.h" |
+#include "net/url_request/url_request_test_util.h" |
#include "url/gurl.h" |
using content::BrowserThread; |
@@ -36,7 +40,8 @@ |
} |
TestConfigurator::TestConfigurator() |
- : times_(1), |
+ : initial_time_(0), |
+ times_(1), |
recheck_time_(0), |
ondemand_time_(0), |
cus_(NULL), |
@@ -47,7 +52,7 @@ |
TestConfigurator::~TestConfigurator() { |
} |
-int TestConfigurator::InitialDelay() { return 0; } |
+int TestConfigurator::InitialDelay() { return initial_time_; } |
int TestConfigurator::NextCheckDelay() { |
// This is called when a new full cycle of checking for updates is going |
@@ -124,6 +129,9 @@ |
quit_closure_ = quit_closure; |
} |
+void TestConfigurator::SetInitialDelay(int seconds) { |
+ initial_time_ = seconds; |
+} |
InterceptorFactory::InterceptorFactory() |
: URLRequestPostInterceptorFactory(POST_INTERCEPT_SCHEME, |
@@ -1186,5 +1194,89 @@ |
<< post_interceptor_->GetRequestsAsString(); |
} |
+void RequestAndDeleteResourceThrottle( |
+ ComponentUpdateService* cus, const char* crx_id) { |
+ // By requesting a throttle and deleting it immediately we ensure that we |
+ // hit the case where the component updater tries to use the weak |
+ // pointer to a dead Resource throttle. |
+ class NoCallResourceController : public content::ResourceController { |
+ public: |
+ virtual ~NoCallResourceController() {} |
+ virtual void Cancel() OVERRIDE { CHECK(false); } |
+ virtual void CancelAndIgnore() OVERRIDE { CHECK(false); } |
+ virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); } |
+ virtual void Resume() OVERRIDE { CHECK(false); } |
+ }; |
+ |
+ net::TestURLRequestContext context; |
+ net::TestURLRequest url_request( |
+ GURL("http://foo.example.com/thing.bin"), |
+ net::DEFAULT_PRIORITY, |
+ NULL, |
+ &context); |
+ |
+ content::ResourceThrottle* rt = |
+ cus->GetOnDemandResourceThrottle(&url_request, crx_id); |
+ NoCallResourceController controller; |
+ rt->set_controller_for_testing(&controller); |
+ delete rt; |
+} |
+ |
+TEST_F(ComponentUpdaterTest, ResourceThrottleNoUpdate) { |
+ MockComponentObserver observer; |
+ EXPECT_CALL(observer, |
+ OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) |
+ .Times(1); |
+ EXPECT_CALL(observer, |
+ OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(observer, |
+ OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) |
+ .Times(1); |
+ |
+ TestInstaller installer; |
+ CrxComponent com; |
+ com.observer = &observer; |
+ EXPECT_EQ(ComponentUpdateService::kOk, |
+ RegisterComponent(&com, |
+ kTestComponent_abag, |
+ Version("1.1"), |
+ &installer)); |
+ |
+ const GURL expected_update_url( |
+ "http://localhost/upd?extra=foo" |
+ "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D1.1%26fp%3D%26uc" |
+ "%26installsource%3Dondemand"); |
+ // The following two calls ensure that we don't do an update check via the |
+ // timer, so the only update check should be the on-demand one. |
+ test_configurator()->SetInitialDelay(1000000); |
+ test_configurator()->SetRecheckTime(1000000); |
+ test_configurator()->SetLoopCount(1); |
+ component_updater()->Start(); |
+ |
+ RunThreadsUntilIdle(); |
+ |
+ EXPECT_EQ(0, post_interceptor_->GetHitCount()); |
+ |
+ EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch( |
+ "updatecheck"), test_file("updatecheck_reply_1.xml"))); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&RequestAndDeleteResourceThrottle, |
+ component_updater(), |
+ "abagagagagagagagagagagagagagagag")); |
+ |
+ RunThreads(); |
+ |
+ EXPECT_EQ(1, post_interceptor_->GetHitCount()); |
+ EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); |
+ EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); |
+ |
+ component_updater()->Stop(); |
+} |
+ |
} // namespace component_updater |