blob: 03918bc45099ebf2ed25ad6000d9eacde42f9165 [file] [log] [blame]
// 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.
#include "login_manager/child_job.h"
#include <gtest/gtest.h>
#include <unistd.h>
#include <string>
#include <vector>
#include <base/command_line.h>
#include <base/logging.h>
#include <base/string_util.h>
using std::string;
using std::vector;
namespace login_manager {
namespace {
// Default argument list for a job to use in mostly all test cases.
const char* kArgv[] = {
"zero",
"one",
"two"
};
// Normal username to test session for.
const char kUser[] = "test@gmail.com";
} // namespace
TEST(ChildJobTest, InitializationTest) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
EXPECT_EQ(0, job.last_start_);
EXPECT_FALSE(job.removed_login_manager_flag_);
ASSERT_EQ(arraysize(kArgv), job.arguments_.size());
for (size_t i = 0; i < arraysize(kArgv); ++i)
EXPECT_EQ(kArgv[i], job.arguments_[i]);
EXPECT_FALSE(job.IsDesiredUidSet());
}
TEST(ChildJobTest, DesiredUidSetTest) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
EXPECT_FALSE(job.IsDesiredUidSet());
job.SetDesiredUid(1);
EXPECT_EQ(1, job.GetDesiredUid());
EXPECT_TRUE(job.IsDesiredUidSet());
}
TEST(ChildJobTest, ShouldStopTest) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
job.RecordTime();
EXPECT_NE(0, job.last_start_);
EXPECT_TRUE(job.ShouldStop());
}
TEST(ChildJobTest, ShouldNotStopTest) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
job.RecordTime();
EXPECT_NE(0, job.last_start_);
sleep(ChildJob::kRestartWindow);
EXPECT_FALSE(job.ShouldStop());
}
TEST(ChildJobTest, StartStopSessionTest) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
job.StartSession(kUser);
EXPECT_FALSE(job.removed_login_manager_flag_);
ASSERT_EQ(arraysize(kArgv) + 1, job.arguments_.size());
for (size_t i = 0; i < arraysize(kArgv); ++i)
EXPECT_EQ(kArgv[i], job.arguments_[i]);
EXPECT_EQ(StringPrintf("%s%s", ChildJob::kLoginUserFlag, kUser),
job.arguments_[arraysize(kArgv)]);
// Should remove login user flag.
job.StopSession();
ASSERT_EQ(arraysize(kArgv), job.arguments_.size());
for (size_t i = 0; i < arraysize(kArgv); ++i)
EXPECT_EQ(kArgv[i], job.arguments_[i]);
}
TEST(ChildJobTest, StartStopSessionFromLoginTest) {
const char* kArgvWithLoginFlag[] = {
"zero",
"one",
"two",
"--login-manager"
};
vector<string> argv(kArgvWithLoginFlag,
kArgvWithLoginFlag + arraysize(kArgvWithLoginFlag));
ChildJob job(argv);
job.StartSession(kUser);
EXPECT_TRUE(job.removed_login_manager_flag_);
ASSERT_EQ(arraysize(kArgvWithLoginFlag), job.arguments_.size());
for (size_t i = 0; i + 1 < arraysize(kArgvWithLoginFlag); ++i)
EXPECT_EQ(kArgvWithLoginFlag[i], job.arguments_[i]);
EXPECT_EQ(StringPrintf("%s%s", ChildJob::kLoginUserFlag, kUser),
job.arguments_.back());
// Should remove login user flag and append --login-manager flag back.
job.StopSession();
EXPECT_FALSE(job.removed_login_manager_flag_);
ASSERT_EQ(arraysize(kArgvWithLoginFlag), job.arguments_.size());
for (size_t i = 0; i < arraysize(kArgvWithLoginFlag); ++i)
EXPECT_EQ(kArgvWithLoginFlag[i], job.arguments_[i]);
}
TEST(ChildJobTest, SetArguments) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
const char kNewArgsString[] = "--ichi \"--ni dfs\" --san";
const char* kNewArgsArray[] = {
"--ichi",
"--ni dfs",
"--san"
};
job.SetArguments(kNewArgsString);
ASSERT_EQ(arraysize(kNewArgsArray), job.arguments_.size());
EXPECT_EQ(argv[0], job.arguments_[0]);
for (size_t i = 1; i < arraysize(kNewArgsArray); ++i) {
EXPECT_EQ(kNewArgsArray[i], job.arguments_[i]);
}
}
TEST(ChildJobTest, SetExtraArguments) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
const char* kExtraArgs[] = { "--ichi", "--ni", "--san" };
vector<string> extra_args(kExtraArgs, kExtraArgs + arraysize(kExtraArgs));
job.SetExtraArguments(extra_args);
// Make sure regular arguments are untouched.
ASSERT_EQ(argv.size(), job.arguments_.size());
for (size_t i = 0; i < argv.size(); ++i)
EXPECT_EQ(argv[i], job.arguments_[i]);
ASSERT_EQ(extra_args.size(), job.extra_arguments_.size());
for (size_t i = 0; i < extra_args.size(); ++i)
EXPECT_EQ(extra_args[i], job.extra_arguments_[i]);
}
TEST(ChildJobTest, CreateArgv) {
vector<string> argv(kArgv, kArgv + arraysize(kArgv));
ChildJob job(argv);
const char* kExtraArgs[] = { "--ichi", "--ni", "--san" };
vector<string> extra_args(kExtraArgs, kExtraArgs + arraysize(kExtraArgs));
job.SetExtraArguments(extra_args);
const char** arg_array = job.CreateArgv();
argv.insert(argv.end(), extra_args.begin(), extra_args.end());
size_t arg_array_size = 0;
for (const char** arr = arg_array; *arr != NULL; ++arr)
++arg_array_size;
ASSERT_EQ(argv.size(), arg_array_size);
for (size_t i = 0; i < argv.size(); ++i)
EXPECT_EQ(argv[i], arg_array[i]);
}
// Test that we avoid killing the window manager job.
TEST(ChildJobTest, AvoidKillingWindowManager) {
vector<string> wm_args;
wm_args.push_back(string("/sbin/") + ChildJob::kWindowManagerSuffix);
wm_args.push_back("--flag1");
wm_args.push_back("--flag2");
ChildJob wm_job(wm_args);
EXPECT_TRUE(wm_job.ShouldNeverKill());
vector<string> chrome_args;
chrome_args.push_back("/opt/google/chrome/chrome");
chrome_args.push_back("--flag1");
chrome_args.push_back("--flag2");
ChildJob chrome_job(chrome_args);
EXPECT_FALSE(chrome_job.ShouldNeverKill());
}
} // namespace login_manager