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