1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector> 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/shell.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/time/time.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/customization_document.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/customization_wallpaper_downloader.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/chromeos_switches.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/http/http_response_headers.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/http/http_status_code.h" 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/url_fetcher_impl.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chromeos { 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kOEMWallpaperURL[] = "http://somedomain.com/image.png"; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kServicesManifest[] = 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "{" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"version\": \"1.0\"," 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"default_wallpaper\": \"http://somedomain.com/image.png\",\n" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"default_apps\": [\n" 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " ],\n" 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"localized_content\": {\n" 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"en-US\": {\n" 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"default_apps_folder_name\": \"EN-US OEM Name\"\n" 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " },\n" 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"en\": {\n" 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"default_apps_folder_name\": \"EN OEM Name\"\n" 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " },\n" 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"default\": {\n" 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"default_apps_folder_name\": \"Default OEM Name\"\n" 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " }\n" 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " }\n" 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "}"; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Expected minimal wallpaper download retry interval in milliseconds. 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kDownloadRetryIntervalMS = 100; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TestWallpaperObserver : public WallpaperManager::Observer { 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit TestWallpaperObserver(WallpaperManager* wallpaper_manager) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : finished_(false), 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_(wallpaper_manager) { 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(wallpaper_manager_); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_->AddObserver(this); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~TestWallpaperObserver() { 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_->RemoveObserver(this); 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnWallpaperAnimationFinished(const std::string&) OVERRIDE { 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) finished_ = true; 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->Quit(); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void WaitForWallpaperAnimationFinished() { 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while (!finished_) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop().Run(); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool finished_; 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WallpaperManager* wallpaper_manager_; 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWallpaperObserver); 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This is helper class for net::FakeURLFetcherFactory. 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TestWallpaperImageURLFetcherCallback { 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestWallpaperImageURLFetcherCallback( 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t require_retries, 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<unsigned char>& jpeg_data_raw) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : url_(url), 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) require_retries_(require_retries), 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factory_(NULL) { 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) jpeg_data_.resize(jpeg_data_raw.size()); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::copy(jpeg_data_raw.begin(), jpeg_data_raw.end(), jpeg_data_.begin()); 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<net::FakeURLFetcher> CreateURLFetcher( 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLFetcherDelegate* delegate, 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& response_data, 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::HttpStatusCode response_code, 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequestStatus::Status status) { 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::ServicesCustomizationDocument* customization = 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::ServicesCustomizationDocument::GetInstance(); 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) customization->wallpaper_downloader_for_testing() 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->set_retry_delay_for_testing( 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kDownloadRetryIntervalMS)); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) attempts_.push_back(base::TimeTicks::Now()); 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (attempts_.size() > 1) { 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int retry = num_attempts() - 1; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::TimeDelta current_delay = 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) customization->wallpaper_downloader_for_testing() 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->retry_current_delay_for_testing(); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const double base_interval = base::TimeDelta::FromMilliseconds( 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kDownloadRetryIntervalMS).InSecondsF(); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GE(current_delay, 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromSecondsD(base_interval * retry * retry)) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "Retry too fast. Actual interval " << current_delay.InSecondsF() 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << " seconds, but expected at least " << base_interval 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << " * (retry=" << retry 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << " * retry)= " << base_interval * retry * retry << " seconds."; 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (attempts_.size() > require_retries_) { 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) response_code = net::HTTP_OK; 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) status = net::URLRequestStatus::SUCCESS; 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factory_->SetFakeResponse(url, response_data, response_code, status); 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher( 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url, delegate, response_data, response_code, status)); 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders> download_headers = 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new net::HttpResponseHeaders(std::string()); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) download_headers->AddHeader("Content-Type: image/jpeg"); 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fetcher->set_response_headers(download_headers); 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return fetcher.Pass(); 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Initialize(net::FakeURLFetcherFactory* factory) { 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factory_ = factory; 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factory_->SetFakeResponse(url_, 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) jpeg_data_, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::HTTP_INTERNAL_SERVER_ERROR, 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequestStatus::FAILED); 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t num_attempts() const { return attempts_.size(); } 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL url_; 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Respond with OK on required retry attempt. 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t require_retries_; 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::FakeURLFetcherFactory* factory_; 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<base::TimeTicks> attempts_; 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string jpeg_data_; 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWallpaperImageURLFetcherCallback); 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This implements fake remote source for wallpaper image. 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// JPEG image is created here and served to CustomizationWallpaperDownloader 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// via net::FakeURLFetcher. 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class WallpaperImageFetcherFactory { 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WallpaperImageFetcherFactory(const GURL& url, 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int width, 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int height, 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SkColor color, 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t require_retries) { 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ASSERT_TRUE() cannot be directly used in constructor. 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Initialize(url, width, height, color, require_retries); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~WallpaperImageFetcherFactory() { 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fetcher_factory_.reset(); 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLFetcherImpl::set_factory(fallback_fetcher_factory_.get()); 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fallback_fetcher_factory_.reset(); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t num_attempts() const { return url_callback_->num_attempts(); } 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Initialize(const GURL& url, 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int width, 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int height, 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SkColor color, 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t require_retries) { 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<unsigned char> oem_wallpaper_; 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(wallpaper_manager_test_utils::CreateJPEGImage( 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) width, height, color, &oem_wallpaper_)); 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_callback_.reset(new TestWallpaperImageURLFetcherCallback( 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url, require_retries, oem_wallpaper_)); 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fallback_fetcher_factory_.reset(new net::TestURLFetcherFactory); 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLFetcherImpl::set_factory(NULL); 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fetcher_factory_.reset(new net::FakeURLFetcherFactory( 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fallback_fetcher_factory_.get(), 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&TestWallpaperImageURLFetcherCallback::CreateURLFetcher, 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(url_callback_.get())))); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_callback_->Initialize(fetcher_factory_.get()); 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestWallpaperImageURLFetcherCallback> url_callback_; 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Use a test factory as a fallback so we don't have to deal with other 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // requests. 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<net::TestURLFetcherFactory> fallback_fetcher_factory_; 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<net::FakeURLFetcherFactory> fetcher_factory_; 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WallpaperImageFetcherFactory); 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CustomizationWallpaperDownloaderBrowserTest 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : public InProcessBrowserTest { 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CustomizationWallpaperDownloaderBrowserTest() 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : controller_(NULL), 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local_state_(NULL) { 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~CustomizationWallpaperDownloaderBrowserTest() {} 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller_ = ash::Shell::GetInstance()->desktop_background_controller(); 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local_state_ = g_browser_process->local_state(); 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitch(chromeos::switches::kLoginManager); 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, "user"); 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void CleanUpOnMainThread() OVERRIDE { controller_ = NULL; } 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void CreateCmdlineWallpapers() { 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmdline_wallpaper_dir_.reset(new base::ScopedTempDir); 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(cmdline_wallpaper_dir_->CreateUniqueTempDir()); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::CreateCmdlineWallpapers( 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *cmdline_wallpaper_dir_, &wallpaper_manager_command_line_); 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::DesktopBackgroundController* controller_; 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefService* local_state_; 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::CommandLine> wallpaper_manager_command_line_; 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Directory created by CreateCmdlineWallpapersAndSetFlags() to store default 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // wallpaper images. 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ScopedTempDir> cmdline_wallpaper_dir_; 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CustomizationWallpaperDownloaderBrowserTest); 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CustomizationWallpaperDownloaderBrowserTest, 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OEMWallpaperIsPresent) { 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateCmdlineWallpapers(); 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WallpaperManager::Get()->SetDefaultWallpaperNow(std::string()); 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished(); 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor( 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller_->GetWallpaper(), 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kSmallDefaultWallpaperColor)); 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WallpaperImageFetcherFactory url_factory( 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(kOEMWallpaperURL), 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kWallpaperSize, 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kWallpaperSize, 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kCustomWallpaperColor, 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0 /* require_retries */); 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestWallpaperObserver observer(WallpaperManager::Get()); 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::ServicesCustomizationDocument* customization = 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::ServicesCustomizationDocument::GetInstance(); 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE( 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) customization->LoadManifestFromString(std::string(kServicesManifest))); 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observer.WaitForWallpaperAnimationFinished(); 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor( 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller_->GetWallpaper(), 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kCustomWallpaperColor)); 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1U, url_factory.num_attempts()); 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(CustomizationWallpaperDownloaderBrowserTest, 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OEMWallpaperRetryFetch) { 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateCmdlineWallpapers(); 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WallpaperManager::Get()->SetDefaultWallpaperNow(std::string()); 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished(); 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor( 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller_->GetWallpaper(), 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kSmallDefaultWallpaperColor)); 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WallpaperImageFetcherFactory url_factory( 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(kOEMWallpaperURL), 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kWallpaperSize, 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kWallpaperSize, 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kCustomWallpaperColor, 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1 /* require_retries */); 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestWallpaperObserver observer(WallpaperManager::Get()); 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::ServicesCustomizationDocument* customization = 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::ServicesCustomizationDocument::GetInstance(); 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE( 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) customization->LoadManifestFromString(std::string(kServicesManifest))); 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observer.WaitForWallpaperAnimationFinished(); 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor( 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller_->GetWallpaper(), 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_manager_test_utils::kCustomWallpaperColor)); 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2U, url_factory.num_attempts()); 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace chromeos 321