12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_condition.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/values_test_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_constants.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/url_matcher/url_matcher.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "url/gurl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::ElementsAre;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::HasSubstr;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using url_matcher::URLMatcher;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using url_matcher::URLMatcherConditionSet;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, UnknownConditionName) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLMatcher matcher;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentCondition> result = ContentCondition::Create(
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      NULL,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      matcher.condition_factory(),
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *base::test::ParseJson(
338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)           "{\n"
348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)           "  \"invalid\": \"foobar\",\n"
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)           "  \"instanceType\": \"declarativeContent.PageStateMatcher\",\n"
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)           "}"),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_THAT(error, HasSubstr("Unknown condition attribute"));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(matcher.IsEmpty()) << "Errors shouldn't add URL conditions";
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, WrongPageUrlDatatype) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLMatcher matcher;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentCondition> result = ContentCondition::Create(
488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      NULL,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      matcher.condition_factory(),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *base::test::ParseJson(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "{\n"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"pageUrl\": [],\n"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"instanceType\": \"declarativeContent.PageStateMatcher\",\n"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "}"),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_THAT(error, HasSubstr("invalid type"));
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(matcher.IsEmpty()) << "Errors shouldn't add URL conditions";
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, WrongCssDatatype) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLMatcher matcher;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentCondition> result = ContentCondition::Create(
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      NULL,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      matcher.condition_factory(),
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *base::test::ParseJson(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "{\n"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"css\": \"selector\",\n"
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"instanceType\": \"declarativeContent.PageStateMatcher\",\n"
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "}"),
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_THAT(error, HasSubstr("invalid type"));
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(matcher.IsEmpty()) << "Errors shouldn't add URL conditions";
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, ConditionWithUrlAndCss) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLMatcher matcher;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentCondition> result = ContentCondition::Create(
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      NULL,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      matcher.condition_factory(),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *base::test::ParseJson(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "{\n"
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"instanceType\": \"declarativeContent.PageStateMatcher\",\n"
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"pageUrl\": {\"hostSuffix\": \"example.com\"},\n"
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "  \"css\": [\"input\"],\n"
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "}"),
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLMatcherConditionSet::Vector all_new_condition_sets;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->GetURLMatcherConditionSets(&all_new_condition_sets);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  matcher.AddConditionSets(all_new_condition_sets);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(matcher.IsEmpty());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RendererContentMatchData match_data;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  match_data.css_selectors.insert("input");
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_THAT(matcher.MatchURL(GURL("http://google.com/")),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ElementsAre(/*empty*/));
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  match_data.page_url_matches = matcher.MatchURL(
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://www.example.com/foobar"));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_THAT(match_data.page_url_matches,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ElementsAre(result->url_matcher_condition_set_id()));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(result->IsFulfilled(match_data));
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  match_data.css_selectors.clear();
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  match_data.css_selectors.insert("body");
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result->IsFulfilled(match_data));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
121