1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm>
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/error_utils.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/common/manifest_handlers/externally_connectable.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/manifest_test.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::ElementsAre;
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace errors = externally_connectable_errors;
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ExternallyConnectableTest : public ManifestTest {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExternallyConnectableTest() {}
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ExternallyConnectableTest() {}
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) protected:
275e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  ExternallyConnectableInfo* GetExternallyConnectableInfo(
285e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      scoped_refptr<Extension> extension) {
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return static_cast<ExternallyConnectableInfo*>(
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        extension->GetManifestData(manifest_keys::kExternallyConnectable));
315e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  }
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, IDsAndMatches) {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension =
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectSuccess("externally_connectable_ids_and_matches.json");
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(extension.get());
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kWebConnectable));
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExternallyConnectableInfo* info =
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExternallyConnectableInfo::Get(extension.get());
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(info);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_THAT(info->ids,
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              ElementsAre("abcdefghijklmnopabcdefghijklmnop",
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "ponmlkjihgfedcbaponmlkjihgfedcba"));
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(info->all_ids);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://example.com")));
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://example.com/")));
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://example.com/index.html")));
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://google.com")));
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://google.com/")));
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://google.com/index.html")));
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://www.google.com")));
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://www.google.com/")));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://google.com")));
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://google.com/")));
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org/")));
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      info->matches.MatchesURL(GURL("http://build.chromium.org/index.html")));
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("https://build.chromium.org")));
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("https://build.chromium.org/")));
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      info->matches.MatchesURL(GURL("http://foo.chromium.org/index.html")));
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://yahoo.com")));
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://yahoo.com/")));
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TLD-style patterns should match just the TLD.
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://appspot.com/foo.html")));
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://com")));
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://go/here")));
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TLD-style patterns should *not* match any subdomains of the TLD.
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      info->matches.MatchesURL(GURL("http://codereview.appspot.com/foo.html")));
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      info->matches.MatchesURL(GURL("http://chromium.com/index.html")));
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://here.go/somewhere")));
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Paths that don't have any wildcards should match the exact domain, but
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // ignore the trailing slash. This is kind of a corner case, so let's test it.
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://no.wildcard.path")));
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://no.wildcard.path/")));
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      info->matches.MatchesURL(GURL("http://no.wildcard.path/index.html")));
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, IDs) {
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension =
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectSuccess("externally_connectable_ids.json");
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(extension.get());
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->HasAPIPermission(
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kWebConnectable));
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExternallyConnectableInfo* info =
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExternallyConnectableInfo::Get(extension.get());
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(info);
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_THAT(info->ids,
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              ElementsAre("abcdefghijklmnopabcdefghijklmnop",
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "ponmlkjihgfedcbaponmlkjihgfedcba"));
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(info->all_ids);
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://google.com/index.html")));
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, Matches) {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension =
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectSuccess("externally_connectable_matches.json");
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(extension.get());
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kWebConnectable));
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExternallyConnectableInfo* info =
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExternallyConnectableInfo::Get(extension.get());
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(info);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_THAT(info->ids, ElementsAre());
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(info->all_ids);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(info->accepts_tls_channel_id);
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://example.com")));
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://example.com/")));
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://example.com/index.html")));
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://google.com")));
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://google.com/")));
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://google.com/index.html")));
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://www.google.com")));
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://www.google.com/")));
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://google.com")));
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://google.com/")));
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org/")));
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      info->matches.MatchesURL(GURL("http://build.chromium.org/index.html")));
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("https://build.chromium.org")));
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("https://build.chromium.org/")));
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      info->matches.MatchesURL(GURL("http://foo.chromium.org/index.html")));
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://yahoo.com")));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://yahoo.com/")));
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ExternallyConnectableTest, MatchesWithTlsChannelId) {
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectSuccess(
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "externally_connectable_matches_tls_channel_id.json");
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(extension.get());
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kWebConnectable));
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ExternallyConnectableInfo* info =
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExternallyConnectableInfo::Get(extension.get());
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(info);
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_THAT(info->ids, ElementsAre());
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(info->all_ids);
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(info->accepts_tls_channel_id);
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The matches portion of the manifest is identical to those in
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // externally_connectable_matches, so only a subset of the Matches tests is
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // repeated here.
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://example.com")));
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://example.com/index.html")));
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, AllIDs) {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension =
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectSuccess("externally_connectable_all_ids.json");
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(extension.get());
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->HasAPIPermission(
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kWebConnectable));
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExternallyConnectableInfo* info =
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExternallyConnectableInfo::Get(extension.get());
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(info);
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_THAT(info->ids,
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              ElementsAre("abcdefghijklmnopabcdefghijklmnop",
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "ponmlkjihgfedcbaponmlkjihgfedcba"));
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(info->all_ids);
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(info->matches.MatchesURL(GURL("http://google.com/index.html")));
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ExternallyConnectableTest, IdCanConnect) {
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Not in order to test that ExternallyConnectableInfo sorts it.
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string matches_ids_array[] = {"g", "h", "c", "i", "a", "z", "b"};
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<std::string> matches_ids(
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      matches_ids_array, matches_ids_array + arraysize(matches_ids_array));
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string nomatches_ids_array[] = {"2", "3", "1"};
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // all_ids = false.
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ExternallyConnectableInfo info(URLPatternSet(), matches_ids, false, false);
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < matches_ids.size(); ++i)
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_TRUE(info.IdCanConnect(matches_ids[i]));
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < arraysize(nomatches_ids_array); ++i)
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_FALSE(info.IdCanConnect(nomatches_ids_array[i]));
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // all_ids = true.
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ExternallyConnectableInfo info(URLPatternSet(), matches_ids, true, false);
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < matches_ids.size(); ++i)
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_TRUE(info.IdCanConnect(matches_ids[i]));
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < arraysize(nomatches_ids_array); ++i)
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_TRUE(info.IdCanConnect(nomatches_ids_array[i]));
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, ErrorWrongFormat) {
2345e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  LoadAndExpectError("externally_connectable_error_wrong_format.json",
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                     "expected dictionary, got string");
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, ErrorBadID) {
2395e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  LoadAndExpectError(
2405e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "externally_connectable_bad_id.json",
2415e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      ErrorUtils::FormatErrorMessage(errors::kErrorInvalidId, "badid"));
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExternallyConnectableTest, ErrorBadMatches) {
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadAndExpectError("externally_connectable_error_bad_matches.json",
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     ErrorUtils::FormatErrorMessage(
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         errors::kErrorInvalidMatchPattern, "www.yahoo.com"));
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2505e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)TEST_F(ExternallyConnectableTest, WarningNoAllURLs) {
2515e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectWarning(
2525e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "externally_connectable_error_all_urls.json",
2535e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      ErrorUtils::FormatErrorMessage(errors::kErrorWildcardHostsNotAllowed,
2545e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)                                     "<all_urls>"));
2555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(info->matches.MatchesAllURLs());
2575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_FALSE(info->matches.ContainsPattern(
2585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "<all_urls>")));
2595e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://example.com")));
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ExternallyConnectableTest, AllURLsNotWhitelisted) {
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension = LoadAndExpectSuccess(
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "externally_connectable_all_urls_not_whitelisted.json");
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(info->matches.MatchesAllURLs());
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ExternallyConnectableTest, AllURLsWhitelisted) {
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension =
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      LoadAndExpectSuccess("externally_connectable_all_urls_whitelisted.json");
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(info->matches.MatchesAllURLs());
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLPattern pattern(URLPattern::SCHEME_ALL, "<all_urls>");
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(info->matches.ContainsPattern(pattern));
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://example.com")));
2785e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2815e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)TEST_F(ExternallyConnectableTest, WarningWildcardHost) {
2825e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectWarning(
2835e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "externally_connectable_error_wildcard_host.json",
2845e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      ErrorUtils::FormatErrorMessage(errors::kErrorWildcardHostsNotAllowed,
2855e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)                                     "http://*/*"));
2865e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
2875e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_FALSE(info->matches.ContainsPattern(
2885e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "http://*/*")));
2895e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://example.com")));
2905e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2935e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)TEST_F(ExternallyConnectableTest, WarningNoTLD) {
2945e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectWarning(
2955e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "externally_connectable_error_tld.json",
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ErrorUtils::FormatErrorMessage(errors::kErrorTopLevelDomainsNotAllowed,
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "co.uk",
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "http://*.co.uk/*"));
2995e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
3005e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_FALSE(info->matches.ContainsPattern(
3015e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "http://*.co.uk/*")));
3025e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://example.com")));
3035e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3065e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)TEST_F(ExternallyConnectableTest, WarningNoEffectiveTLD) {
3075e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectWarning(
3085e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "externally_connectable_error_effective_tld.json",
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ErrorUtils::FormatErrorMessage(errors::kErrorTopLevelDomainsNotAllowed,
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "appspot.com",
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "http://*.appspot.com/*"));
3125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
3135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_FALSE(info->matches.ContainsPattern(
3145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "http://*.appspot.com/*")));
3155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://example.com")));
3165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)TEST_F(ExternallyConnectableTest, WarningUnknownTLD) {
3205e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectWarning(
3215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "externally_connectable_error_unknown_tld.json",
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ErrorUtils::FormatErrorMessage(errors::kErrorTopLevelDomainsNotAllowed,
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "notatld",
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "http://*.notatld/*"));
3255e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  ExternallyConnectableInfo* info = GetExternallyConnectableInfo(extension);
3265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_FALSE(info->matches.ContainsPattern(
3275e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "http://*.notatld/*")));
3285e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("https://example.com")));
3295e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_TRUE(info->matches.MatchesURL(GURL("http://build.chromium.org")));
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ExternallyConnectableTest, WarningNothingSpecified) {
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  LoadAndExpectWarning("externally_connectable_nothing_specified.json",
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       errors::kErrorNothingSpecified);
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace extensions
338