| Index: src/platform/minijail/minijail_unittest.cc
|
| diff --git a/src/platform/minijail/minijail_unittest.cc b/src/platform/minijail/minijail_unittest.cc
|
| index 70c712e9e35364b05f4535a623f1d1185598419c..bd7d004b203cd56923171d49331f436b8c90599a 100644
|
| --- a/src/platform/minijail/minijail_unittest.cc
|
| +++ b/src/platform/minijail/minijail_unittest.cc
|
| @@ -1,47 +1,126 @@
|
| -// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| +// Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| // Some portions Copyright (c) 2009 The Chromium Authors.
|
| //
|
| // Tests for MiniJail
|
| -#include "env.h"
|
| +#include "mock_env.h"
|
| +#include "mock_options.h"
|
| #include "minijail.h"
|
| +#include <gmock/gmock.h>
|
| #include <gtest/gtest.h>
|
|
|
| namespace chromeos {
|
|
|
| -// TODO: pull in gmock to make this non-crazy for testing.
|
| -class TrueEnv : public minijail::Env {
|
| +using ::testing::_; // wildcard mock matcher
|
| +using ::testing::AtLeast; // Times modifier
|
| +using ::testing::DefaultValue; // allow for easy default return value change
|
| +using ::testing::Return; // mock Return action
|
| +
|
| +class MiniJailTest : public ::testing::Test {
|
| public:
|
| - TrueEnv() { }
|
| - ~TrueEnv() { }
|
| - bool DisableTracing() const { return true; }
|
| - bool KeepRootCapabilities() const { return true; }
|
| - bool DisableDefaultRootPrivileges() const { return true; }
|
| - bool ChangeUser(uid_t uid, gid_t gid) const { return true; }
|
| - bool SanitizeBoundingSet(uint64 capmask) const { return true; }
|
| - bool EnterNamespace(int namespaces) const { return true; }
|
| - bool FilterSyscallsBySource() const { return true; }
|
| - bool Mount() const { return true; }
|
| - bool SanitizeCapabilities(uint64 eff_capmask) const { return true; }
|
| - bool Run(const char *path,
|
| - char * const *argv,
|
| - char * const *envp) const { return true; }
|
| + static const char kDummyPath[];
|
| + void SetUp() {
|
| + env_.reset(new minijail::MockEnv);
|
| + options_.reset(new minijail::MockOptions);
|
| + // Setup options to return the mock env
|
| + EXPECT_CALL(*options_, env())
|
| + .Times(AtLeast(1))
|
| + .WillRepeatedly(Return(env_.get()));
|
| + }
|
| + void TearDown() {
|
| + }
|
| + protected:
|
| + scoped_ptr<minijail::MockEnv> env_;
|
| + scoped_ptr<minijail::MockOptions> options_;
|
| };
|
|
|
| -class MiniJailTest : public ::testing::Test { };
|
| +const char MiniJailTest::kDummyPath[] = "/path/to/target/binary";
|
| +
|
| +TEST_F(MiniJailTest, RunGetsPath) {
|
| + MiniJail jail;
|
| + jail.Initialize(options_.get());
|
| +
|
| + // This will be a relative no-op since all the options are defaulting
|
| + // to false.
|
| + EXPECT_TRUE(jail.Jail());
|
| + // Ensure the pre-configured dummy path is propagated via Run().
|
| + EXPECT_CALL(*env_, Run(kDummyPath, NULL, NULL))
|
| + .Times(1)
|
| + .WillOnce(Return(true));
|
| + // Setup executable_path to return a dummy
|
| + EXPECT_CALL(*options_, executable_path())
|
| + .Times(2)
|
| + .WillRepeatedly(Return(kDummyPath));
|
| + EXPECT_TRUE(jail.Run());
|
| +}
|
|
|
| -TEST(MiniJailTest, TrueJail) {
|
| - TrueEnv *env = new TrueEnv;
|
| - MiniJailOptions options;
|
| - options.set_env(env); // takes ownership
|
| - options.set_executable_path("/no/where");
|
| +TEST_F(MiniJailTest, DefaultTrueEnvAndOptions) {
|
| + // Make all default mock calls return true
|
| + DefaultValue<bool>::Set(true);
|
| MiniJail jail;
|
| - jail.Initialize(&options);
|
| - // This does basically nothing since the options default to false.
|
| - // Only ChangeUser is actually called.
|
| + jail.Initialize(options_.get());
|
| EXPECT_TRUE(jail.Jail());
|
| + // Setup executable_path to return a dummy
|
| + EXPECT_CALL(*options_, executable_path())
|
| + .Times(2)
|
| + .WillRepeatedly(Return(kDummyPath));
|
| EXPECT_TRUE(jail.Run());
|
| + DefaultValue<bool>::Clear();
|
| +}
|
| +
|
| +TEST_F(MiniJailTest, NamespaceFlagsPidOnly) {
|
| + MiniJail jail;
|
| + jail.Initialize(options_.get());
|
| +
|
| + EXPECT_CALL(*options_, namespace_pid())
|
| + .Times(1)
|
| + .WillOnce(Return(true));
|
| + EXPECT_CALL(*options_, namespace_vfs())
|
| + .Times(2)
|
| + .WillOnce(Return(false))
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(*env_, EnterNamespace(CLONE_NEWPID))
|
| + .Times(1)
|
| + .WillOnce(Return(true));
|
| + EXPECT_TRUE(jail.Jail());
|
| }
|
|
|
| +TEST_F(MiniJailTest, NamespaceFlagsVfsOnly) {
|
| + MiniJail jail;
|
| + jail.Initialize(options_.get());
|
| +
|
| + EXPECT_CALL(*options_, namespace_pid())
|
| + .Times(1)
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(*options_, namespace_vfs())
|
| + .Times(2)
|
| + .WillOnce(Return(true))
|
| + .WillOnce(Return(true));
|
| + EXPECT_CALL(*env_, EnterNamespace(CLONE_NEWNS))
|
| + .Times(1)
|
| + .WillOnce(Return(true));
|
| + EXPECT_TRUE(jail.Jail());
|
| +}
|
| +
|
| +TEST_F(MiniJailTest, NamespaceFlagsAll) {
|
| + MiniJail jail;
|
| + jail.Initialize(options_.get());
|
| +
|
| + EXPECT_CALL(*options_, namespace_pid())
|
| + .Times(1)
|
| + .WillOnce(Return(true));
|
| + EXPECT_CALL(*options_, namespace_vfs())
|
| + .Times(2)
|
| + .WillOnce(Return(true))
|
| + .WillOnce(Return(true));
|
| + EXPECT_CALL(*env_, EnterNamespace(CLONE_NEWNS|CLONE_NEWPID))
|
| + .Times(1)
|
| + .WillOnce(Return(true));
|
| + EXPECT_TRUE(jail.Jail()); // all works on first call
|
| +}
|
| +
|
| +// TODO(wad) finish up test cases for each conditional
|
| +
|
| +
|
| } // namespace chromeos
|
|
|