François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 1 | // 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 Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 5 | #include "cros-disks/rar_mounter.h" |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 6 | |
Simon Glass | 2b1da09 | 2020-05-21 12:24:16 -0600 | [diff] [blame] | 7 | #include <brillo/process/process_reaper.h> |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 8 | #include <gmock/gmock.h> |
| 9 | #include <gtest/gtest.h> |
| 10 | |
| 11 | #include "cros-disks/metrics.h" |
| 12 | #include "cros-disks/platform.h" |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 13 | #include "cros-disks/quote.h" |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 14 | |
| 15 | namespace cros_disks { |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 16 | |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 17 | namespace { |
| 18 | |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 19 | using ::testing::_; |
| 20 | using ::testing::ElementsAre; |
| 21 | using ::testing::ElementsAreArray; |
| 22 | using ::testing::IsEmpty; |
| 23 | using ::testing::Return; |
| 24 | using ::testing::SizeIs; |
| 25 | |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 26 | // Mock Platform implementation for testing. |
| 27 | class MockPlatform : public Platform { |
| 28 | public: |
| 29 | MOCK_METHOD(bool, PathExists, (const std::string&), (const, override)); |
| 30 | }; |
| 31 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 32 | class FakeSandboxedProcessFactory : public SandboxedProcessFactory { |
| 33 | public: |
| 34 | std::unique_ptr<SandboxedProcess> CreateSandboxedProcess() const { |
| 35 | return std::make_unique<FakeSandboxedProcess>(); |
| 36 | } |
| 37 | }; |
| 38 | |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 39 | } // namespace |
| 40 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 41 | class RarMounterTest : public testing::Test { |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 42 | protected: |
| 43 | Metrics metrics_; |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 44 | MockPlatform platform_; |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 45 | brillo::ProcessReaper reaper_; |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 46 | const RarMounter mounter_{&platform_, &reaper_, &metrics_, |
| 47 | std::make_unique<FakeSandboxedProcessFactory>()}; |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 48 | }; |
| 49 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 50 | TEST_F(RarMounterTest, Increment) { |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 51 | std::string s; |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 52 | const auto inc = [&s] { return RarMounter::Increment(s.begin(), s.end()); }; |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 53 | |
| 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 Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 166 | TEST_F(RarMounterTest, ParseDigits) { |
François Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 167 | const auto ir = [](const size_t begin, const size_t end) { |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 168 | return RarMounter::IndexRange{begin, end}; |
François Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 169 | }; |
| 170 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 171 | 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 Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 194 | ir(20, 30)); |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 195 | EXPECT_EQ(RarMounter::ParseDigits("Blah.Part0.Rar"), ir(9, 10)); |
| 196 | EXPECT_EQ(RarMounter::ParseDigits("BLAH.PART0.RAR"), ir(9, 10)); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 197 | } |
| 198 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 199 | TEST_F(RarMounterTest, GetBindPathsWithOldNamingScheme) { |
| 200 | const RarMounter& m = mounter_; |
Sergei Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 201 | EXPECT_THAT(m.GetBindPaths("poi"), ElementsAreArray<std::string>({"poi"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 202 | |
| 203 | EXPECT_CALL(platform_, PathExists("poi.r00")).WillOnce(Return(false)); |
| 204 | EXPECT_THAT(m.GetBindPaths("poi.rar"), |
Sergei Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 205 | ElementsAreArray<std::string>({"poi.rar"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 206 | |
| 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 Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 211 | ElementsAreArray<std::string>({"poi.rar", "poi.r00", "poi.r01"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 212 | |
| 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 Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 217 | ElementsAreArray<std::string>({"POI.RAR", "POI.R00", "POI.R01"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 218 | } |
| 219 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 220 | TEST_F(RarMounterTest, GetBindPathsWithNewNamingScheme) { |
| 221 | const RarMounter& m = mounter_; |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 222 | |
François Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 223 | EXPECT_CALL(platform_, PathExists("poi1.rar")).WillOnce(Return(false)); |
| 224 | EXPECT_THAT(m.GetBindPaths("poi2.rar"), |
Sergei Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 225 | ElementsAreArray<std::string>({"poi2.rar"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 226 | |
François Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 227 | 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 Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 233 | ElementsAreArray<std::string>( |
| 234 | {"poi2.rar", "poi1.rar", "poi3.rar", "poi4.rar"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 235 | |
François Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 236 | 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 Datsenko | 1d2cbf8 | 2020-12-08 21:54:42 +1100 | [diff] [blame] | 242 | ElementsAreArray<std::string>( |
| 243 | {"POI2.RAR", "POI1.RAR", "POI3.RAR", "POI4.RAR"})); |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 244 | } |
| 245 | |
Sergei Datsenko | c9904bb | 2020-12-11 12:46:02 +1100 | [diff] [blame] | 246 | TEST_F(RarMounterTest, GetBindPathsStopsOnOverflow) { |
| 247 | const RarMounter& m = mounter_; |
François Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 248 | |
| 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 Degros | 97f6a0d | 2020-08-24 15:58:30 +1000 | [diff] [blame] | 253 | 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 Degros | 02e8149 | 2020-02-05 16:37:19 +1100 | [diff] [blame] | 259 | } |
| 260 | |
François Degros | d6a775f | 2020-02-05 15:05:21 +1100 | [diff] [blame] | 261 | } // namespace cros_disks |