Index: chrome_frame/test/html_util_unittests.cc |
=================================================================== |
--- chrome_frame/test/html_util_unittests.cc (revision 0) |
+++ chrome_frame/test/html_util_unittests.cc (revision 0) |
@@ -0,0 +1,215 @@ |
+// Copyright (c) 2006-2009 The Chromium 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 <windows.h> |
+#include <atlsecurity.h> |
+#include <shellapi.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/file_util.h" |
+#include "base/message_loop.h" |
+#include "base/path_service.h" |
+#include "base/process_util.h" |
+#include "base/ref_counted.h" |
+#include "base/scoped_handle.h" |
+#include "base/task.h" |
+#include "base/win_util.h" |
+#include "net/base/net_util.h" |
+ |
+#include "chrome_frame/test/chrome_frame_unittests.h" |
+#include "chrome_frame/chrome_frame_automation.h" |
+#include "chrome_frame/chrome_frame_delegate.h" |
+#include "chrome_frame/html_utils.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+class HtmlUtilUnittest : public testing::Test { |
+ protected: |
+ // Constructor |
+ HtmlUtilUnittest() {} |
+ |
+ // Returns the test path given a test case. |
+ virtual bool GetTestPath(const std::wstring& test_case, std::wstring* path) { |
+ if (!path) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ std::wstring test_path; |
+ if (!PathService::Get(base::DIR_SOURCE_ROOT, &test_path)) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ file_util::AppendToPath(&test_path, L"chrome_frame"); |
+ file_util::AppendToPath(&test_path, L"test"); |
+ file_util::AppendToPath(&test_path, L"html_util_test_data"); |
+ file_util::AppendToPath(&test_path, test_case); |
+ |
+ *path = test_path; |
+ return true; |
+ } |
+ |
+ virtual bool GetTestData(const std::wstring& test_case, std::wstring* data) { |
+ if (!data) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ std::wstring path; |
+ if (!GetTestPath(test_case, &path)) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ std::string raw_data; |
+ file_util::ReadFileToString(path, &raw_data); |
+ |
+ // Convert to wide using the "best effort" assurance described in |
+ // string_util.h |
+ data->assign(UTF8ToWide(raw_data)); |
+ return true; |
+ } |
+}; |
+ |
+TEST_F(HtmlUtilUnittest, BasicTest) { |
+ std::wstring test_data; |
+ GetTestData(L"basic_test.html", &test_data); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Grab the meta tag from the document and ensure that we get exactly one. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ ASSERT_EQ(1, tag_list.size()); |
+ |
+ // Pull out the http-equiv attribute and check its value: |
+ HTMLScanner::StringRange attribute_value; |
+ EXPECT_TRUE(tag_list[0].GetTagAttribute(L"http-equiv", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"X-UA-Compatible")); |
+ |
+ // Pull out the content attribute and check its value: |
+ EXPECT_TRUE(tag_list[0].GetTagAttribute(L"content", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"chrome=1")); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, QuotesTest) { |
+ std::wstring test_data; |
+ GetTestData(L"quotes_test.html", &test_data); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Grab the meta tag from the document and ensure that we get exactly one. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ ASSERT_EQ(1, tag_list.size()); |
+ |
+ // Pull out the http-equiv attribute and check its value: |
+ HTMLScanner::StringRange attribute_value; |
+ EXPECT_TRUE(tag_list[0].GetTagAttribute(L"http-equiv", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"X-UA-Compatible")); |
+ |
+ // Pull out the content attribute and check its value: |
+ EXPECT_TRUE(tag_list[0].GetTagAttribute(L"content", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"chrome=1")); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, DegenerateCasesTest) { |
+ std::wstring test_data; |
+ GetTestData(L"degenerate_cases_test.html", &test_data); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Scan for meta tags in the document. We expect not to pick up the one |
+ // that appears to be there since it is technically inside a quote block. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ EXPECT_TRUE(tag_list.empty()); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, MultipleTagsTest) { |
+ std::wstring test_data; |
+ GetTestData(L"multiple_tags.html", &test_data); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Grab the meta tag from the document and ensure that we get exactly three. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ EXPECT_EQ(7, tag_list.size()); |
+ |
+ // Pull out the content attribute for each tag and check its value: |
+ HTMLScanner::StringRange attribute_value; |
+ HTMLScanner::StringRangeList::const_iterator tag_list_iter( |
+ tag_list.begin()); |
+ int valid_tag_count = 0; |
+ for (; tag_list_iter != tag_list.end(); tag_list_iter++) { |
+ HTMLScanner::StringRange attribute_value; |
+ if (tag_list_iter->GetTagAttribute(L"http-equiv", &attribute_value) && |
+ attribute_value.Equals(L"X-UA-Compatible")) { |
+ EXPECT_TRUE(tag_list_iter->GetTagAttribute(L"content", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"chrome=1")); |
+ valid_tag_count++; |
+ } |
+ } |
+ EXPECT_EQ(3, valid_tag_count); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, ShortDegenerateTest1) { |
+ std::wstring test_data( |
+ L"<foo><META http-equiv=X-UA-Compatible content='chrome=1'"); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Scan for meta tags in the document. We expect not to pick up the one |
+ // that is there since it is not properly closed. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ EXPECT_TRUE(tag_list.empty()); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, ShortDegenerateTest2) { |
+ std::wstring test_data( |
+ L"<foo <META http-equiv=X-UA-Compatible content='chrome=1'/>"); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Scan for meta tags in the document. We expect not to pick up the one |
+ // that appears to be there since it is inside a non-closed tag. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ EXPECT_TRUE(tag_list.empty()); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, QuoteInsideHTMLCommentTest) { |
+ std::wstring test_data( |
+ L"<!-- comment' --><META http-equiv=X-UA-Compatible content='chrome=1'/>"); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Grab the meta tag from the document and ensure that we get exactly one. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ ASSERT_EQ(1, tag_list.size()); |
+ |
+ // Pull out the http-equiv attribute and check its value: |
+ HTMLScanner::StringRange attribute_value; |
+ EXPECT_TRUE(tag_list[0].GetTagAttribute(L"http-equiv", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"X-UA-Compatible")); |
+ |
+ // Pull out the content attribute and check its value: |
+ EXPECT_TRUE(tag_list[0].GetTagAttribute(L"content", &attribute_value)); |
+ EXPECT_TRUE(attribute_value.Equals(L"chrome=1")); |
+} |
+ |
+TEST_F(HtmlUtilUnittest, CloseTagInsideHTMLCommentTest) { |
+ std::wstring test_data( |
+ L"<!-- comment> <META http-equiv=X-UA-Compatible content='chrome=1'/>-->"); |
+ |
+ HTMLScanner scanner(test_data.c_str()); |
+ |
+ // Grab the meta tag from the document and ensure that we get exactly one. |
+ HTMLScanner::StringRangeList tag_list; |
+ scanner.GetTagsByName(L"meta", &tag_list, L"body"); |
+ ASSERT_TRUE(tag_list.empty()); |
+} |