summaryrefslogtreecommitdiffstats
path: root/chrome/browser/web_resource/promo_resource_service_unittest.cc
diff options
context:
space:
mode:
authorjstritar@chromium.org <jstritar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-08 03:05:55 +0000
committerjstritar@chromium.org <jstritar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-08 03:05:55 +0000
commit808c096eeadb6b7d701a76fb660fd18c4b1a9497 (patch)
tree7d80a2097013588ab0e68d03c73f852ba4dacdb3 /chrome/browser/web_resource/promo_resource_service_unittest.cc
parent75185918cc565c908ce16346644d3008bb0ff91f (diff)
downloadchromium_src-808c096eeadb6b7d701a76fb660fd18c4b1a9497.zip
chromium_src-808c096eeadb6b7d701a76fb660fd18c4b1a9497.tar.gz
chromium_src-808c096eeadb6b7d701a76fb660fd18c4b1a9497.tar.bz2
Add support to download web store promo logos over https.
This lets you define apps promo logos as https URLs in the promo feed. The AppsPromoLogoDownloader only downloads the image over https and from *.google.com domains. AppsPromo caches the image until the URL changes in the promo feed. BUG=84506 TEST=*Promo* Review URL: http://codereview.chromium.org/7820003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100089 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/web_resource/promo_resource_service_unittest.cc')
-rw-r--r--chrome/browser/web_resource/promo_resource_service_unittest.cc196
1 files changed, 178 insertions, 18 deletions
diff --git a/chrome/browser/web_resource/promo_resource_service_unittest.cc b/chrome/browser/web_resource/promo_resource_service_unittest.cc
index b196b12..a69385c 100644
--- a/chrome/browser/web_resource/promo_resource_service_unittest.cc
+++ b/chrome/browser/web_resource/promo_resource_service_unittest.cc
@@ -15,6 +15,7 @@
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_pref_service.h"
#include "chrome/test/base/testing_profile.h"
+#include "content/test/test_url_fetcher_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
class PromoResourceServiceTest : public testing::Test {
@@ -28,6 +29,7 @@ class PromoResourceServiceTest : public testing::Test {
TestingProfile profile_;
ScopedTestingLocalState local_state_;
scoped_refptr<PromoResourceService> web_resource_service_;
+ MessageLoop loop_;
};
// Verifies that custom dates read from a web resource server are written to
@@ -131,9 +133,6 @@ TEST_F(PromoResourceServiceTest, UnpackPromoSignal) {
scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
- // Initialize a message loop for this to run on.
- MessageLoop loop;
-
// Check that prefs are set correctly.
web_resource_service_->UnpackPromoSignal(*(test_json.get()));
PrefService* prefs = profile_.GetPrefs();
@@ -187,22 +186,24 @@ TEST_F(PromoResourceServiceTest, UnpackWebStoreSignal) {
scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
- // Initialize a message loop for this to run on.
- MessageLoop loop;
+ // Set the source logo URL to verify that it gets cleared.
+ AppsPromo::SetSourcePromoLogoURL(GURL("https://www.google.com/test.png"));
// Check that prefs are set correctly.
web_resource_service_->UnpackWebStoreSignal(*(test_json.get()));
- PrefService* prefs = profile_.GetPrefs();
- ASSERT_TRUE(prefs != NULL);
- EXPECT_EQ("341252", AppsPromo::GetPromoId());
- EXPECT_EQ("The header!", AppsPromo::GetPromoHeaderText());
- EXPECT_EQ("The button label!", AppsPromo::GetPromoButtonText());
- EXPECT_EQ(GURL("http://link.com"), AppsPromo::GetPromoLink());
- EXPECT_EQ("No thanks, hide this.", AppsPromo::GetPromoExpireText());
- EXPECT_EQ(AppsPromo::USERS_NEW, AppsPromo::GetPromoUserGroup());
- EXPECT_EQ(GURL("chrome://theme/IDR_WEBSTORE_ICON"),
- AppsPromo::GetPromoLogo());
+ AppsPromo::PromoData actual_data = AppsPromo::GetPromo();
+ EXPECT_EQ("341252", actual_data.id);
+ EXPECT_EQ("The header!", actual_data.header);
+ EXPECT_EQ("The button label!", actual_data.button);
+ EXPECT_EQ(GURL("http://link.com"), actual_data.link);
+ EXPECT_EQ("No thanks, hide this.", actual_data.expire);
+ EXPECT_EQ(AppsPromo::USERS_NEW, actual_data.user_group);
+
+ // When we don't download a logo, we revert to the default and clear the
+ // source pref.
+ EXPECT_EQ(GURL("chrome://theme/IDR_WEBSTORE_ICON"), actual_data.logo);
+ EXPECT_EQ(GURL(""), AppsPromo::GetSourcePromoLogoURL());
}
// Tests that the "web store active" flag is set even when the web store promo
@@ -221,15 +222,174 @@ TEST_F(PromoResourceServiceTest, UnpackPartialWebStoreSignal) {
scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
- // Initialize a message loop for this to run on.
- MessageLoop loop;
-
// Check that prefs are set correctly.
web_resource_service_->UnpackWebStoreSignal(*(test_json.get()));
EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale());
EXPECT_TRUE(AppsPromo::IsWebStoreSupportedForLocale());
}
+// Tests that we can successfully unpack web store signals with HTTPS
+// logos.
+TEST_F(PromoResourceServiceTest, UnpackWebStoreSignalHttpsLogo) {
+ web_resource_service_->set_channel(chrome::VersionInfo::CHANNEL_DEV);
+
+ std::string logo_url = "https://www.google.com/image/test.png";
+ std::string png_data = "!$#%,./nvl;iadh9oh82";
+ std::string png_base64 = "data:image/png;base64,ISQjJSwuL252bDtpYWRoOW9oODI=";
+
+ FakeURLFetcherFactory factory;
+ factory.SetFakeResponse(logo_url, png_data, true);
+
+ std::string json =
+ "{ "
+ " \"topic\": {"
+ " \"answers\": ["
+ " {"
+ " \"answer_id\": \"340252\","
+ " \"name\": \"webstore_promo:15:1:" + logo_url + "\","
+ " \"question\": \"Header!\","
+ " \"inproduct_target\": \"The button label!\","
+ " \"inproduct\": \"http://link.com\","
+ " \"tooltip\": \"No thanks, hide this.\""
+ " }"
+ " ]"
+ " }"
+ "}";
+
+ scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
+ base::JSONReader::Read(json, false)));
+
+ // Update the promo multiple times to verify the logo is cached correctly.
+ for (size_t i = 0; i < 2; ++i) {
+ web_resource_service_->UnpackWebStoreSignal(*(test_json.get()));
+
+ // We should only need to run the message loop the first time since the
+ // image is then cached.
+ if (i == 0)
+ loop_.RunAllPending();
+
+ // Reset this scoped_ptr to prevent a DCHECK.
+ web_resource_service_->apps_promo_logo_fetcher_.reset();
+
+ AppsPromo::PromoData actual_data = AppsPromo::GetPromo();
+ EXPECT_EQ("340252", actual_data.id);
+ EXPECT_EQ("Header!", actual_data.header);
+ EXPECT_EQ("The button label!", actual_data.button);
+ EXPECT_EQ(GURL("http://link.com"), actual_data.link);
+ EXPECT_EQ("No thanks, hide this.", actual_data.expire);
+ EXPECT_EQ(AppsPromo::USERS_NEW, actual_data.user_group);
+
+ // The logo should now be a base64 DATA URL.
+ EXPECT_EQ(GURL(png_base64), actual_data.logo);
+
+ // And the source pref should hold the source HTTPS URL.
+ EXPECT_EQ(GURL(logo_url), AppsPromo::GetSourcePromoLogoURL());
+ }
+}
+
+// Tests that we revert to the default logo when the fetch fails.
+TEST_F(PromoResourceServiceTest, UnpackWebStoreSignalHttpsLogoError) {
+ web_resource_service_->set_channel(chrome::VersionInfo::CHANNEL_DEV);
+
+ std::string logo_url = "https://www.google.com/image/test.png";
+ std::string png_data = "!$#%,./nvl;iadh9oh82";
+ std::string png_base64 = "ISQjJSwuL252bDtpYWRoOW9oODI=";
+
+ FakeURLFetcherFactory factory;
+
+ // Have URLFetcher return a 500 error.
+ factory.SetFakeResponse(logo_url, png_data, false);
+
+ std::string json =
+ "{ "
+ " \"topic\": {"
+ " \"answers\": ["
+ " {"
+ " \"answer_id\": \"340252\","
+ " \"name\": \"webstore_promo:15:1:" + logo_url + "\","
+ " \"question\": \"Header!\","
+ " \"inproduct_target\": \"The button label!\","
+ " \"inproduct\": \"http://link.com\","
+ " \"tooltip\": \"No thanks, hide this.\""
+ " }"
+ " ]"
+ " }"
+ "}";
+
+ scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
+ base::JSONReader::Read(json, false)));
+
+ web_resource_service_->UnpackWebStoreSignal(*(test_json.get()));
+
+ loop_.RunAllPending();
+
+ // Reset this scoped_ptr to prevent a DCHECK.
+ web_resource_service_->apps_promo_logo_fetcher_.reset();
+
+ AppsPromo::PromoData actual_data = AppsPromo::GetPromo();
+ EXPECT_EQ("340252", actual_data.id);
+ EXPECT_EQ("Header!", actual_data.header);
+ EXPECT_EQ("The button label!", actual_data.button);
+ EXPECT_EQ(GURL("http://link.com"), actual_data.link);
+ EXPECT_EQ("No thanks, hide this.", actual_data.expire);
+ EXPECT_EQ(AppsPromo::USERS_NEW, actual_data.user_group);
+
+ // Logos are the default values.
+ EXPECT_EQ(GURL("chrome://theme/IDR_WEBSTORE_ICON"), actual_data.logo);
+ EXPECT_EQ(GURL(""), AppsPromo::GetSourcePromoLogoURL());
+}
+
+// Tests that we don't download images over HTTP.
+TEST_F(PromoResourceServiceTest, UnpackWebStoreSignalHttpLogo) {
+ web_resource_service_->set_channel(chrome::VersionInfo::CHANNEL_DEV);
+
+ // Use an HTTP URL.
+ std::string logo_url = "http://www.google.com/image/test.png";
+ std::string png_data = "!$#%,./nvl;iadh9oh82";
+ std::string png_base64 = "ISQjJSwuL252bDtpYWRoOW9oODI=";
+
+ FakeURLFetcherFactory factory;
+ factory.SetFakeResponse(logo_url, png_data, true);
+
+ std::string json =
+ "{ "
+ " \"topic\": {"
+ " \"answers\": ["
+ " {"
+ " \"answer_id\": \"340252\","
+ " \"name\": \"webstore_promo:15:1:" + logo_url + "\","
+ " \"question\": \"Header!\","
+ " \"inproduct_target\": \"The button label!\","
+ " \"inproduct\": \"http://link.com\","
+ " \"tooltip\": \"No thanks, hide this.\""
+ " }"
+ " ]"
+ " }"
+ "}";
+
+ scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
+ base::JSONReader::Read(json, false)));
+
+ web_resource_service_->UnpackWebStoreSignal(*(test_json.get()));
+
+ loop_.RunAllPending();
+
+ // Reset this scoped_ptr to prevent a DCHECK.
+ web_resource_service_->apps_promo_logo_fetcher_.reset();
+
+ AppsPromo::PromoData actual_data = AppsPromo::GetPromo();
+ EXPECT_EQ("340252", actual_data.id);
+ EXPECT_EQ("Header!", actual_data.header);
+ EXPECT_EQ("The button label!", actual_data.button);
+ EXPECT_EQ(GURL("http://link.com"), actual_data.link);
+ EXPECT_EQ("No thanks, hide this.", actual_data.expire);
+ EXPECT_EQ(AppsPromo::USERS_NEW, actual_data.user_group);
+
+ // Logos should be the default values because HTTP URLs are not valid.
+ EXPECT_EQ(GURL("chrome://theme/IDR_WEBSTORE_ICON"), actual_data.logo);
+ EXPECT_EQ(GURL(""), AppsPromo::GetSourcePromoLogoURL());
+}
+
TEST_F(PromoResourceServiceTest, IsBuildTargeted) {
// canary
const chrome::VersionInfo::Channel canary =