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)#include "chrome/browser/chromeos/app_mode/fake_cws.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/path_service.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "crypto/sha2.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using net::test_server::BasicHttpResponse; 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using net::test_server::EmbeddedTestServer; 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using net::test_server::HttpRequest; 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using net::test_server::HttpResponse; 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chromeos { 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kWebstoreDomain[] = "cws.com"; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Kiosk app crx file download path under web store site. 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kCrxDownloadPath[] = "/chromeos/app_mode/webstore/downloads/"; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::Init(EmbeddedTestServer* embedded_test_server) { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetupWebStore(embedded_test_server->base_url()); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetupWebStoreGalleryUrl(); 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetupCrxDownloadAndUpdateUrls(embedded_test_server); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetUpdateCrx(const std::string& app_id, 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& crx_file, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version) { 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL crx_download_url = web_store_url_.Resolve(kCrxDownloadPath + crx_file); 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath test_data_dir; 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath crx_file_path = 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_data_dir.AppendASCII("chromeos/app_mode/webstore/downloads") 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .AppendASCII(crx_file); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string crx_content; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(crx_file_path, &crx_content)); 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string sha256 = crypto::SHA256HashString(crx_content); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string sha256_hex = base::HexEncode(sha256.c_str(), sha256.size()); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetUpdateCheckContent( 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "chromeos/app_mode/webstore/update_check/has_update.xml", 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) crx_download_url, 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) app_id, 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sha256_hex, 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UintToString(crx_content.size()), 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) version, 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &update_check_content_); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetNoUpdate(const std::string& app_id) { 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetUpdateCheckContent("chromeos/app_mode/webstore/update_check/no_update.xml", 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(), 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) app_id, 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "", 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "", 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "", 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &update_check_content_); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetupWebStore(const GURL& test_server_url) { 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string webstore_host(kWebstoreDomain); 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL::Replacements replace_webstore_host; 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) replace_webstore_host.SetHostStr(webstore_host); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_store_url_ = test_server_url.ReplaceComponents(replace_webstore_host); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetupWebStoreGalleryUrl() { 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ::switches::kAppsGalleryURL, 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_store_url_.Resolve("/chromeos/app_mode/webstore").spec()); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetupCrxDownloadAndUpdateUrls( 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EmbeddedTestServer* embedded_test_server) { 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetupCrxDownloadUrl(); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetupCrxUpdateUrl(embedded_test_server); 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetupCrxDownloadUrl() { 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string downloads_path = std::string(kCrxDownloadPath).append("%s.crx"); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL downloads_url = web_store_url_.Resolve(downloads_path); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ::switches::kAppsGalleryDownloadURL, downloads_url.spec()); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetupCrxUpdateUrl(EmbeddedTestServer* embedded_test_server) { 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL update_url = web_store_url_.Resolve("/update_check.xml"); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ::switches::kAppsGalleryUpdateURL, update_url.spec()); 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedded_test_server->RegisterRequestHandler( 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&FakeCWS::HandleRequest, base::Unretained(this))); 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FakeCWS::SetUpdateCheckContent(const std::string& update_check_file, 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& crx_download_url, 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& app_id, 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& crx_fp, 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& crx_size, 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string* update_check_content) { 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath test_data_dir; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath update_file = 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_data_dir.AppendASCII(update_check_file.c_str()); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(update_file, update_check_content)); 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReplaceSubstringsAfterOffset(update_check_content, 0, "$AppId", app_id); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReplaceSubstringsAfterOffset( 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) update_check_content, 0, "$CrxDownloadUrl", crx_download_url.spec()); 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReplaceSubstringsAfterOffset(update_check_content, 0, "$FP", crx_fp); 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReplaceSubstringsAfterOffset(update_check_content, 0, "$Size", crx_size); 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReplaceSubstringsAfterOffset(update_check_content, 0, "$Version", version); 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<HttpResponse> FakeCWS::HandleRequest(const HttpRequest& request) { 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL request_url = GURL("http://localhost").Resolve(request.relative_url); 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string request_path = request_url.path(); 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!update_check_content_.empty() && 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request_path.find("/update_check.xml") != std::string::npos) { 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<BasicHttpResponse> http_response(new BasicHttpResponse()); 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) http_response->set_code(net::HTTP_OK); 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) http_response->set_content_type("text/xml"); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) http_response->set_content(update_check_content_); 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return http_response.PassAs<HttpResponse>(); 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<HttpResponse>(); 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace chromeos 148