| Index: chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
|
| diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc b/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
|
| index edbf4fc10163c734fce696352d4913e4e1e0391c..c46cfb298a881803b10032fa1834624b027dbd26 100644
|
| --- a/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
|
| +++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
|
| @@ -35,41 +35,43 @@ namespace test {
|
| namespace {
|
|
|
| // Mock results.
|
| -const char kOneResult[] = "{"
|
| +const char kOneResult[] =
|
| + "{"
|
| "\"search_url\": \"http://host/search\","
|
| "\"results\":["
|
| - "{"
|
| - "\"id\": \"app1_id\","
|
| - "\"localized_name\": \"app1 name\","
|
| - "\"icon_url\": \"http://host/icon\","
|
| - "\"is_paid\": false"
|
| - "}"
|
| + " {"
|
| + " \"id\": \"app1_id\","
|
| + " \"localized_name\": \"app1 name\","
|
| + " \"icon_url\": \"http://host/icon\","
|
| + " \"is_paid\": false"
|
| + " }"
|
| "]}";
|
|
|
| -const char kThreeResults[] = "{"
|
| +const char kThreeResults[] =
|
| + "{"
|
| "\"search_url\": \"http://host/search\","
|
| "\"results\":["
|
| - "{"
|
| - "\"id\": \"app1_id\","
|
| - "\"localized_name\": \"one\","
|
| - "\"icon_url\": \"http://host/icon1\","
|
| - "\"is_paid\": true,"
|
| - "\"item_type\": \"PLATFORM_APP\""
|
| - "},"
|
| - "{"
|
| - "\"id\": \"app2_id\","
|
| - "\"localized_name\": \"two\","
|
| - "\"icon_url\": \"http://host/icon2\","
|
| - "\"is_paid\": false,"
|
| - "\"item_type\": \"HOSTED_APP\""
|
| - "},"
|
| - "{"
|
| - "\"id\": \"app3_id\","
|
| - "\"localized_name\": \"three\","
|
| - "\"icon_url\": \"http://host/icon3\","
|
| - "\"is_paid\": false,"
|
| - "\"item_type\": \"LEGACY_PACKAGED_APP\""
|
| - "}"
|
| + " {"
|
| + " \"id\": \"app1_id\","
|
| + " \"localized_name\": \"one\","
|
| + " \"icon_url\": \"http://host/icon1\","
|
| + " \"is_paid\": true,"
|
| + " \"item_type\": \"PLATFORM_APP\""
|
| + " },"
|
| + " {"
|
| + " \"id\": \"app2_id\","
|
| + " \"localized_name\": \"two\","
|
| + " \"icon_url\": \"http://host/icon2\","
|
| + " \"is_paid\": false,"
|
| + " \"item_type\": \"HOSTED_APP\""
|
| + " },"
|
| + " {"
|
| + " \"id\": \"app3_id\","
|
| + " \"localized_name\": \"three\","
|
| + " \"icon_url\": \"http://host/icon3\","
|
| + " \"is_paid\": false,"
|
| + " \"item_type\": \"LEGACY_PACKAGED_APP\""
|
| + " }"
|
| "]}";
|
|
|
| struct ParsedSearchResult {
|
| @@ -81,17 +83,31 @@ struct ParsedSearchResult {
|
| size_t num_actions;
|
| };
|
|
|
| -ParsedSearchResult kParsedOneResult[] = {{"app1_id", "app1 name",
|
| - "http://host/icon", false,
|
| - Manifest::TYPE_UNKNOWN, 1}};
|
| -
|
| -ParsedSearchResult kParsedThreeResults[] = {
|
| - {"app1_id", "one", "http://host/icon1", true, Manifest::TYPE_PLATFORM_APP,
|
| - 1},
|
| - {"app2_id", "two", "http://host/icon2", false, Manifest::TYPE_HOSTED_APP,
|
| - 1},
|
| - {"app3_id", "three", "http://host/icon3", false,
|
| - Manifest::TYPE_LEGACY_PACKAGED_APP, 1}};
|
| +ParsedSearchResult kParsedOneResult[] = {{"app1_id",
|
| + "app1 name",
|
| + "http://host/icon",
|
| + false,
|
| + Manifest::TYPE_UNKNOWN,
|
| + 1}};
|
| +
|
| +ParsedSearchResult kParsedThreeResults[] = {{"app1_id",
|
| + "one",
|
| + "http://host/icon1",
|
| + true,
|
| + Manifest::TYPE_PLATFORM_APP,
|
| + 1},
|
| + {"app2_id",
|
| + "two",
|
| + "http://host/icon2",
|
| + false,
|
| + Manifest::TYPE_HOSTED_APP,
|
| + 1},
|
| + {"app3_id",
|
| + "three",
|
| + "http://host/icon3",
|
| + false,
|
| + Manifest::TYPE_LEGACY_PACKAGED_APP,
|
| + 1}};
|
|
|
| } // namespace
|
|
|
| @@ -131,7 +147,7 @@ class WebstoreProviderTest : public InProcessBrowserTest {
|
| const std::string& mock_server_response) {
|
| webstore_provider_->Start(false, base::UTF8ToUTF16(query));
|
|
|
| - if (webstore_provider_->webstore_search_ && !mock_server_response.empty()) {
|
| + if (webstore_provider_->query_pending_ && !mock_server_response.empty()) {
|
| mock_server_response_ = mock_server_response;
|
|
|
| DCHECK(!run_loop_);
|
| @@ -163,7 +179,7 @@ class WebstoreProviderTest : public InProcessBrowserTest {
|
| ASSERT_EQ(expected_result_size, webstore_provider_->results().size());
|
| for (size_t i = 0; i < expected_result_size; ++i) {
|
| const SearchResult* result = webstore_provider_->results()[i];
|
| - ASSERT_EQ(extensions::Extension::GetBaseURLFromExtensionId(
|
| + EXPECT_EQ(extensions::Extension::GetBaseURLFromExtensionId(
|
| expected_results[i].id).spec(),
|
| result->id());
|
| EXPECT_EQ(std::string(expected_results[i].title),
|
| @@ -197,9 +213,9 @@ class WebstoreProviderTest : public InProcessBrowserTest {
|
| scoped_ptr<BasicHttpResponse> response(new BasicHttpResponse);
|
|
|
| if (request.relative_url.find("/jsonsearch?") != std::string::npos) {
|
| - if (mock_server_response_ == "404") {
|
| + if (mock_server_response_ == "ERROR_NOT_FOUND") {
|
| response->set_code(net::HTTP_NOT_FOUND);
|
| - } else if (mock_server_response_ == "500") {
|
| + } else if (mock_server_response_ == "ERROR_INTERNAL_SERVER_ERROR") {
|
| response->set_code(net::HTTP_INTERNAL_SERVER_ERROR);
|
| } else {
|
| response->set_code(net::HTTP_OK);
|
| @@ -240,21 +256,29 @@ IN_PROC_BROWSER_TEST_F(WebstoreProviderTest, MAYBE_Basic) {
|
| const ParsedSearchResult* expected_results;
|
| size_t expected_result_size;
|
| } kTestCases[] = {
|
| - // "Search in web store" result with query text itself is used for
|
| - // synchronous placeholder, bad server response etc.
|
| - {"synchronous", "", "synchronous", NULL, 0 },
|
| - {"404", "404", "404", NULL, 0 },
|
| - {"500", "500", "500", NULL, 0 },
|
| - {"bad json", "invalid json", "bad json", NULL, 0 },
|
| - // Good results.
|
| - {"1 result", kOneResult, "app1 name", kParsedOneResult, 1 },
|
| - {"3 result", kThreeResults, "one,two,three", kParsedThreeResults, 3 },
|
| + // Note: If a search results in an error, or returns 0 results, we expect
|
| + // the webstore provider to leave a placeholder "search in web store"
|
| + // result with the same title as the search query. So all cases where
|
| + // |expected_result_titles| == |query| means we are expecting an error.
|
| +
|
| + // A search that returns 0 results.
|
| + {"synchronous", "", "synchronous", NULL, 0},
|
| + // Getting an error response from the server (note: the responses
|
| + // "ERROR_NOT_FOUND" and "ERROR_INTERNAL_SERVER_ERROR" are treated
|
| + // specially by HandleResponse).
|
| + {"404", "ERROR_NOT_FOUND", "404", NULL, 0},
|
| + {"500", "ERROR_INTERNAL_SERVER_ERROR", "500", NULL, 0},
|
| + // Getting bad JSON from the server.
|
| + {"bad json", "invalid json", "bad json", NULL, 0},
|
| + // Good results.
|
| + {"1 result", kOneResult, "app1 name", kParsedOneResult, 1},
|
| + {"3 result", kThreeResults, "one,two,three", kParsedThreeResults, 3},
|
| };
|
|
|
| for (size_t i = 0; i < arraysize(kTestCases); ++i) {
|
| if (kTestCases[i].expected_result_titles) {
|
| RunQuery(kTestCases[i].query, kTestCases[i].mock_server_response);
|
| - ASSERT_EQ(kTestCases[i].expected_result_titles, GetResultTitles())
|
| + EXPECT_EQ(kTestCases[i].expected_result_titles, GetResultTitles())
|
| << "Case " << i << ": q=" << kTestCases[i].query;
|
|
|
| if (kTestCases[i].expected_results) {
|
| @@ -269,17 +293,17 @@ IN_PROC_BROWSER_TEST_F(WebstoreProviderTest, NoSearchForSensitiveData) {
|
| // None of the following input strings should be accepted because they may
|
| // contain private data.
|
| const char* inputs[] = {
|
| - // file: scheme is bad.
|
| - "file://filename",
|
| - "FILE://filename",
|
| - // URLs with usernames, ports, queries or refs are bad.
|
| - "http://username:password@hostname/",
|
| - "http://www.example.com:1000",
|
| - "http://foo:1000",
|
| - "http://hostname/?query=q",
|
| - "http://hostname/path#ref",
|
| - // A https URL with path is bad.
|
| - "https://hostname/path",
|
| + // file: scheme is bad.
|
| + "file://filename",
|
| + "FILE://filename",
|
| + // URLs with usernames, ports, queries or refs are bad.
|
| + "http://username:password@hostname/",
|
| + "http://www.example.com:1000",
|
| + "http://foo:1000",
|
| + "http://hostname/?query=q",
|
| + "http://hostname/path#ref",
|
| + // A https URL with path is bad.
|
| + "https://hostname/path",
|
| };
|
|
|
| for (size_t i = 0; i < arraysize(inputs); ++i) {
|
|
|