| Index: chrome/browser/extensions/updater/extension_updater_unittest.cc
|
| diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc
|
| index 6c3721ce1b920024fd926a0cac81550f9c2fe15d..bb34cdda32a8396cf99c91a44e53f26293a9208f 100644
|
| --- a/chrome/browser/extensions/updater/extension_updater_unittest.cc
|
| +++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
|
| @@ -787,8 +787,8 @@ class ExtensionUpdaterTest : public testing::Test {
|
|
|
| void TestMultipleManifestDownloading() {
|
| net::TestURLFetcherFactory factory;
|
| + factory.set_remove_fetcher_on_delete(true);
|
| net::TestURLFetcher* fetcher = NULL;
|
| - NotificationsObserver observer;
|
| MockService service(prefs_.get());
|
| MockExtensionDownloaderDelegate delegate;
|
| ExtensionDownloader downloader(&delegate, service.request_context());
|
| @@ -811,100 +811,118 @@ class ExtensionUpdaterTest : public testing::Test {
|
| "4444", "4.0", &zeroDays, kEmptyUpdateUrlData, std::string());
|
|
|
| // This will start the first fetcher and queue the others. The next in queue
|
| - // is started as each fetcher receives its response.
|
| + // is started as each fetcher receives its response. Note that the fetchers
|
| + // don't necessarily run in the order that they are started from here.
|
| + GURL fetch1_url = fetch1->full_url();
|
| + GURL fetch2_url = fetch2->full_url();
|
| + GURL fetch3_url = fetch3->full_url();
|
| + GURL fetch4_url = fetch4->full_url();
|
| downloader.StartUpdateCheck(fetch1.Pass());
|
| downloader.StartUpdateCheck(fetch2.Pass());
|
| downloader.StartUpdateCheck(fetch3.Pass());
|
| downloader.StartUpdateCheck(fetch4.Pass());
|
| RunUntilIdle();
|
|
|
| - // The first fetch will fail.
|
| - fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
|
| - EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
|
| - EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
|
| - EXPECT_CALL(delegate, OnExtensionDownloadFailed(
|
| - "1111", ExtensionDownloaderDelegate::MANIFEST_FETCH_FAILED, _, _));
|
| - fetcher->set_url(kUpdateUrl);
|
| - fetcher->set_status(net::URLRequestStatus());
|
| - fetcher->set_response_code(400);
|
| - fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| - RunUntilIdle();
|
| - Mock::VerifyAndClearExpectations(&delegate);
|
| -
|
| - // The second fetch gets invalid data.
|
| - const std::string kInvalidXml = "invalid xml";
|
| - fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
|
| - EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
|
| - EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
|
| - EXPECT_CALL(delegate, OnExtensionDownloadFailed(
|
| - "2222", ExtensionDownloaderDelegate::MANIFEST_INVALID, _, _))
|
| - .WillOnce(InvokeWithoutArgs(&delegate,
|
| - &MockExtensionDownloaderDelegate::Quit));
|
| - fetcher->set_url(kUpdateUrl);
|
| - fetcher->set_status(net::URLRequestStatus());
|
| - fetcher->set_response_code(200);
|
| - fetcher->SetResponseString(kInvalidXml);
|
| - fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| - delegate.Wait();
|
| - Mock::VerifyAndClearExpectations(&delegate);
|
| -
|
| - // The third fetcher doesn't have an update available.
|
| - const std::string kNoUpdate =
|
| - "<?xml version='1.0' encoding='UTF-8'?>"
|
| - "<gupdate xmlns='http://www.google.com/update2/response'"
|
| - " protocol='2.0'>"
|
| - " <app appid='3333'>"
|
| - " <updatecheck codebase='http://example.com/extension_3.0.0.0.crx'"
|
| - " version='3.0.0.0' prodversionmin='3.0.0.0' />"
|
| - " </app>"
|
| - "</gupdate>";
|
| - fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
|
| - EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
|
| - EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
|
| - EXPECT_CALL(delegate, IsExtensionPending("3333")).WillOnce(Return(false));
|
| - EXPECT_CALL(delegate, GetExtensionExistingVersion("3333", _))
|
| - .WillOnce(DoAll(SetArgPointee<1>("3.0.0.0"),
|
| - Return(true)));
|
| - EXPECT_CALL(delegate, OnExtensionDownloadFailed(
|
| - "3333", ExtensionDownloaderDelegate::NO_UPDATE_AVAILABLE, _, _))
|
| - .WillOnce(InvokeWithoutArgs(&delegate,
|
| - &MockExtensionDownloaderDelegate::Quit));
|
| - fetcher->set_url(kUpdateUrl);
|
| - fetcher->set_status(net::URLRequestStatus());
|
| - fetcher->set_response_code(200);
|
| - fetcher->SetResponseString(kNoUpdate);
|
| - fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| - delegate.Wait();
|
| - Mock::VerifyAndClearExpectations(&delegate);
|
| + for (int i = 0; i < 4; ++i) {
|
| + fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
|
| + ASSERT_TRUE(fetcher);
|
| + ASSERT_TRUE(fetcher->delegate());
|
| + EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
|
| + EXPECT_FALSE(fetcher->GetOriginalURL().is_empty());
|
| +
|
| + if (fetcher->GetOriginalURL() == fetch1_url) {
|
| + // The first fetch will fail.
|
| + EXPECT_CALL(delegate, OnExtensionDownloadFailed(
|
| + "1111", ExtensionDownloaderDelegate::MANIFEST_FETCH_FAILED, _, _));
|
| + fetcher->set_url(kUpdateUrl);
|
| + fetcher->set_status(net::URLRequestStatus());
|
| + fetcher->set_response_code(400);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| + RunUntilIdle();
|
| + Mock::VerifyAndClearExpectations(&delegate);
|
| + fetch1_url = GURL();
|
| + } else if (fetcher->GetOriginalURL() == fetch2_url) {
|
| + // The second fetch gets invalid data.
|
| + const std::string kInvalidXml = "invalid xml";
|
| + EXPECT_CALL(delegate, OnExtensionDownloadFailed(
|
| + "2222", ExtensionDownloaderDelegate::MANIFEST_INVALID, _, _))
|
| + .WillOnce(InvokeWithoutArgs(
|
| + &delegate,
|
| + &MockExtensionDownloaderDelegate::Quit));
|
| + fetcher->set_url(kUpdateUrl);
|
| + fetcher->set_status(net::URLRequestStatus());
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(kInvalidXml);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| + delegate.Wait();
|
| + Mock::VerifyAndClearExpectations(&delegate);
|
| + fetch2_url = GURL();
|
| + } else if (fetcher->GetOriginalURL() == fetch3_url) {
|
| + // The third fetcher doesn't have an update available.
|
| + const std::string kNoUpdate =
|
| + "<?xml version='1.0' encoding='UTF-8'?>"
|
| + "<gupdate xmlns='http://www.google.com/update2/response'"
|
| + " protocol='2.0'>"
|
| + " <app appid='3333'>"
|
| + " <updatecheck codebase='http://example.com/extension_3.0.0.0.crx'"
|
| + " version='3.0.0.0' prodversionmin='3.0.0.0' />"
|
| + " </app>"
|
| + "</gupdate>";
|
| + EXPECT_CALL(delegate, IsExtensionPending("3333"))
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(delegate, GetExtensionExistingVersion("3333", _))
|
| + .WillOnce(DoAll(SetArgPointee<1>("3.0.0.0"),
|
| + Return(true)));
|
| + EXPECT_CALL(delegate, OnExtensionDownloadFailed(
|
| + "3333", ExtensionDownloaderDelegate::NO_UPDATE_AVAILABLE, _, _))
|
| + .WillOnce(InvokeWithoutArgs(
|
| + &delegate,
|
| + &MockExtensionDownloaderDelegate::Quit));
|
| + fetcher->set_url(kUpdateUrl);
|
| + fetcher->set_status(net::URLRequestStatus());
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(kNoUpdate);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| + delegate.Wait();
|
| + Mock::VerifyAndClearExpectations(&delegate);
|
| + fetch3_url = GURL();
|
| + } else if (fetcher->GetOriginalURL() == fetch4_url) {
|
| + // The last fetcher has an update.
|
| + NotificationsObserver observer;
|
| + const std::string kUpdateAvailable =
|
| + "<?xml version='1.0' encoding='UTF-8'?>"
|
| + "<gupdate xmlns='http://www.google.com/update2/response'"
|
| + " protocol='2.0'>"
|
| + " <app appid='4444'>"
|
| + " <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
|
| + " version='4.0.42.0' prodversionmin='4.0.42.0' />"
|
| + " </app>"
|
| + "</gupdate>";
|
| + EXPECT_CALL(delegate, IsExtensionPending("4444"))
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(delegate, GetExtensionExistingVersion("4444", _))
|
| + .WillOnce(DoAll(SetArgPointee<1>("4.0.0.0"),
|
| + Return(true)));
|
| + fetcher->set_url(kUpdateUrl);
|
| + fetcher->set_status(net::URLRequestStatus());
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(kUpdateAvailable);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| + observer.Wait();
|
| + Mock::VerifyAndClearExpectations(&delegate);
|
| +
|
| + // Verify that the downloader decided to update this extension.
|
| + EXPECT_EQ(1u, observer.UpdatedCount());
|
| + EXPECT_TRUE(observer.Updated("4444"));
|
| + fetch4_url = GURL();
|
| + } else {
|
| + ADD_FAILURE() << "Unexpected fetch: " << fetcher->GetOriginalURL();
|
| + }
|
| + }
|
|
|
| - // The last fetcher has an update.
|
| - const std::string kUpdateAvailable =
|
| - "<?xml version='1.0' encoding='UTF-8'?>"
|
| - "<gupdate xmlns='http://www.google.com/update2/response'"
|
| - " protocol='2.0'>"
|
| - " <app appid='4444'>"
|
| - " <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
|
| - " version='4.0.42.0' prodversionmin='4.0.42.0' />"
|
| - " </app>"
|
| - "</gupdate>";
|
| fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
|
| - EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
|
| - EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
|
| - EXPECT_CALL(delegate, IsExtensionPending("4444")).WillOnce(Return(false));
|
| - EXPECT_CALL(delegate, GetExtensionExistingVersion("4444", _))
|
| - .WillOnce(DoAll(SetArgPointee<1>("4.0.0.0"),
|
| - Return(true)));
|
| - fetcher->set_url(kUpdateUrl);
|
| - fetcher->set_status(net::URLRequestStatus());
|
| - fetcher->set_response_code(200);
|
| - fetcher->SetResponseString(kUpdateAvailable);
|
| - fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| - observer.Wait();
|
| - Mock::VerifyAndClearExpectations(&delegate);
|
| -
|
| - // Verify that the downloader decided to update this extension.
|
| - EXPECT_EQ(1u, observer.UpdatedCount());
|
| - EXPECT_TRUE(observer.Updated("4444"));
|
| + if (fetcher)
|
| + ADD_FAILURE() << "Unexpected fetch: " << fetcher->GetOriginalURL();
|
| }
|
|
|
| void TestManifestRetryDownloading() {
|
| @@ -1545,15 +1563,7 @@ TEST_F(ExtensionUpdaterTest, TestDetermineUpdatesPending) {
|
| TestDetermineUpdatesPending();
|
| }
|
|
|
| -#if defined(THREAD_SANITIZER) || defined(MEMORY_SANITIZER)
|
| -// This test fails under ThreadSanitizer and MemorySanitizer, which build with
|
| -// libc++ instead of libstdc++.
|
| -#define MAYBE_TestMultipleManifestDownloading \
|
| - DISABLED_TestMultipleManifestDownloading
|
| -#else
|
| -#define MAYBE_TestMultipleManifestDownloading TestMultipleManifestDownloading
|
| -#endif
|
| -TEST_F(ExtensionUpdaterTest, MAYBE_TestMultipleManifestDownloading) {
|
| +TEST_F(ExtensionUpdaterTest, TestMultipleManifestDownloading) {
|
| TestMultipleManifestDownloading();
|
| }
|
|
|
|
|