| // Copyright 2022 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "cobalt/web/url.h" |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/logging.h" |
| #include "cobalt/dom/testing/test_with_javascript.h" |
| #include "cobalt/web/testing/gtest_workarounds.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using cobalt::script::testing::MockExceptionState; |
| using ::testing::_; |
| using ::testing::SaveArg; |
| using ::testing::StrictMock; |
| |
| namespace cobalt { |
| namespace web { |
| |
| namespace { |
| class URLTest : public ::testing::Test { |
| public: |
| URLTest() {} |
| |
| StrictMock<MockExceptionState>* exception_state() { |
| return &exception_state_; |
| } |
| |
| private: |
| StrictMock<MockExceptionState> exception_state_; |
| }; |
| |
| class URLTestWithJavaScript : public dom::testing::TestWithJavaScript {}; |
| } // namespace |
| |
| TEST_F(URLTest, ConstructorWithValidURL) { |
| scoped_refptr<script::ScriptException> exception; |
| EXPECT_CALL(*exception_state(), SetException(_)).Times(0); |
| scoped_refptr<URL> url = |
| new URL("https://user:password@www.example.com:1234/foo/bar?baz#qux", |
| "about:blank", exception_state()); |
| |
| EXPECT_EQ("https://user:password@www.example.com:1234/foo/bar?baz#qux", |
| url->href()); |
| EXPECT_EQ("https:", url->protocol()); |
| EXPECT_EQ("www.example.com:1234", url->host()); |
| EXPECT_EQ("www.example.com", url->hostname()); |
| EXPECT_EQ("1234", url->port()); |
| EXPECT_EQ("/foo/bar", url->pathname()); |
| EXPECT_EQ("#qux", url->hash()); |
| EXPECT_EQ("?baz", url->search()); |
| } |
| |
| TEST_F(URLTest, ConstructorWithInvalidBase) { |
| EXPECT_CALL(*exception_state(), |
| SetSimpleExceptionVA(script::kTypeError, _, _)); |
| scoped_refptr<URL> url = |
| new URL("https://www.example.com", "", exception_state()); |
| |
| EXPECT_TRUE(url->href().empty()); |
| } |
| |
| TEST_F(URLTest, ConstructorWithInvalidURL) { |
| EXPECT_CALL(*exception_state(), |
| SetSimpleExceptionVA(script::kTypeError, _, _)); |
| scoped_refptr<URL> url = new URL("...:...", "about:blank", exception_state()); |
| |
| EXPECT_TRUE(url->href().empty()); |
| } |
| |
| TEST_F(URLTest, ConstructorWithValidURLAndBase) { |
| scoped_refptr<script::ScriptException> exception; |
| EXPECT_CALL(*exception_state(), SetException(_)).Times(0); |
| scoped_refptr<URL> url = new URL( |
| "quux", "https://user:password@www.example.com:1234/foo/bar?baz#qux", |
| exception_state()); |
| |
| EXPECT_EQ("https://user:password@www.example.com:1234/foo/quux", url->href()); |
| EXPECT_EQ("https:", url->protocol()); |
| EXPECT_EQ("www.example.com:1234", url->host()); |
| EXPECT_EQ("www.example.com", url->hostname()); |
| EXPECT_EQ("1234", url->port()); |
| EXPECT_EQ("/foo/quux", url->pathname()); |
| EXPECT_EQ("", url->hash()); |
| EXPECT_EQ("", url->search()); |
| } |
| |
| TEST_F(URLTestWithJavaScript, ConstructorWithValidURL) { |
| std::string result; |
| bool success = EvaluateScript( |
| "var url = new " |
| "URL('https://user:password@www.example.com:1234/foo/bar?baz#qux');" |
| "if (url.href == " |
| "'https://user:password@www.example.com:1234/foo/bar?baz#qux' &&" |
| " url.protocol == 'https:' &&" |
| " url.host == 'www.example.com:1234' &&" |
| " url.hostname == 'www.example.com' &&" |
| " url.port == '1234' &&" |
| " url.pathname == '/foo/bar' &&" |
| " url.hash == '#qux' &&" |
| " url.search == '?baz') " |
| " url.href;", |
| &result); |
| EXPECT_TRUE(success); |
| EXPECT_EQ("https://user:password@www.example.com:1234/foo/bar?baz#qux", |
| result); |
| |
| if (success) { |
| LOG(INFO) << "Test result : " |
| << "\"" << result << "\""; |
| } else { |
| DLOG(ERROR) << "Failed to evaluate test: " |
| << "\"" << result << "\""; |
| } |
| } |
| |
| TEST_F(URLTestWithJavaScript, ConstructorWithInvalidBase) { |
| std::string result; |
| bool success = EvaluateScript( |
| "let result = 'unknown';" |
| "try {" |
| " var url = new URL('https://www.example.com', '');" |
| "} catch (e) {" |
| " result = e.name;" |
| "}" |
| "if (!url) result;", |
| &result); |
| EXPECT_TRUE(success); |
| EXPECT_EQ("TypeError", result); |
| |
| if (success) { |
| LOG(INFO) << "Test result : " |
| << "\"" << result << "\""; |
| } else { |
| DLOG(ERROR) << "Failed to evaluate test: " |
| << "\"" << result << "\""; |
| } |
| } |
| |
| TEST_F(URLTestWithJavaScript, ConstructorWithInvalidURL) { |
| std::string result; |
| bool success = EvaluateScript( |
| "let result = 'unknown';" |
| "try {" |
| " var url = new URL('...:...');" |
| "} catch (e) {" |
| " result = e.name;" |
| "}" |
| "if (!url) result;", |
| &result); |
| EXPECT_TRUE(success); |
| EXPECT_EQ("TypeError", result); |
| |
| if (success) { |
| LOG(INFO) << "Test result : " |
| << "\"" << result << "\""; |
| } else { |
| DLOG(ERROR) << "Failed to evaluate test: " |
| << "\"" << result << "\""; |
| } |
| } |
| |
| } // namespace web |
| } // namespace cobalt |