| 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());
|
| +}
|
|
|