| // Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights |
| // reserved. Use of this source code is governed by a BSD-style license that |
| // can be found in the LICENSE file. |
| |
| #include "include/cef_parser.h" |
| #include "tests/gtest/include/gtest/gtest.h" |
| |
| // Create the URL using the spec. |
| TEST(ParserTest, CreateURLSpec) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.spec) |
| .FromASCII( |
| "http://user:pass@www.example.com:88/path/" |
| "to.html?foo=test&bar=test2"); |
| EXPECT_TRUE(CefCreateURL(parts, url)); |
| EXPECT_STREQ( |
| "http://user:pass@www.example.com:88/path/to.html?foo=test&bar=test2", |
| url.ToString().c_str()); |
| } |
| |
| // Test that host is required. |
| TEST(ParserTest, CreateURLHostRequired) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.scheme).FromASCII("http"); |
| EXPECT_FALSE(CefCreateURL(parts, url)); |
| } |
| |
| // Test that scheme is required. |
| TEST(ParserTest, CreateURLSchemeRequired) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.host).FromASCII("www.example.com"); |
| EXPECT_FALSE(CefCreateURL(parts, url)); |
| } |
| |
| // Create the URL using scheme and host. |
| TEST(ParserTest, CreateURLSchemeHost) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.scheme).FromASCII("http"); |
| CefString(&parts.host).FromASCII("www.example.com"); |
| EXPECT_TRUE(CefCreateURL(parts, url)); |
| EXPECT_STREQ("http://www.example.com/", url.ToString().c_str()); |
| } |
| |
| // Create the URL using scheme, host and path. |
| TEST(ParserTest, CreateURLSchemeHostPath) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.scheme).FromASCII("http"); |
| CefString(&parts.host).FromASCII("www.example.com"); |
| CefString(&parts.path).FromASCII("/path/to.html"); |
| EXPECT_TRUE(CefCreateURL(parts, url)); |
| EXPECT_STREQ("http://www.example.com/path/to.html", url.ToString().c_str()); |
| } |
| |
| // Create the URL using scheme, host, path and query. |
| TEST(ParserTest, CreateURLSchemeHostPathQuery) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.scheme).FromASCII("http"); |
| CefString(&parts.host).FromASCII("www.example.com"); |
| CefString(&parts.path).FromASCII("/path/to.html"); |
| CefString(&parts.query).FromASCII("foo=test&bar=test2"); |
| EXPECT_TRUE(CefCreateURL(parts, url)); |
| EXPECT_STREQ("http://www.example.com/path/to.html?foo=test&bar=test2", |
| url.ToString().c_str()); |
| } |
| |
| // Create the URL using scheme, host, path, query and Fragment |
| TEST(ParserTest, CreateURLSchemeHostPathQueryFragment) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.scheme).FromASCII("http"); |
| CefString(&parts.host).FromASCII("www.example.com"); |
| CefString(&parts.path).FromASCII("/path/to.html"); |
| CefString(&parts.query).FromASCII("foo=test&bar=test2"); |
| CefString(&parts.fragment).FromASCII("ref"); |
| EXPECT_TRUE(CefCreateURL(parts, url)); |
| EXPECT_STREQ("http://www.example.com/path/to.html?foo=test&bar=test2#ref", |
| url.ToString().c_str()); |
| } |
| |
| // Create the URL using all the various components. |
| TEST(ParserTest, CreateURLAll) { |
| CefURLParts parts; |
| CefString url; |
| CefString(&parts.scheme).FromASCII("http"); |
| CefString(&parts.username).FromASCII("user"); |
| CefString(&parts.password).FromASCII("pass"); |
| CefString(&parts.host).FromASCII("www.example.com"); |
| CefString(&parts.port).FromASCII("88"); |
| CefString(&parts.path).FromASCII("/path/to.html"); |
| CefString(&parts.query).FromASCII("foo=test&bar=test2"); |
| CefString(&parts.fragment).FromASCII("ref"); |
| EXPECT_TRUE(CefCreateURL(parts, url)); |
| EXPECT_STREQ( |
| "http://user:pass@www.example.com:88/path/to.html?foo=test&bar=test2#ref", |
| url.ToString().c_str()); |
| } |
| |
| // Parse the URL using scheme and host. |
| TEST(ParserTest, ParseURLSchemeHost) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII("http://www.example.com"); |
| EXPECT_TRUE(CefParseURL(url, parts)); |
| |
| CefString spec(&parts.spec); |
| EXPECT_STREQ("http://www.example.com/", spec.ToString().c_str()); |
| EXPECT_EQ(0U, parts.username.length); |
| EXPECT_EQ(0U, parts.password.length); |
| CefString scheme(&parts.scheme); |
| EXPECT_STREQ("http", scheme.ToString().c_str()); |
| CefString host(&parts.host); |
| EXPECT_STREQ("www.example.com", host.ToString().c_str()); |
| EXPECT_EQ(0U, parts.port.length); |
| CefString origin(&parts.origin); |
| EXPECT_STREQ(origin.ToString().c_str(), "http://www.example.com/"); |
| CefString path(&parts.path); |
| EXPECT_STREQ("/", path.ToString().c_str()); |
| EXPECT_EQ(0U, parts.query.length); |
| } |
| |
| // Parse the URL using scheme, host and path. |
| TEST(ParserTest, ParseURLSchemeHostPath) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII("http://www.example.com/path/to.html"); |
| EXPECT_TRUE(CefParseURL(url, parts)); |
| |
| CefString spec(&parts.spec); |
| EXPECT_STREQ("http://www.example.com/path/to.html", spec.ToString().c_str()); |
| EXPECT_EQ(0U, parts.username.length); |
| EXPECT_EQ(0U, parts.password.length); |
| CefString scheme(&parts.scheme); |
| EXPECT_STREQ("http", scheme.ToString().c_str()); |
| CefString host(&parts.host); |
| EXPECT_STREQ("www.example.com", host.ToString().c_str()); |
| EXPECT_EQ(0U, parts.port.length); |
| CefString origin(&parts.origin); |
| EXPECT_STREQ(origin.ToString().c_str(), "http://www.example.com/"); |
| CefString path(&parts.path); |
| EXPECT_STREQ("/path/to.html", path.ToString().c_str()); |
| EXPECT_EQ(0U, parts.query.length); |
| } |
| |
| // Parse the URL using scheme, host, path and query. |
| TEST(ParserTest, ParseURLSchemeHostPathQuery) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII("http://www.example.com/path/to.html?foo=test&bar=test2"); |
| EXPECT_TRUE(CefParseURL(url, parts)); |
| |
| CefString spec(&parts.spec); |
| EXPECT_STREQ("http://www.example.com/path/to.html?foo=test&bar=test2", |
| spec.ToString().c_str()); |
| EXPECT_EQ(0U, parts.username.length); |
| EXPECT_EQ(0U, parts.password.length); |
| CefString scheme(&parts.scheme); |
| EXPECT_STREQ("http", scheme.ToString().c_str()); |
| CefString host(&parts.host); |
| EXPECT_STREQ("www.example.com", host.ToString().c_str()); |
| EXPECT_EQ(0U, parts.port.length); |
| CefString origin(&parts.origin); |
| EXPECT_STREQ(origin.ToString().c_str(), "http://www.example.com/"); |
| CefString path(&parts.path); |
| EXPECT_STREQ("/path/to.html", path.ToString().c_str()); |
| CefString query(&parts.query); |
| EXPECT_STREQ("foo=test&bar=test2", query.ToString().c_str()); |
| } |
| |
| // Parse the URL using scheme, host, path, query and fragment. |
| TEST(ParserTest, ParseURLSchemeHostPathQueryFragment) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII("http://www.example.com/path/to.html?foo=test&bar=test2#ref"); |
| EXPECT_TRUE(CefParseURL(url, parts)); |
| |
| CefString spec(&parts.spec); |
| EXPECT_STREQ("http://www.example.com/path/to.html?foo=test&bar=test2#ref", |
| spec.ToString().c_str()); |
| EXPECT_EQ(0U, parts.username.length); |
| EXPECT_EQ(0U, parts.password.length); |
| CefString scheme(&parts.scheme); |
| EXPECT_STREQ("http", scheme.ToString().c_str()); |
| CefString host(&parts.host); |
| EXPECT_STREQ("www.example.com", host.ToString().c_str()); |
| EXPECT_EQ(0U, parts.port.length); |
| CefString origin(&parts.origin); |
| EXPECT_STREQ(origin.ToString().c_str(), "http://www.example.com/"); |
| CefString path(&parts.path); |
| EXPECT_STREQ("/path/to.html", path.ToString().c_str()); |
| CefString query(&parts.query); |
| EXPECT_STREQ("foo=test&bar=test2", query.ToString().c_str()); |
| CefString ref(&parts.fragment); |
| EXPECT_STREQ("ref", ref.ToString().c_str()); |
| } |
| |
| // Parse the URL using all the various components. |
| TEST(ParserTest, ParseURLAll) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII( |
| "http://user:pass@www.example.com:88/path/" |
| "to.html?foo=test&bar=test2#ref"); |
| EXPECT_TRUE(CefParseURL(url, parts)); |
| |
| CefString spec(&parts.spec); |
| EXPECT_STREQ( |
| "http://user:pass@www.example.com:88/path/to.html?foo=test&bar=test2#ref", |
| spec.ToString().c_str()); |
| CefString scheme(&parts.scheme); |
| EXPECT_STREQ("http", scheme.ToString().c_str()); |
| CefString username(&parts.username); |
| EXPECT_STREQ("user", username.ToString().c_str()); |
| CefString password(&parts.password); |
| EXPECT_STREQ("pass", password.ToString().c_str()); |
| CefString host(&parts.host); |
| EXPECT_STREQ("www.example.com", host.ToString().c_str()); |
| CefString port(&parts.port); |
| EXPECT_STREQ("88", port.ToString().c_str()); |
| CefString origin(&parts.origin); |
| EXPECT_STREQ(origin.ToString().c_str(), "http://www.example.com:88/"); |
| CefString path(&parts.path); |
| EXPECT_STREQ("/path/to.html", path.ToString().c_str()); |
| CefString query(&parts.query); |
| EXPECT_STREQ("foo=test&bar=test2", query.ToString().c_str()); |
| CefString ref(&parts.fragment); |
| EXPECT_STREQ("ref", ref.ToString().c_str()); |
| } |
| |
| // Parse an invalid URL. |
| TEST(ParserTest, ParseURLInvalid) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII("www.example.com"); |
| EXPECT_FALSE(CefParseURL(url, parts)); |
| } |
| |
| // Parse a non-standard scheme. |
| TEST(ParserTest, ParseURLNonStandard) { |
| CefURLParts parts; |
| CefString url; |
| url.FromASCII("custom:something%20else?foo#ref"); |
| EXPECT_TRUE(CefParseURL(url, parts)); |
| |
| CefString spec(&parts.spec); |
| EXPECT_STREQ("custom:something%20else?foo#ref", spec.ToString().c_str()); |
| EXPECT_EQ(0U, parts.username.length); |
| EXPECT_EQ(0U, parts.password.length); |
| CefString scheme(&parts.scheme); |
| EXPECT_STREQ("custom", scheme.ToString().c_str()); |
| EXPECT_EQ(0U, parts.host.length); |
| EXPECT_EQ(0U, parts.port.length); |
| EXPECT_EQ(0U, parts.origin.length); |
| CefString path(&parts.path); |
| EXPECT_STREQ("something%20else", path.ToString().c_str()); |
| CefString query(&parts.query); |
| EXPECT_STREQ("foo", query.ToString().c_str()); |
| CefString ref(&parts.fragment); |
| EXPECT_STREQ("ref", ref.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, FormatUrlForSecurityDisplay) { |
| CefString result; |
| |
| // Omits the protocol if it's standard. |
| result = CefFormatUrlForSecurityDisplay("http://tests.com/foo.html"); |
| EXPECT_STREQ("http://tests.com", result.ToString().c_str()); |
| |
| // Omits the port if it's the expected value for the protocol. |
| result = CefFormatUrlForSecurityDisplay("http://tests.com:80/foo.html"); |
| EXPECT_STREQ("http://tests.com", result.ToString().c_str()); |
| |
| // Don't omit non-standard ports. |
| result = CefFormatUrlForSecurityDisplay("http://tests.com:8088/foo.html"); |
| EXPECT_STREQ("http://tests.com:8088", result.ToString().c_str()); |
| |
| // Don't omit the protocol for file URLs. |
| result = CefFormatUrlForSecurityDisplay("file:///c/tests/foo.html"); |
| EXPECT_STREQ("file:///c/tests/foo.html", result.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, GetMimeType) { |
| CefString mime_type; |
| |
| mime_type = CefGetMimeType("html"); |
| EXPECT_STREQ("text/html", mime_type.ToString().c_str()); |
| |
| mime_type = CefGetMimeType("txt"); |
| EXPECT_STREQ("text/plain", mime_type.ToString().c_str()); |
| |
| mime_type = CefGetMimeType("gif"); |
| EXPECT_STREQ("image/gif", mime_type.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, Base64Encode) { |
| const std::string& test_str_decoded = "A test string"; |
| const std::string& test_str_encoded = "QSB0ZXN0IHN0cmluZw=="; |
| const CefString& encoded_value = |
| CefBase64Encode(test_str_decoded.data(), test_str_decoded.size()); |
| EXPECT_STREQ(test_str_encoded.c_str(), encoded_value.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, Base64Decode) { |
| const std::string& test_str_decoded = "A test string"; |
| const std::string& test_str_encoded = "QSB0ZXN0IHN0cmluZw=="; |
| CefRefPtr<CefBinaryValue> decoded_value = CefBase64Decode(test_str_encoded); |
| EXPECT_TRUE(decoded_value.get()); |
| |
| const size_t decoded_size = decoded_value->GetSize(); |
| EXPECT_EQ(test_str_decoded.size(), decoded_size); |
| |
| std::string decoded_str; |
| decoded_str.resize(decoded_size + 1); // Include space for NUL-terminator. |
| const size_t get_data_result = decoded_value->GetData( |
| const_cast<char*>(decoded_str.data()), decoded_size, 0); |
| EXPECT_EQ(decoded_size, get_data_result); |
| EXPECT_STREQ(test_str_decoded.c_str(), decoded_str.c_str()); |
| } |
| |
| TEST(ParserTest, URIEncode) { |
| const std::string& test_str_decoded = "A test string="; |
| const std::string& test_str_encoded = "A%20test%20string%3D"; |
| const CefString& encoded_value = CefURIEncode(test_str_decoded, false); |
| EXPECT_STREQ(test_str_encoded.c_str(), encoded_value.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, URIEncodeWithPlusSpace) { |
| const std::string& test_str_decoded = "A test string="; |
| const std::string& test_str_encoded = "A+test+string%3D"; |
| const CefString& encoded_value = CefURIEncode(test_str_decoded, true); |
| EXPECT_STREQ(test_str_encoded.c_str(), encoded_value.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, URIDecode) { |
| const std::string& test_str_decoded = "A test string="; |
| const std::string& test_str_encoded = "A%20test%20string%3D"; |
| const CefString& decoded_value = CefURIDecode( |
| test_str_encoded, false, |
| static_cast<cef_uri_unescape_rule_t>( |
| UU_SPACES | UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS)); |
| EXPECT_STREQ(test_str_decoded.c_str(), decoded_value.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, URIDecodeWithPlusSpace) { |
| const std::string& test_str_decoded = "A test string="; |
| const std::string& test_str_encoded = "A+test+string%3D"; |
| const CefString& decoded_value = |
| CefURIDecode(test_str_encoded, false, |
| static_cast<cef_uri_unescape_rule_t>( |
| UU_SPACES | UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS | |
| UU_REPLACE_PLUS_WITH_SPACE)); |
| EXPECT_STREQ(test_str_decoded.c_str(), decoded_value.ToString().c_str()); |
| } |
| |
| TEST(ParserTest, ParseJSONInvalid) { |
| const char data[] = "This is my test data"; |
| CefRefPtr<CefValue> value = CefParseJSON(data, JSON_PARSER_RFC); |
| EXPECT_FALSE(value.get()); |
| } |
| |
| TEST(ParserTest, ParseJSONNull) { |
| const char data[] = "{\"key1\":null}"; |
| CefRefPtr<CefValue> value = CefParseJSON(data, JSON_PARSER_RFC); |
| EXPECT_TRUE(value.get()); |
| EXPECT_TRUE(value->IsValid()); |
| EXPECT_TRUE(value->GetType() == VTYPE_DICTIONARY); |
| EXPECT_FALSE(value->IsOwned()); |
| CefRefPtr<CefDictionaryValue> dict = value->GetDictionary(); |
| CefDictionaryValue::KeyList key_list; |
| EXPECT_TRUE(dict->GetKeys(key_list)); |
| EXPECT_EQ(1U, key_list.size()); |
| EXPECT_EQ("key1", key_list[0].ToString()); |
| EXPECT_EQ(VTYPE_NULL, dict->GetType("key1")); |
| |
| // generate string from parsed result |
| CefString result = CefWriteJSON(value, JSON_WRITER_DEFAULT); |
| CefString expected_result = data; |
| EXPECT_EQ(expected_result, result); |
| } |
| |
| TEST(ParserTest, WriteJSONBinary) { |
| const char data[] = "\00\01\02"; |
| CefRefPtr<CefDictionaryValue> dict = CefDictionaryValue::Create(); |
| CefRefPtr<CefBinaryValue> binary = CefBinaryValue::Create(data, sizeof(data)); |
| dict->SetBinary("key1", binary); |
| CefRefPtr<CefValue> node = CefValue::Create(); |
| node->SetDictionary(dict); |
| CefString result = CefWriteJSON(node, JSON_WRITER_DEFAULT); |
| CefString expect_result = ""; |
| // binary data will be omitted. |
| EXPECT_EQ(expect_result, result); |
| } |
| |
| TEST(ParserTest, ParseJSONDictionary) { |
| const char data[] = "{\"key1\":\"value1\",\"key2\":123,\"key3\":[1,2,3]}"; |
| CefRefPtr<CefValue> value = CefParseJSON(data, JSON_PARSER_RFC); |
| EXPECT_TRUE(value.get()); |
| EXPECT_TRUE(value->IsValid()); |
| EXPECT_FALSE(value->IsOwned()); |
| EXPECT_TRUE(value->GetType() == VTYPE_DICTIONARY); |
| CefRefPtr<CefDictionaryValue> dict = value->GetDictionary(); |
| CefDictionaryValue::KeyList key_list; |
| EXPECT_TRUE(dict->GetKeys(key_list)); |
| EXPECT_EQ(3U, key_list.size()); |
| EXPECT_EQ("key1", key_list[0].ToString()); |
| EXPECT_EQ("key2", key_list[1].ToString()); |
| EXPECT_EQ("key3", key_list[2].ToString()); |
| EXPECT_EQ(VTYPE_STRING, dict->GetType("key1")); |
| EXPECT_EQ(dict->GetString("key1"), "value1"); |
| EXPECT_EQ(VTYPE_INT, dict->GetType("key2")); |
| EXPECT_EQ(123, dict->GetInt("key2")); |
| EXPECT_EQ(VTYPE_LIST, dict->GetType("key3")); |
| CefRefPtr<CefListValue> key3 = dict->GetList("key3"); |
| EXPECT_TRUE(nullptr != key3); |
| EXPECT_TRUE(key3->IsValid()); |
| EXPECT_EQ(3U, key3->GetSize()); |
| EXPECT_EQ(1, key3->GetInt(0)); |
| EXPECT_EQ(2, key3->GetInt(1)); |
| EXPECT_EQ(3, key3->GetInt(2)); |
| |
| // generate string from parsed result |
| CefString result = CefWriteJSON(value, JSON_WRITER_DEFAULT); |
| CefString expected_result = data; |
| EXPECT_EQ(expected_result, result); |
| } |
| |
| TEST(ParserTest, ParseJSONList) { |
| const char data[] = "[\"value1\", 123, {\"key3\": [1, 2, 3]}]"; |
| CefRefPtr<CefValue> value = CefParseJSON(data, JSON_PARSER_RFC); |
| EXPECT_TRUE(value.get()); |
| EXPECT_TRUE(value->IsValid()); |
| EXPECT_TRUE(value->GetType() == VTYPE_LIST); |
| EXPECT_FALSE(value->IsOwned()); |
| CefRefPtr<CefListValue> list = value->GetList(); |
| EXPECT_TRUE(nullptr != list); |
| EXPECT_TRUE(list->IsValid()); |
| EXPECT_EQ(3U, list->GetSize()); |
| |
| EXPECT_EQ(VTYPE_STRING, list->GetType(0)); |
| EXPECT_EQ(list->GetString(0), "value1"); |
| EXPECT_EQ(VTYPE_INT, list->GetType(1)); |
| EXPECT_EQ(123, list->GetInt(1)); |
| EXPECT_EQ(VTYPE_DICTIONARY, list->GetType(2)); |
| CefRefPtr<CefDictionaryValue> dict = list->GetDictionary(2); |
| CefDictionaryValue::KeyList key_list2; |
| EXPECT_TRUE(dict->GetKeys(key_list2)); |
| EXPECT_EQ(1U, key_list2.size()); |
| CefRefPtr<CefListValue> list2 = dict->GetList("key3"); |
| EXPECT_EQ(3U, list2->GetSize()); |
| EXPECT_EQ(1, list2->GetInt(0)); |
| EXPECT_EQ(2, list2->GetInt(1)); |
| EXPECT_EQ(3, list2->GetInt(2)); |
| |
| // generate string from parsed result |
| CefString result = CefWriteJSON(value, JSON_WRITER_DEFAULT); |
| CefString expected_result = "[\"value1\",123,{\"key3\":[1,2,3]}]"; |
| EXPECT_EQ(expected_result.ToString(), result.ToString()); |
| } |
| |
| TEST(ParserTest, ParseJSONAndReturnErrorInvalid) { |
| const char data[] = "This is my test data"; |
| cef_json_parser_error_t error_code; |
| CefString error_msg; |
| CefRefPtr<CefValue> value = |
| CefParseJSONAndReturnError(data, JSON_PARSER_RFC, error_code, error_msg); |
| CefString expect_error_msg = "Line: 1, column: 1, Unexpected token."; |
| EXPECT_FALSE(value.get()); |
| EXPECT_EQ(JSON_UNEXPECTED_TOKEN, error_code); |
| EXPECT_EQ(expect_error_msg, error_msg); |
| } |
| |
| TEST(ParserTest, ParseJSONAndReturnErrorTrailingComma) { |
| const char data[] = "{\"key1\":123,}"; |
| cef_json_parser_error_t error_code; |
| CefString error_msg; |
| CefRefPtr<CefValue> value = |
| CefParseJSONAndReturnError(data, JSON_PARSER_RFC, error_code, error_msg); |
| CefString expect_error_msg = |
| "Line: 1, column: 13, Trailing comma not allowed."; |
| EXPECT_FALSE(value.get()); |
| EXPECT_EQ(JSON_TRAILING_COMMA, error_code); |
| EXPECT_EQ(expect_error_msg, error_msg); |
| } |