blob: 7e7140eb17027cf85f58734aa5d383a1319800ef [file] [log] [blame]
// Copyright (c) 2011 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 "chrome/browser/chromeos/plugin_selection_policy.h"
#include <string>
#include <vector>
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_temp_dir.h"
#include "content/browser/browser_thread.h"
#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
using std::string;
using std::vector;
#if !defined(OS_CHROMEOS)
#error This file is meant to be compiled on ChromeOS only.
#endif
namespace chromeos {
const char kBasicPolicy[] = "# This is a basic policy\n"
"plugin test.so\n"
"allow foo.com\n"
"deny bar.com\n";
const char kNoPluginPolicy[] = "# This is a policy with missing plugin.\n"
"# Missing plugin test.so\n"
"allow foo.com\n"
"deny bar.com\n";
const char kNoRulesPolicy[] = "# This is a policy with no rules\n"
"plugin test.so\n";
const char kEmptyPolicy[] = "# This is an empty policy\n";
const char kGlobalPolicy[] = "# This is a test with global deny/allow\n"
"plugin test.so\n"
"deny\n"
"plugin test1.so\n"
"allow\n";
const char kCommentTestPolicy[] = "# This is a policy with inline comments.\n"
"plugin test.so# like this\n"
"allow foo.com # and this\n"
"deny bar.com # and this\n";
const char kMultiPluginTestPolicy[] =
"# This is a policy with multiple plugins.\n"
"plugin allow_foo.so\n"
"allow foo.com\n"
"deny bar.com\n"
"plugin allow_baz_bim1.so\n"
"deny google.com\n"
"allow baz.com\n"
"allow bim.com\n"
"plugin allow_baz_bim2.so\n"
"deny google.com\n"
"allow baz.com\n"
"allow bim.com\n";
const char kWhitespaceTestPolicy[] = "# This is a policy with odd whitespace.\n"
" plugin\ttest.so# like this\n"
"\n\n \n allow\t\tfoo.com # and this\n"
"\tdeny bar.com\t\t\t# and this \n";
class PluginSelectionPolicyTest : public PlatformTest {
public:
PluginSelectionPolicyTest()
: loop_(MessageLoop::TYPE_DEFAULT),
file_thread_(BrowserThread::FILE, &loop_) {}
virtual void SetUp() {
PlatformTest::SetUp();
// Create a policy file to test with.
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
}
protected:
bool CreatePolicy(const std::string& name,
const std::string& contents,
FilePath* path) {
FilePath policy_file = GetPolicyPath(name);
size_t bytes_written = file_util::WriteFile(policy_file,
contents.c_str(),
contents.size());
if (path)
*path = policy_file;
return bytes_written == contents.size();
}
FilePath GetPolicyPath(const std::string& name) {
FilePath policy_file(temp_dir_.path());
return policy_file.Append(FilePath(name));
}
private:
ScopedTempDir temp_dir_;
MessageLoop loop_;
BrowserThread file_thread_;
};
TEST_F(PluginSelectionPolicyTest, Basic) {
FilePath path;
ASSERT_TRUE(CreatePolicy("basic", kBasicPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
TEST_F(PluginSelectionPolicyTest, InitFromFile) {
{
FilePath path;
ASSERT_TRUE(CreatePolicy("basic", kBasicPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("no_plugin", kNoPluginPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_FALSE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("no_rules", kNoRulesPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("empty", kEmptyPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("global", kGlobalPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("comment", kCommentTestPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("multi_plugin", kMultiPluginTestPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
{
FilePath path;
ASSERT_TRUE(CreatePolicy("whitespace", kWhitespaceTestPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
EXPECT_TRUE(policy->InitFromFile(path));
}
}
TEST_F(PluginSelectionPolicyTest, IsAllowed) {
FilePath path;
ASSERT_TRUE(CreatePolicy("basic", kBasicPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy1 = new PluginSelectionPolicy;
ASSERT_TRUE(policy1->InitFromFile(path));
EXPECT_TRUE(policy1->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_FALSE(policy1->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_FALSE(policy1->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_TRUE(policy1->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/real.so")));
scoped_refptr<PluginSelectionPolicy> policy2 = new PluginSelectionPolicy;
ASSERT_TRUE(CreatePolicy("no_rules", kNoRulesPolicy, &path));
ASSERT_TRUE(policy2->InitFromFile(path));
EXPECT_FALSE(policy2->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_FALSE(policy2->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_FALSE(policy2->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_TRUE(policy2->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/real.so")));
scoped_refptr<PluginSelectionPolicy> policy3 = new PluginSelectionPolicy;
ASSERT_TRUE(CreatePolicy("empty", kEmptyPolicy, &path));
ASSERT_TRUE(policy3->InitFromFile(path));
EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/test.so")));
EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/real.so")));
}
TEST_F(PluginSelectionPolicyTest, MissingFile) {
// Don't create any policy file, just get the path to one.
FilePath path = GetPolicyPath("missing_file");
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
ASSERT_FALSE(policy->InitFromFile(path));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/allow_foo.so")));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/allow_foo.so")));
}
TEST_F(PluginSelectionPolicyTest, FindFirstAllowed) {
FilePath path;
ASSERT_TRUE(CreatePolicy("multi", kMultiPluginTestPolicy, &path));
scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
ASSERT_TRUE(policy->InitFromFile(path));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/allow_foo.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/allow_foo.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/allow_foo.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bim.com/blah.html"),
FilePath("/usr/local/bin/allow_foo.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim1.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim1.so")));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim1.so")));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.bim.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim1.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.google.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim1.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim2.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim2.so")));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.baz.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim2.so")));
EXPECT_TRUE(policy->IsAllowed(GURL("http://www.bim.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim2.so")));
EXPECT_FALSE(policy->IsAllowed(GURL("http://www.google.com/blah.html"),
FilePath("/usr/local/bin/allow_baz_bim2.so")));
std::vector<webkit::npapi::WebPluginInfo> info_vector;
webkit::npapi::WebPluginInfo info;
// First we test that the one without any policy gets
// selected for all if it's first.
info.path = FilePath("/usr/local/bin/no_policy.so");
info_vector.push_back(info);
info.path = FilePath("/usr/local/bin/allow_foo.so");
info_vector.push_back(info);
info.path = FilePath("/usr/local/bin/allow_baz_bim1.so");
info_vector.push_back(info);
info.path = FilePath("/usr/local/bin/allow_baz_bim2.so");
info_vector.push_back(info);
EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.baz.com/blah.html"),
info_vector));
EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.foo.com/blah.html"),
info_vector));
EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.bling.com/blah.html"),
info_vector));
EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.google.com/blah.html"),
info_vector));
// Now move the plugin without any policy to the end.
info_vector.clear();
info.path = FilePath("/usr/local/bin/allow_foo.so");
info_vector.push_back(info);
info.path = FilePath("/usr/local/bin/allow_baz_bim1.so");
info_vector.push_back(info);
info.path = FilePath("/usr/local/bin/allow_baz_bim2.so");
info_vector.push_back(info);
info.path = FilePath("/usr/local/bin/no_policy.so");
info_vector.push_back(info);
EXPECT_EQ(1, policy->FindFirstAllowed(GURL("http://www.baz.com/blah.html"),
info_vector));
EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.foo.com/blah.html"),
info_vector));
EXPECT_EQ(3, policy->FindFirstAllowed(GURL("http://www.bling.com/blah.html"),
info_vector));
EXPECT_EQ(3, policy->FindFirstAllowed(GURL("http://www.google.com/blah.html"),
info_vector));
}
} // namespace chromeos