blob: 4341d8dda194dc982f06683acfca0f5b1ce69a97 [file] [log] [blame]
Mike Frysinger1dad0972019-02-23 18:36:37 -05001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "dev-install/dev_install.h"
6
Mike Frysinger60260f62019-02-24 02:28:23 -05007#include <unistd.h>
8
9#include <istream>
10#include <sstream>
11#include <string>
12
Mike Frysingerb9c9f6c2019-02-24 02:32:32 -050013#include <base/files/file_path.h>
14#include <base/files/file_util.h>
15#include <base/files/scoped_temp_dir.h>
Mike Frysinger1dad0972019-02-23 18:36:37 -050016#include <gmock/gmock.h>
17#include <gtest/gtest.h>
18
19using ::testing::_;
20using ::testing::Return;
21
22namespace dev_install {
23
24namespace {
25
26class DevInstallMock : public DevInstall {
27 public:
Ben Chan1ea2ba12019-09-19 11:58:03 -070028 MOCK_METHOD(int, Exec, (const std::vector<const char*>&), (override));
29 MOCK_METHOD(bool, IsDevMode, (), (const, override));
30 MOCK_METHOD(bool,
31 PromptUser,
32 (std::istream&, const std::string&),
33 (override));
Mike Frysinger1dad0972019-02-23 18:36:37 -050034};
35
36class DevInstallTest : public ::testing::Test {
Mike Frysingeree5af6e2019-02-23 23:47:03 -050037 public:
38 void SetUp() override {
39 // Set the default to dev mode enabled. Most tests want that.
40 ON_CALL(dev_install_, IsDevMode()).WillByDefault(Return(true));
41 }
42
Mike Frysinger1dad0972019-02-23 18:36:37 -050043 protected:
44 DevInstallMock dev_install_;
45};
46
47} // namespace
48
49// Check default run through.
50TEST_F(DevInstallTest, Run) {
51 EXPECT_CALL(dev_install_, Exec(_)).WillOnce(Return(1234));
52 EXPECT_EQ(1234, dev_install_.Run());
53}
54
Mike Frysingeree5af6e2019-02-23 23:47:03 -050055// Systems not in dev mode should abort.
56TEST_F(DevInstallTest, NonDevMode) {
57 EXPECT_CALL(dev_install_, IsDevMode()).WillOnce(Return(false));
58 EXPECT_CALL(dev_install_, Exec(_)).Times(0);
59 EXPECT_EQ(2, dev_install_.Run());
60}
61
Mike Frysinger60260f62019-02-24 02:28:23 -050062namespace {
63
64class PromptUserTest : public ::testing::Test {
65 protected:
66 DevInstall dev_install_;
67};
68
69} // namespace
70
71// The --yes flag should pass w/out prompting the user.
72TEST_F(PromptUserTest, Forced) {
73 dev_install_.SetYesForTest(true);
74 std::stringstream stream("");
75 EXPECT_TRUE(dev_install_.PromptUser(stream, ""));
76}
77
78// EOF input should fail.
79TEST_F(PromptUserTest, Eof) {
80 std::stringstream stream("");
81 EXPECT_FALSE(dev_install_.PromptUser(stream, ""));
82}
83
84// Default input (hitting enter) should fail.
85TEST_F(PromptUserTest, Default) {
86 std::stringstream stream("\n");
87 EXPECT_FALSE(dev_install_.PromptUser(stream, ""));
88}
89
90// Entering "n" should fail.
91TEST_F(PromptUserTest, No) {
92 std::stringstream stream("n\n");
93 EXPECT_FALSE(dev_install_.PromptUser(stream, ""));
94}
95
96// Entering "y" should pass.
97TEST_F(PromptUserTest, Yes) {
98 std::stringstream stream("y\n");
99 EXPECT_TRUE(dev_install_.PromptUser(stream, ""));
100}
101
Mike Frysingerb9c9f6c2019-02-24 02:32:32 -0500102namespace {
103
104class DeletePathTest : public ::testing::Test {
105 public:
106 void SetUp() override {
107 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
108 test_dir_ = scoped_temp_dir_.GetPath();
109 dev_install_.SetStateDirForTest(test_dir_);
110 }
111
112 protected:
113 DevInstall dev_install_;
114 base::FilePath test_dir_;
115 base::ScopedTempDir scoped_temp_dir_;
116};
117
118} // namespace
119
120// Check missing dir.
121TEST_F(DeletePathTest, Missing) {
122 struct stat st = {};
123 EXPECT_TRUE(dev_install_.DeletePath(st, test_dir_.Append("foo")));
124}
125
126// Check deleting dir contents leaves the dir alone.
127TEST_F(DeletePathTest, Empty) {
128 struct stat st = {};
129 EXPECT_TRUE(dev_install_.DeletePath(st, test_dir_));
130 EXPECT_TRUE(base::PathExists(test_dir_));
131}
132
133// Check mounted deletion.
134TEST_F(DeletePathTest, Mounted) {
135 struct stat st = {};
136 const base::FilePath subdir = test_dir_.Append("subdir");
137 EXPECT_TRUE(base::CreateDirectory(subdir));
138 EXPECT_FALSE(dev_install_.DeletePath(st, test_dir_));
139 EXPECT_TRUE(base::PathExists(subdir));
140}
141
142// Check recursive deletion.
143TEST_F(DeletePathTest, Works) {
144 struct stat st;
145 EXPECT_EQ(0, stat(test_dir_.value().c_str(), &st));
146
147 EXPECT_EQ(3, base::WriteFile(test_dir_.Append("file"), "123", 3));
148 EXPECT_EQ(0, symlink("x", test_dir_.Append("broken-sym").value().c_str()));
149 EXPECT_EQ(0, symlink("file", test_dir_.Append("file-sym").value().c_str()));
150 EXPECT_EQ(0, symlink(".", test_dir_.Append("dir-sym").value().c_str()));
151 EXPECT_EQ(0, symlink("subdir", test_dir_.Append("dir-sym2").value().c_str()));
152 const base::FilePath subdir = test_dir_.Append("subdir");
153 EXPECT_TRUE(base::CreateDirectory(subdir));
154 EXPECT_EQ(3, base::WriteFile(subdir.Append("file"), "123", 3));
155 const base::FilePath subsubdir = test_dir_.Append("subdir");
156 EXPECT_TRUE(base::CreateDirectory(subsubdir));
157 EXPECT_EQ(3, base::WriteFile(subsubdir.Append("file"), "123", 3));
158
159 EXPECT_TRUE(dev_install_.DeletePath(st, test_dir_));
160 EXPECT_TRUE(base::PathExists(test_dir_));
161 EXPECT_EQ(0, rmdir(test_dir_.value().c_str()));
162}
163
Mike Frysinger1dad0972019-02-23 18:36:37 -0500164} // namespace dev_install