blob: d4d19db521590942c39605b86dde3942f47142db [file] [log] [blame]
// Copyright (c) 2014 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_exit_handler.h"
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <vector>
#include <base/files/file_path.h>
#include <base/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <base/message_loop/message_loop.h>
#include <gtest/gtest.h>
#include "login_manager/fake_job_manager.h"
#include "login_manager/mock_system_utils.h"
namespace login_manager {
using ::testing::Return;
using ::testing::_;
static const pid_t kDummyPid = 4;
class ChildExitHandlerTest : public ::testing::Test {
public:
ChildExitHandlerTest() : handler_(&mock_utils_), fake_manager_(kDummyPid) {}
virtual ~ChildExitHandlerTest() {}
virtual void SetUp() {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
std::vector<JobManagerInterface*> managers;
managers.push_back(&fake_manager_);
handler_.Init(managers);
}
virtual void TearDown() {
ChildExitHandler::RevertHandlers();
}
protected:
base::MessageLoopForIO loop_;
MockSystemUtils mock_utils_;
ChildExitHandler handler_;
FakeJobManager fake_manager_;
base::ScopedTempDir temp_dir_;
private:
DISALLOW_COPY_AND_ASSIGN(ChildExitHandlerTest);
};
TEST_F(ChildExitHandlerTest, DataOnPipe) {
siginfo_t canned = {};
canned.si_pid = kDummyPid;
canned.si_signo = SIGCHLD;
canned.si_code = CLD_EXITED;
canned.si_status = 1;
base::FilePath scratch;
ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &scratch));
ASSERT_TRUE(file_util::WriteFile(scratch,
reinterpret_cast<char*>(&canned),
sizeof(canned)));
int canned_fd = open(scratch.value().c_str(), O_RDONLY);
ASSERT_GT(canned_fd, 0);
EXPECT_CALL(mock_utils_, ChildIsGone(kDummyPid, _)).WillOnce(Return(true));
handler_.OnFileCanReadWithoutBlocking(canned_fd);
EXPECT_EQ(canned.si_pid, fake_manager_.last_status().si_pid);
EXPECT_EQ(canned.si_signo, fake_manager_.last_status().si_signo);
EXPECT_EQ(canned.si_code, fake_manager_.last_status().si_code);
EXPECT_EQ(canned.si_status, fake_manager_.last_status().si_status);
ASSERT_EQ(close(canned_fd), 0);
}
} // namespace login_manager