blob: 9a4fdd900e7b130a6aa4eef3c939ab0257bc71b4 [file] [log] [blame]
François Degrosd6a775f2020-02-05 15:05:21 +11001// Copyright 2020 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
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +11005#include "cros-disks/rar_mounter.h"
François Degrosd6a775f2020-02-05 15:05:21 +11006
Simon Glass2b1da092020-05-21 12:24:16 -06007#include <brillo/process/process_reaper.h>
François Degrosd6a775f2020-02-05 15:05:21 +11008#include <gmock/gmock.h>
9#include <gtest/gtest.h>
10
11#include "cros-disks/metrics.h"
12#include "cros-disks/platform.h"
François Degros02e81492020-02-05 16:37:19 +110013#include "cros-disks/quote.h"
François Degrosd6a775f2020-02-05 15:05:21 +110014
15namespace cros_disks {
François Degros02e81492020-02-05 16:37:19 +110016
François Degrosd6a775f2020-02-05 15:05:21 +110017namespace {
18
François Degros02e81492020-02-05 16:37:19 +110019using ::testing::_;
20using ::testing::ElementsAre;
21using ::testing::ElementsAreArray;
22using ::testing::IsEmpty;
23using ::testing::Return;
24using ::testing::SizeIs;
25
François Degros02e81492020-02-05 16:37:19 +110026// Mock Platform implementation for testing.
27class MockPlatform : public Platform {
28 public:
29 MOCK_METHOD(bool, PathExists, (const std::string&), (const, override));
30};
31
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +110032class FakeSandboxedProcessFactory : public SandboxedProcessFactory {
33 public:
34 std::unique_ptr<SandboxedProcess> CreateSandboxedProcess() const {
35 return std::make_unique<FakeSandboxedProcess>();
36 }
37};
38
François Degrosd6a775f2020-02-05 15:05:21 +110039} // namespace
40
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +110041class RarMounterTest : public testing::Test {
François Degrosd6a775f2020-02-05 15:05:21 +110042 protected:
43 Metrics metrics_;
François Degros02e81492020-02-05 16:37:19 +110044 MockPlatform platform_;
François Degrosd6a775f2020-02-05 15:05:21 +110045 brillo::ProcessReaper reaper_;
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +110046 const RarMounter mounter_{&platform_, &reaper_, &metrics_,
47 std::make_unique<FakeSandboxedProcessFactory>()};
François Degrosd6a775f2020-02-05 15:05:21 +110048};
49
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +110050TEST_F(RarMounterTest, Increment) {
François Degros02e81492020-02-05 16:37:19 +110051 std::string s;
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +110052 const auto inc = [&s] { return RarMounter::Increment(s.begin(), s.end()); };
François Degros02e81492020-02-05 16:37:19 +110053
54 EXPECT_FALSE(inc());
55 EXPECT_EQ(s, "");
56
57 s = "0";
58 EXPECT_TRUE(inc());
59 EXPECT_EQ(s, "1");
60 EXPECT_TRUE(inc());
61 EXPECT_EQ(s, "2");
62
63 s = "8";
64 EXPECT_TRUE(inc());
65 EXPECT_EQ(s, "9");
66 EXPECT_FALSE(inc());
67 EXPECT_EQ(s, "0");
68
69 s = "00";
70 EXPECT_TRUE(inc());
71 EXPECT_EQ(s, "01");
72 EXPECT_TRUE(inc());
73 EXPECT_EQ(s, "02");
74
75 s = "09";
76 EXPECT_TRUE(inc());
77 EXPECT_EQ(s, "10");
78 EXPECT_TRUE(inc());
79 EXPECT_EQ(s, "11");
80
81 s = "98";
82 EXPECT_TRUE(inc());
83 EXPECT_EQ(s, "99");
84 EXPECT_FALSE(inc());
85 EXPECT_EQ(s, "00");
86
87 s = "000";
88 EXPECT_TRUE(inc());
89 EXPECT_EQ(s, "001");
90 EXPECT_TRUE(inc());
91 EXPECT_EQ(s, "002");
92
93 s = "009";
94 EXPECT_TRUE(inc());
95 EXPECT_EQ(s, "010");
96
97 s = "099";
98 EXPECT_TRUE(inc());
99 EXPECT_EQ(s, "100");
100
101 s = "999";
102 EXPECT_FALSE(inc());
103 EXPECT_EQ(s, "000");
104
105 s = "a";
106 EXPECT_TRUE(inc());
107 EXPECT_EQ(s, "b");
108 EXPECT_TRUE(inc());
109 EXPECT_EQ(s, "c");
110
111 s = "y";
112 EXPECT_TRUE(inc());
113 EXPECT_EQ(s, "z");
114 EXPECT_FALSE(inc());
115 EXPECT_EQ(s, "a");
116
117 s = "A";
118 EXPECT_TRUE(inc());
119 EXPECT_EQ(s, "B");
120 EXPECT_TRUE(inc());
121 EXPECT_EQ(s, "C");
122
123 s = "Y";
124 EXPECT_TRUE(inc());
125 EXPECT_EQ(s, "Z");
126 EXPECT_FALSE(inc());
127 EXPECT_EQ(s, "A");
128
129 s = "r00";
130 EXPECT_TRUE(inc());
131 EXPECT_EQ(s, "r01");
132 EXPECT_TRUE(inc());
133 EXPECT_EQ(s, "r02");
134
135 s = "r98";
136 EXPECT_TRUE(inc());
137 EXPECT_EQ(s, "r99");
138 EXPECT_TRUE(inc());
139 EXPECT_EQ(s, "s00");
140
141 s = "z98";
142 EXPECT_TRUE(inc());
143 EXPECT_EQ(s, "z99");
144 EXPECT_FALSE(inc());
145 EXPECT_EQ(s, "a00");
146
147 s = "R00";
148 EXPECT_TRUE(inc());
149 EXPECT_EQ(s, "R01");
150 EXPECT_TRUE(inc());
151 EXPECT_EQ(s, "R02");
152
153 s = "R98";
154 EXPECT_TRUE(inc());
155 EXPECT_EQ(s, "R99");
156 EXPECT_TRUE(inc());
157 EXPECT_EQ(s, "S00");
158
159 s = "Z98";
160 EXPECT_TRUE(inc());
161 EXPECT_EQ(s, "Z99");
162 EXPECT_FALSE(inc());
163 EXPECT_EQ(s, "A00");
164}
165
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100166TEST_F(RarMounterTest, ParseDigits) {
François Degros97f6a0d2020-08-24 15:58:30 +1000167 const auto ir = [](const size_t begin, const size_t end) {
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100168 return RarMounter::IndexRange{begin, end};
François Degros97f6a0d2020-08-24 15:58:30 +1000169 };
170
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100171 EXPECT_THAT(RarMounter::ParseDigits(""), IsEmpty());
172 EXPECT_THAT(RarMounter::ParseDigits("0"), IsEmpty());
173 EXPECT_THAT(RarMounter::ParseDigits("rar"), IsEmpty());
174 EXPECT_THAT(RarMounter::ParseDigits(".rar"), IsEmpty());
175 EXPECT_THAT(RarMounter::ParseDigits("part.rar"), IsEmpty());
176 EXPECT_THAT(RarMounter::ParseDigits(".part.rar"), IsEmpty());
177 EXPECT_THAT(RarMounter::ParseDigits("blah.part.rar"), IsEmpty());
178 EXPECT_THAT(RarMounter::ParseDigits("blah0.part.rar"), IsEmpty());
179 EXPECT_THAT(RarMounter::ParseDigits("/blah.part.rar"), IsEmpty());
180 EXPECT_THAT(RarMounter::ParseDigits("0.rar"), ir(0, 1));
181 EXPECT_THAT(RarMounter::ParseDigits("part0.rar"), ir(4, 5));
182 EXPECT_EQ(RarMounter::ParseDigits(".part0.rar"), ir(5, 6));
183 EXPECT_EQ(RarMounter::ParseDigits("blah.part0.rar"), ir(9, 10));
184 EXPECT_EQ(RarMounter::ParseDigits("/blah.part0.rar"), ir(10, 11));
185 EXPECT_EQ(RarMounter::ParseDigits("/some/path/blah.part0.rar"), ir(20, 21));
186 EXPECT_EQ(RarMounter::ParseDigits(".part9.rar"), ir(5, 6));
187 EXPECT_EQ(RarMounter::ParseDigits("blah.part9.rar"), ir(9, 10));
188 EXPECT_EQ(RarMounter::ParseDigits("/blah.part9.rar"), ir(10, 11));
189 EXPECT_EQ(RarMounter::ParseDigits("/some/path/blah.part9.rar"), ir(20, 21));
190 EXPECT_EQ(RarMounter::ParseDigits(".part2468097531.rar"), ir(5, 15));
191 EXPECT_EQ(RarMounter::ParseDigits("blah.part2468097531.rar"), ir(9, 19));
192 EXPECT_EQ(RarMounter::ParseDigits("/blah.part2468097531.rar"), ir(10, 20));
193 EXPECT_EQ(RarMounter::ParseDigits("/some/path/blah.part2468097531.rar"),
François Degros97f6a0d2020-08-24 15:58:30 +1000194 ir(20, 30));
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100195 EXPECT_EQ(RarMounter::ParseDigits("Blah.Part0.Rar"), ir(9, 10));
196 EXPECT_EQ(RarMounter::ParseDigits("BLAH.PART0.RAR"), ir(9, 10));
François Degros02e81492020-02-05 16:37:19 +1100197}
198
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100199TEST_F(RarMounterTest, GetBindPathsWithOldNamingScheme) {
200 const RarMounter& m = mounter_;
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100201 EXPECT_THAT(m.GetBindPaths("poi"), ElementsAreArray<std::string>({"poi"}));
François Degros02e81492020-02-05 16:37:19 +1100202
203 EXPECT_CALL(platform_, PathExists("poi.r00")).WillOnce(Return(false));
204 EXPECT_THAT(m.GetBindPaths("poi.rar"),
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100205 ElementsAreArray<std::string>({"poi.rar"}));
François Degros02e81492020-02-05 16:37:19 +1100206
207 EXPECT_CALL(platform_, PathExists("poi.r00")).WillOnce(Return(true));
208 EXPECT_CALL(platform_, PathExists("poi.r01")).WillOnce(Return(true));
209 EXPECT_CALL(platform_, PathExists("poi.r02")).WillOnce(Return(false));
210 EXPECT_THAT(m.GetBindPaths("poi.rar"),
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100211 ElementsAreArray<std::string>({"poi.rar", "poi.r00", "poi.r01"}));
François Degros02e81492020-02-05 16:37:19 +1100212
213 EXPECT_CALL(platform_, PathExists("POI.R00")).WillOnce(Return(true));
214 EXPECT_CALL(platform_, PathExists("POI.R01")).WillOnce(Return(true));
215 EXPECT_CALL(platform_, PathExists("POI.R02")).WillOnce(Return(false));
216 EXPECT_THAT(m.GetBindPaths("POI.RAR"),
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100217 ElementsAreArray<std::string>({"POI.RAR", "POI.R00", "POI.R01"}));
François Degros02e81492020-02-05 16:37:19 +1100218}
219
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100220TEST_F(RarMounterTest, GetBindPathsWithNewNamingScheme) {
221 const RarMounter& m = mounter_;
François Degros02e81492020-02-05 16:37:19 +1100222
François Degros97f6a0d2020-08-24 15:58:30 +1000223 EXPECT_CALL(platform_, PathExists("poi1.rar")).WillOnce(Return(false));
224 EXPECT_THAT(m.GetBindPaths("poi2.rar"),
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100225 ElementsAreArray<std::string>({"poi2.rar"}));
François Degros02e81492020-02-05 16:37:19 +1100226
François Degros97f6a0d2020-08-24 15:58:30 +1000227 EXPECT_CALL(platform_, PathExists("poi1.rar")).WillOnce(Return(true));
228 EXPECT_CALL(platform_, PathExists("poi2.rar")).WillOnce(Return(true));
229 EXPECT_CALL(platform_, PathExists("poi3.rar")).WillOnce(Return(true));
230 EXPECT_CALL(platform_, PathExists("poi4.rar")).WillOnce(Return(true));
231 EXPECT_CALL(platform_, PathExists("poi5.rar")).WillOnce(Return(false));
232 EXPECT_THAT(m.GetBindPaths("poi2.rar"),
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100233 ElementsAreArray<std::string>(
234 {"poi2.rar", "poi1.rar", "poi3.rar", "poi4.rar"}));
François Degros02e81492020-02-05 16:37:19 +1100235
François Degros97f6a0d2020-08-24 15:58:30 +1000236 EXPECT_CALL(platform_, PathExists("POI1.RAR")).WillOnce(Return(true));
237 EXPECT_CALL(platform_, PathExists("POI2.RAR")).WillOnce(Return(true));
238 EXPECT_CALL(platform_, PathExists("POI3.RAR")).WillOnce(Return(true));
239 EXPECT_CALL(platform_, PathExists("POI4.RAR")).WillOnce(Return(true));
240 EXPECT_CALL(platform_, PathExists("POI5.RAR")).WillOnce(Return(false));
241 EXPECT_THAT(m.GetBindPaths("POI2.RAR"),
Sergei Datsenko1d2cbf82020-12-08 21:54:42 +1100242 ElementsAreArray<std::string>(
243 {"POI2.RAR", "POI1.RAR", "POI3.RAR", "POI4.RAR"}));
François Degros02e81492020-02-05 16:37:19 +1100244}
245
Sergei Datsenkoc9904bb2020-12-11 12:46:02 +1100246TEST_F(RarMounterTest, GetBindPathsStopsOnOverflow) {
247 const RarMounter& m = mounter_;
François Degros02e81492020-02-05 16:37:19 +1100248
249 EXPECT_CALL(platform_, PathExists(_)).WillRepeatedly(Return(true));
250
251 EXPECT_THAT(m.GetBindPaths("poi.rar"), SizeIs(901));
252 EXPECT_THAT(m.GetBindPaths("POI.RAR"), SizeIs(901));
François Degros97f6a0d2020-08-24 15:58:30 +1000253 EXPECT_THAT(m.GetBindPaths("poi1.rar"), SizeIs(9));
254 EXPECT_THAT(m.GetBindPaths("POI1.RAR"), SizeIs(9));
255 EXPECT_THAT(m.GetBindPaths("poi01.rar"), SizeIs(99));
256 EXPECT_THAT(m.GetBindPaths("POI01.RAR"), SizeIs(99));
257 EXPECT_THAT(m.GetBindPaths("poi001.rar"), SizeIs(999));
258 EXPECT_THAT(m.GetBindPaths("POI001.RAR"), SizeIs(999));
François Degros02e81492020-02-05 16:37:19 +1100259}
260
François Degrosd6a775f2020-02-05 15:05:21 +1100261} // namespace cros_disks