xref: /aosp_15_r20/bootable/recovery/tests/unit/install_test.cpp (revision e7c364b630b241adcb6c7726a21055250b91fdac)
1*e7c364b6SAndroid Build Coastguard Worker /*
2*e7c364b6SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*e7c364b6SAndroid Build Coastguard Worker  *
4*e7c364b6SAndroid Build Coastguard Worker  * Licensed under the Apache License, version 2.0 (the "License");
5*e7c364b6SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e7c364b6SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e7c364b6SAndroid Build Coastguard Worker  *
8*e7c364b6SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e7c364b6SAndroid Build Coastguard Worker  *
10*e7c364b6SAndroid Build Coastguard Worker  * Unless required by applicable law or agree to in writing, software
11*e7c364b6SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e7c364b6SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e7c364b6SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e7c364b6SAndroid Build Coastguard Worker  * limitations under the License.
15*e7c364b6SAndroid Build Coastguard Worker  */
16*e7c364b6SAndroid Build Coastguard Worker 
17*e7c364b6SAndroid Build Coastguard Worker #include <stdio.h>
18*e7c364b6SAndroid Build Coastguard Worker #include <sys/stat.h>
19*e7c364b6SAndroid Build Coastguard Worker #include <sys/types.h>
20*e7c364b6SAndroid Build Coastguard Worker #include <unistd.h>
21*e7c364b6SAndroid Build Coastguard Worker 
22*e7c364b6SAndroid Build Coastguard Worker #include <algorithm>
23*e7c364b6SAndroid Build Coastguard Worker #include <random>
24*e7c364b6SAndroid Build Coastguard Worker #include <string>
25*e7c364b6SAndroid Build Coastguard Worker #include <vector>
26*e7c364b6SAndroid Build Coastguard Worker 
27*e7c364b6SAndroid Build Coastguard Worker #include <android-base/file.h>
28*e7c364b6SAndroid Build Coastguard Worker #include <android-base/properties.h>
29*e7c364b6SAndroid Build Coastguard Worker #include <android-base/strings.h>
30*e7c364b6SAndroid Build Coastguard Worker #include <gtest/gtest.h>
31*e7c364b6SAndroid Build Coastguard Worker #include <ziparchive/zip_archive.h>
32*e7c364b6SAndroid Build Coastguard Worker #include <ziparchive/zip_writer.h>
33*e7c364b6SAndroid Build Coastguard Worker 
34*e7c364b6SAndroid Build Coastguard Worker #include "install/install.h"
35*e7c364b6SAndroid Build Coastguard Worker #include "install/wipe_device.h"
36*e7c364b6SAndroid Build Coastguard Worker #include "otautil/paths.h"
37*e7c364b6SAndroid Build Coastguard Worker #include "private/setup_commands.h"
38*e7c364b6SAndroid Build Coastguard Worker #include "recovery_utils/roots.h"
39*e7c364b6SAndroid Build Coastguard Worker 
BuildZipArchive(const std::map<std::string,std::string> & file_map,int fd,int compression_type)40*e7c364b6SAndroid Build Coastguard Worker static void BuildZipArchive(const std::map<std::string, std::string>& file_map, int fd,
41*e7c364b6SAndroid Build Coastguard Worker                             int compression_type) {
42*e7c364b6SAndroid Build Coastguard Worker   FILE* zip_file = fdopen(fd, "w");
43*e7c364b6SAndroid Build Coastguard Worker   ZipWriter writer(zip_file);
44*e7c364b6SAndroid Build Coastguard Worker   for (const auto& [name, content] : file_map) {
45*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ(0, writer.StartEntry(name.c_str(), compression_type));
46*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ(0, writer.WriteBytes(content.data(), content.size()));
47*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ(0, writer.FinishEntry());
48*e7c364b6SAndroid Build Coastguard Worker   }
49*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, writer.Finish());
50*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, fclose(zip_file));
51*e7c364b6SAndroid Build Coastguard Worker }
52*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,read_metadata_from_package_smoke)53*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, read_metadata_from_package_smoke) {
54*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
55*e7c364b6SAndroid Build Coastguard Worker   const std::string content("abc=defg");
56*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { "META-INF/com/android/metadata", content } }, temp_file.release(),
57*e7c364b6SAndroid Build Coastguard Worker                   kCompressStored);
58*e7c364b6SAndroid Build Coastguard Worker 
59*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
60*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
61*e7c364b6SAndroid Build Coastguard Worker   std::map<std::string, std::string> metadata;
62*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ReadMetadataFromPackage(zip, &metadata));
63*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ("defg", metadata["abc"]);
64*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
65*e7c364b6SAndroid Build Coastguard Worker 
66*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file2;
67*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { "META-INF/com/android/metadata", content } }, temp_file2.release(),
68*e7c364b6SAndroid Build Coastguard Worker                   kCompressDeflated);
69*e7c364b6SAndroid Build Coastguard Worker 
70*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file2.path, &zip));
71*e7c364b6SAndroid Build Coastguard Worker   metadata.clear();
72*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ReadMetadataFromPackage(zip, &metadata));
73*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ("defg", metadata["abc"]);
74*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
75*e7c364b6SAndroid Build Coastguard Worker }
76*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,read_metadata_from_package_no_entry)77*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, read_metadata_from_package_no_entry) {
78*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
79*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { "fake_entry", "" } }, temp_file.release(), kCompressStored);
80*e7c364b6SAndroid Build Coastguard Worker 
81*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
82*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
83*e7c364b6SAndroid Build Coastguard Worker   std::map<std::string, std::string> metadata;
84*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ReadMetadataFromPackage(zip, &metadata));
85*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
86*e7c364b6SAndroid Build Coastguard Worker }
87*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,read_wipe_ab_partition_list)88*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, read_wipe_ab_partition_list) {
89*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> partition_list = {
90*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/system_a", "/dev/block/bootdevice/by-name/system_b",
91*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/vendor_a", "/dev/block/bootdevice/by-name/vendor_b",
92*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/userdata", "# Wipe the boot partitions last",
93*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/boot_a",   "/dev/block/bootdevice/by-name/boot_b",
94*e7c364b6SAndroid Build Coastguard Worker   };
95*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
96*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { "recovery.wipe", android::base::Join(partition_list, '\n') } },
97*e7c364b6SAndroid Build Coastguard Worker                   temp_file.release(), kCompressDeflated);
98*e7c364b6SAndroid Build Coastguard Worker   std::string wipe_package;
99*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(android::base::ReadFileToString(temp_file.path, &wipe_package));
100*e7c364b6SAndroid Build Coastguard Worker 
101*e7c364b6SAndroid Build Coastguard Worker   auto package = Package::CreateMemoryPackage(
102*e7c364b6SAndroid Build Coastguard Worker       std::vector<uint8_t>(wipe_package.begin(), wipe_package.end()), nullptr);
103*e7c364b6SAndroid Build Coastguard Worker 
104*e7c364b6SAndroid Build Coastguard Worker   auto read_partition_list = GetWipePartitionList(package.get());
105*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> expected = {
106*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/system_a", "/dev/block/bootdevice/by-name/system_b",
107*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/vendor_a", "/dev/block/bootdevice/by-name/vendor_b",
108*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/userdata", "/dev/block/bootdevice/by-name/boot_a",
109*e7c364b6SAndroid Build Coastguard Worker     "/dev/block/bootdevice/by-name/boot_b",
110*e7c364b6SAndroid Build Coastguard Worker   };
111*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(expected, read_partition_list);
112*e7c364b6SAndroid Build Coastguard Worker }
113*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,SetUpNonAbUpdateCommands)114*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, SetUpNonAbUpdateCommands) {
115*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
116*e7c364b6SAndroid Build Coastguard Worker   static constexpr const char* UPDATE_BINARY_NAME = "META-INF/com/google/android/update-binary";
117*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { UPDATE_BINARY_NAME, "" } }, temp_file.release(), kCompressStored);
118*e7c364b6SAndroid Build Coastguard Worker 
119*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
120*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
121*e7c364b6SAndroid Build Coastguard Worker   int status_fd = 10;
122*e7c364b6SAndroid Build Coastguard Worker   std::string package = "/path/to/update.zip";
123*e7c364b6SAndroid Build Coastguard Worker   TemporaryDir td;
124*e7c364b6SAndroid Build Coastguard Worker   std::string binary_path = std::string(td.path) + "/update_binary";
125*e7c364b6SAndroid Build Coastguard Worker   Paths::Get().set_temporary_update_binary(binary_path);
126*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> cmd;
127*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(SetUpNonAbUpdateCommands(package, zip, 0, status_fd, &cmd));
128*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(4U, cmd.size());
129*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(binary_path, cmd[0]);
130*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ("3", cmd[1]);  // RECOVERY_API_VERSION
131*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(std::to_string(status_fd), cmd[2]);
132*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(package, cmd[3]);
133*e7c364b6SAndroid Build Coastguard Worker   struct stat sb;
134*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, stat(binary_path.c_str(), &sb));
135*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<mode_t>(0755), sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));
136*e7c364b6SAndroid Build Coastguard Worker 
137*e7c364b6SAndroid Build Coastguard Worker   // With non-zero retry count. update_binary will be removed automatically.
138*e7c364b6SAndroid Build Coastguard Worker   cmd.clear();
139*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(SetUpNonAbUpdateCommands(package, zip, 2, status_fd, &cmd));
140*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(5U, cmd.size());
141*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(binary_path, cmd[0]);
142*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ("3", cmd[1]);  // RECOVERY_API_VERSION
143*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(std::to_string(status_fd), cmd[2]);
144*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(package, cmd[3]);
145*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ("retry", cmd[4]);
146*e7c364b6SAndroid Build Coastguard Worker   sb = {};
147*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, stat(binary_path.c_str(), &sb));
148*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<mode_t>(0755), sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));
149*e7c364b6SAndroid Build Coastguard Worker 
150*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
151*e7c364b6SAndroid Build Coastguard Worker }
152*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,SetUpNonAbUpdateCommands_MissingUpdateBinary)153*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, SetUpNonAbUpdateCommands_MissingUpdateBinary) {
154*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
155*e7c364b6SAndroid Build Coastguard Worker   // The archive must have something to be opened correctly.
156*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { "fake_entry", "" } }, temp_file.release(), kCompressStored);
157*e7c364b6SAndroid Build Coastguard Worker 
158*e7c364b6SAndroid Build Coastguard Worker   // Missing update binary.
159*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
160*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
161*e7c364b6SAndroid Build Coastguard Worker   int status_fd = 10;
162*e7c364b6SAndroid Build Coastguard Worker   std::string package = "/path/to/update.zip";
163*e7c364b6SAndroid Build Coastguard Worker   TemporaryDir td;
164*e7c364b6SAndroid Build Coastguard Worker   Paths::Get().set_temporary_update_binary(std::string(td.path) + "/update_binary");
165*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> cmd;
166*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(SetUpNonAbUpdateCommands(package, zip, 0, status_fd, &cmd));
167*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
168*e7c364b6SAndroid Build Coastguard Worker }
169*e7c364b6SAndroid Build Coastguard Worker 
VerifyAbUpdateCommands(const std::string & serialno,bool success=true)170*e7c364b6SAndroid Build Coastguard Worker static void VerifyAbUpdateCommands(const std::string& serialno, bool success = true) {
171*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
172*e7c364b6SAndroid Build Coastguard Worker 
173*e7c364b6SAndroid Build Coastguard Worker   const std::string properties = "some_properties";
174*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
175*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
176*e7c364b6SAndroid Build Coastguard Worker   std::string timestamp = android::base::GetProperty("ro.build.date.utc", "");
177*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", timestamp);
178*e7c364b6SAndroid Build Coastguard Worker 
179*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> meta{ "ota-type=AB", "pre-device=" + device,
180*e7c364b6SAndroid Build Coastguard Worker                                  "post-timestamp=" + timestamp };
181*e7c364b6SAndroid Build Coastguard Worker   if (!serialno.empty()) {
182*e7c364b6SAndroid Build Coastguard Worker     meta.push_back("serialno=" + serialno);
183*e7c364b6SAndroid Build Coastguard Worker   }
184*e7c364b6SAndroid Build Coastguard Worker   std::string metadata_string = android::base::Join(meta, "\n");
185*e7c364b6SAndroid Build Coastguard Worker 
186*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive({ { "payload.bin", "" },
187*e7c364b6SAndroid Build Coastguard Worker                     { "payload_properties.txt", properties },
188*e7c364b6SAndroid Build Coastguard Worker                     { "META-INF/com/android/metadata", metadata_string } },
189*e7c364b6SAndroid Build Coastguard Worker                   temp_file.release(), kCompressStored);
190*e7c364b6SAndroid Build Coastguard Worker 
191*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
192*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
193*e7c364b6SAndroid Build Coastguard Worker   ZipEntry64 payload_entry;
194*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, FindEntry(zip, "payload.bin", &payload_entry));
195*e7c364b6SAndroid Build Coastguard Worker 
196*e7c364b6SAndroid Build Coastguard Worker   std::map<std::string, std::string> metadata;
197*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ReadMetadataFromPackage(zip, &metadata));
198*e7c364b6SAndroid Build Coastguard Worker   if (success) {
199*e7c364b6SAndroid Build Coastguard Worker     ASSERT_TRUE(CheckPackageMetadata(metadata, OtaType::AB));
200*e7c364b6SAndroid Build Coastguard Worker 
201*e7c364b6SAndroid Build Coastguard Worker     int status_fd = 10;
202*e7c364b6SAndroid Build Coastguard Worker     std::string package = "/path/to/update.zip";
203*e7c364b6SAndroid Build Coastguard Worker     std::vector<std::string> cmd;
204*e7c364b6SAndroid Build Coastguard Worker     ASSERT_TRUE(SetUpAbUpdateCommands(package, zip, status_fd, &cmd));
205*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ(5U, cmd.size());
206*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ("/system/bin/update_engine_sideload", cmd[0]);
207*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ("--payload=file://" + package, cmd[1]);
208*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ("--offset=" + std::to_string(payload_entry.offset), cmd[2]);
209*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ("--headers=" + properties, cmd[3]);
210*e7c364b6SAndroid Build Coastguard Worker     ASSERT_EQ("--status_fd=" + std::to_string(status_fd), cmd[4]);
211*e7c364b6SAndroid Build Coastguard Worker   } else {
212*e7c364b6SAndroid Build Coastguard Worker     ASSERT_FALSE(CheckPackageMetadata(metadata, OtaType::AB));
213*e7c364b6SAndroid Build Coastguard Worker   }
214*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
215*e7c364b6SAndroid Build Coastguard Worker }
216*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,SetUpAbUpdateCommands)217*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, SetUpAbUpdateCommands) {
218*e7c364b6SAndroid Build Coastguard Worker   // Empty serialno will pass the verification.
219*e7c364b6SAndroid Build Coastguard Worker   VerifyAbUpdateCommands({});
220*e7c364b6SAndroid Build Coastguard Worker }
221*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,SetUpAbUpdateCommands_MissingPayloadPropertiesTxt)222*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, SetUpAbUpdateCommands_MissingPayloadPropertiesTxt) {
223*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
224*e7c364b6SAndroid Build Coastguard Worker 
225*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
226*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
227*e7c364b6SAndroid Build Coastguard Worker   std::string timestamp = android::base::GetProperty("ro.build.date.utc", "");
228*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", timestamp);
229*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
230*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
231*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB", "pre-device=" + device, "post-timestamp=" + timestamp,
232*e7c364b6SAndroid Build Coastguard Worker       },
233*e7c364b6SAndroid Build Coastguard Worker       "\n");
234*e7c364b6SAndroid Build Coastguard Worker 
235*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive(
236*e7c364b6SAndroid Build Coastguard Worker       {
237*e7c364b6SAndroid Build Coastguard Worker           { "payload.bin", "" },
238*e7c364b6SAndroid Build Coastguard Worker           { "META-INF/com/android/metadata", metadata },
239*e7c364b6SAndroid Build Coastguard Worker       },
240*e7c364b6SAndroid Build Coastguard Worker       temp_file.release(), kCompressStored);
241*e7c364b6SAndroid Build Coastguard Worker 
242*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
243*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
244*e7c364b6SAndroid Build Coastguard Worker   int status_fd = 10;
245*e7c364b6SAndroid Build Coastguard Worker   std::string package = "/path/to/update.zip";
246*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> cmd;
247*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(SetUpAbUpdateCommands(package, zip, status_fd, &cmd));
248*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
249*e7c364b6SAndroid Build Coastguard Worker }
250*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,SetUpAbUpdateCommands_MultipleSerialnos)251*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, SetUpAbUpdateCommands_MultipleSerialnos) {
252*e7c364b6SAndroid Build Coastguard Worker   std::string serialno = android::base::GetProperty("ro.serialno", "");
253*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", serialno);
254*e7c364b6SAndroid Build Coastguard Worker 
255*e7c364b6SAndroid Build Coastguard Worker   // Single matching serialno will pass the verification.
256*e7c364b6SAndroid Build Coastguard Worker   VerifyAbUpdateCommands(serialno);
257*e7c364b6SAndroid Build Coastguard Worker 
258*e7c364b6SAndroid Build Coastguard Worker   static constexpr char alphabet[] =
259*e7c364b6SAndroid Build Coastguard Worker       "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
260*e7c364b6SAndroid Build Coastguard Worker   auto generator = []() { return alphabet[rand() % (sizeof(alphabet) - 1)]; };
261*e7c364b6SAndroid Build Coastguard Worker 
262*e7c364b6SAndroid Build Coastguard Worker   // Generate 900 random serial numbers.
263*e7c364b6SAndroid Build Coastguard Worker   std::string random_serialno;
264*e7c364b6SAndroid Build Coastguard Worker   for (size_t i = 0; i < 900; i++) {
265*e7c364b6SAndroid Build Coastguard Worker     generate_n(back_inserter(random_serialno), serialno.size(), generator);
266*e7c364b6SAndroid Build Coastguard Worker     random_serialno.append("|");
267*e7c364b6SAndroid Build Coastguard Worker   }
268*e7c364b6SAndroid Build Coastguard Worker   // Random serialnos should fail the verification.
269*e7c364b6SAndroid Build Coastguard Worker   VerifyAbUpdateCommands(random_serialno, false);
270*e7c364b6SAndroid Build Coastguard Worker 
271*e7c364b6SAndroid Build Coastguard Worker   std::string long_serialno = random_serialno + serialno + "|";
272*e7c364b6SAndroid Build Coastguard Worker   for (size_t i = 0; i < 99; i++) {
273*e7c364b6SAndroid Build Coastguard Worker     generate_n(back_inserter(long_serialno), serialno.size(), generator);
274*e7c364b6SAndroid Build Coastguard Worker     long_serialno.append("|");
275*e7c364b6SAndroid Build Coastguard Worker   }
276*e7c364b6SAndroid Build Coastguard Worker   // String with the matching serialno should pass the verification.
277*e7c364b6SAndroid Build Coastguard Worker   VerifyAbUpdateCommands(long_serialno);
278*e7c364b6SAndroid Build Coastguard Worker }
279*e7c364b6SAndroid Build Coastguard Worker 
TestCheckPackageMetadata(const std::string & metadata_string,OtaType ota_type,bool exptected_result)280*e7c364b6SAndroid Build Coastguard Worker static void TestCheckPackageMetadata(const std::string& metadata_string, OtaType ota_type,
281*e7c364b6SAndroid Build Coastguard Worker                                      bool exptected_result) {
282*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile temp_file;
283*e7c364b6SAndroid Build Coastguard Worker   BuildZipArchive(
284*e7c364b6SAndroid Build Coastguard Worker       {
285*e7c364b6SAndroid Build Coastguard Worker           { "META-INF/com/android/metadata", metadata_string },
286*e7c364b6SAndroid Build Coastguard Worker       },
287*e7c364b6SAndroid Build Coastguard Worker       temp_file.release(), kCompressStored);
288*e7c364b6SAndroid Build Coastguard Worker 
289*e7c364b6SAndroid Build Coastguard Worker   ZipArchiveHandle zip;
290*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, OpenArchive(temp_file.path, &zip));
291*e7c364b6SAndroid Build Coastguard Worker 
292*e7c364b6SAndroid Build Coastguard Worker   std::map<std::string, std::string> metadata;
293*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ReadMetadataFromPackage(zip, &metadata));
294*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(exptected_result, CheckPackageMetadata(metadata, ota_type));
295*e7c364b6SAndroid Build Coastguard Worker   CloseArchive(zip);
296*e7c364b6SAndroid Build Coastguard Worker }
297*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_ota_type)298*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_ota_type) {
299*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
300*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
301*e7c364b6SAndroid Build Coastguard Worker 
302*e7c364b6SAndroid Build Coastguard Worker   // ota-type must be present
303*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
304*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
305*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
306*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
307*e7c364b6SAndroid Build Coastguard Worker       },
308*e7c364b6SAndroid Build Coastguard Worker       "\n");
309*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
310*e7c364b6SAndroid Build Coastguard Worker 
311*e7c364b6SAndroid Build Coastguard Worker   // Checks if ota-type matches
312*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
313*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
314*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
315*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
316*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
317*e7c364b6SAndroid Build Coastguard Worker       },
318*e7c364b6SAndroid Build Coastguard Worker       "\n");
319*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, true);
320*e7c364b6SAndroid Build Coastguard Worker 
321*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, false);
322*e7c364b6SAndroid Build Coastguard Worker }
323*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_device_type)324*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_device_type) {
325*e7c364b6SAndroid Build Coastguard Worker   // device type can not be empty
326*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
327*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
328*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
329*e7c364b6SAndroid Build Coastguard Worker       },
330*e7c364b6SAndroid Build Coastguard Worker       "\n");
331*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, false);
332*e7c364b6SAndroid Build Coastguard Worker 
333*e7c364b6SAndroid Build Coastguard Worker   // device type mismatches
334*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
335*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
336*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
337*e7c364b6SAndroid Build Coastguard Worker           "pre-device=fake_device_type",
338*e7c364b6SAndroid Build Coastguard Worker       },
339*e7c364b6SAndroid Build Coastguard Worker       "\n");
340*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, false);
341*e7c364b6SAndroid Build Coastguard Worker }
342*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_serial_number_smoke)343*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_serial_number_smoke) {
344*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
345*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
346*e7c364b6SAndroid Build Coastguard Worker 
347*e7c364b6SAndroid Build Coastguard Worker   // Serial number doesn't need to exist
348*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
349*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
350*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
351*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
352*e7c364b6SAndroid Build Coastguard Worker       },
353*e7c364b6SAndroid Build Coastguard Worker       "\n");
354*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, true);
355*e7c364b6SAndroid Build Coastguard Worker 
356*e7c364b6SAndroid Build Coastguard Worker   // Serial number mismatches
357*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
358*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
359*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
360*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
361*e7c364b6SAndroid Build Coastguard Worker           "serialno=fake_serial",
362*e7c364b6SAndroid Build Coastguard Worker       },
363*e7c364b6SAndroid Build Coastguard Worker       "\n");
364*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, false);
365*e7c364b6SAndroid Build Coastguard Worker 
366*e7c364b6SAndroid Build Coastguard Worker   std::string serialno = android::base::GetProperty("ro.serialno", "");
367*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", serialno);
368*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
369*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
370*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
371*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
372*e7c364b6SAndroid Build Coastguard Worker           "serialno=" + serialno,
373*e7c364b6SAndroid Build Coastguard Worker       },
374*e7c364b6SAndroid Build Coastguard Worker       "\n");
375*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, true);
376*e7c364b6SAndroid Build Coastguard Worker }
377*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_multiple_serial_number)378*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_multiple_serial_number) {
379*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
380*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
381*e7c364b6SAndroid Build Coastguard Worker 
382*e7c364b6SAndroid Build Coastguard Worker   std::string serialno = android::base::GetProperty("ro.serialno", "");
383*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", serialno);
384*e7c364b6SAndroid Build Coastguard Worker 
385*e7c364b6SAndroid Build Coastguard Worker   std::vector<std::string> serial_numbers;
386*e7c364b6SAndroid Build Coastguard Worker   // Creates a fake serial number string.
387*e7c364b6SAndroid Build Coastguard Worker   for (char c = 'a'; c <= 'z'; c++) {
388*e7c364b6SAndroid Build Coastguard Worker     serial_numbers.emplace_back(serialno.size(), c);
389*e7c364b6SAndroid Build Coastguard Worker   }
390*e7c364b6SAndroid Build Coastguard Worker 
391*e7c364b6SAndroid Build Coastguard Worker   // No matched serialno found.
392*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
393*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
394*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
395*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
396*e7c364b6SAndroid Build Coastguard Worker           "serialno=" + android::base::Join(serial_numbers, '|'),
397*e7c364b6SAndroid Build Coastguard Worker       },
398*e7c364b6SAndroid Build Coastguard Worker       "\n");
399*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, false);
400*e7c364b6SAndroid Build Coastguard Worker 
401*e7c364b6SAndroid Build Coastguard Worker   serial_numbers.emplace_back(serialno);
402*e7c364b6SAndroid Build Coastguard Worker   std::shuffle(serial_numbers.begin(), serial_numbers.end(), std::default_random_engine());
403*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
404*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
405*e7c364b6SAndroid Build Coastguard Worker           "ota-type=BRICK",
406*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
407*e7c364b6SAndroid Build Coastguard Worker           "serialno=" + android::base::Join(serial_numbers, '|'),
408*e7c364b6SAndroid Build Coastguard Worker       },
409*e7c364b6SAndroid Build Coastguard Worker       "\n");
410*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::BRICK, true);
411*e7c364b6SAndroid Build Coastguard Worker }
412*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_ab_build_version)413*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_ab_build_version) {
414*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
415*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
416*e7c364b6SAndroid Build Coastguard Worker 
417*e7c364b6SAndroid Build Coastguard Worker   std::string build_version = android::base::GetProperty("ro.build.version.incremental", "");
418*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", build_version);
419*e7c364b6SAndroid Build Coastguard Worker 
420*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
421*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
422*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
423*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
424*e7c364b6SAndroid Build Coastguard Worker           "pre-build-incremental=" + build_version,
425*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
426*e7c364b6SAndroid Build Coastguard Worker       },
427*e7c364b6SAndroid Build Coastguard Worker       "\n");
428*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, true);
429*e7c364b6SAndroid Build Coastguard Worker 
430*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
431*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
432*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
433*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
434*e7c364b6SAndroid Build Coastguard Worker           "pre-build-incremental=fake_build",
435*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
436*e7c364b6SAndroid Build Coastguard Worker       },
437*e7c364b6SAndroid Build Coastguard Worker       "\n");
438*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
439*e7c364b6SAndroid Build Coastguard Worker }
440*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_ab_fingerprint)441*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_ab_fingerprint) {
442*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
443*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
444*e7c364b6SAndroid Build Coastguard Worker 
445*e7c364b6SAndroid Build Coastguard Worker   std::string finger_print = android::base::GetProperty("ro.build.fingerprint", "");
446*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", finger_print);
447*e7c364b6SAndroid Build Coastguard Worker 
448*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
449*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
450*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
451*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
452*e7c364b6SAndroid Build Coastguard Worker           "pre-build=" + finger_print,
453*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
454*e7c364b6SAndroid Build Coastguard Worker       },
455*e7c364b6SAndroid Build Coastguard Worker       "\n");
456*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, true);
457*e7c364b6SAndroid Build Coastguard Worker 
458*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
459*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
460*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
461*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
462*e7c364b6SAndroid Build Coastguard Worker           "pre-build=fake_build_fingerprint",
463*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
464*e7c364b6SAndroid Build Coastguard Worker       },
465*e7c364b6SAndroid Build Coastguard Worker       "\n");
466*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
467*e7c364b6SAndroid Build Coastguard Worker }
468*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_dynamic_fingerprint)469*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_dynamic_fingerprint) {
470*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
471*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(device.empty());
472*e7c364b6SAndroid Build Coastguard Worker 
473*e7c364b6SAndroid Build Coastguard Worker   std::string finger_print = android::base::GetProperty("ro.build.fingerprint", "");
474*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(finger_print.empty());
475*e7c364b6SAndroid Build Coastguard Worker 
476*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
477*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
478*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
479*e7c364b6SAndroid Build Coastguard Worker           "pre-device=please|work|" + device + "|please|work",
480*e7c364b6SAndroid Build Coastguard Worker           "pre-build=" + finger_print = "pass|this|test",
481*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
482*e7c364b6SAndroid Build Coastguard Worker       },
483*e7c364b6SAndroid Build Coastguard Worker       "\n");
484*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, true);
485*e7c364b6SAndroid Build Coastguard Worker 
486*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
487*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
488*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
489*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
490*e7c364b6SAndroid Build Coastguard Worker           "pre-build=fake_build_fingerprint",
491*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=" + std::to_string(std::numeric_limits<int64_t>::max()),
492*e7c364b6SAndroid Build Coastguard Worker       },
493*e7c364b6SAndroid Build Coastguard Worker       "\n");
494*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
495*e7c364b6SAndroid Build Coastguard Worker }
496*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,CheckPackageMetadata_ab_post_timestamp)497*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, CheckPackageMetadata_ab_post_timestamp) {
498*e7c364b6SAndroid Build Coastguard Worker   std::string device = android::base::GetProperty("ro.product.device", "");
499*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", device);
500*e7c364b6SAndroid Build Coastguard Worker 
501*e7c364b6SAndroid Build Coastguard Worker   // post timestamp is required for upgrade.
502*e7c364b6SAndroid Build Coastguard Worker   std::string metadata = android::base::Join(
503*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
504*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
505*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
506*e7c364b6SAndroid Build Coastguard Worker       },
507*e7c364b6SAndroid Build Coastguard Worker       "\n");
508*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
509*e7c364b6SAndroid Build Coastguard Worker 
510*e7c364b6SAndroid Build Coastguard Worker   // post timestamp should be larger than the timestamp on device.
511*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
512*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
513*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
514*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
515*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=0",
516*e7c364b6SAndroid Build Coastguard Worker       },
517*e7c364b6SAndroid Build Coastguard Worker       "\n");
518*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
519*e7c364b6SAndroid Build Coastguard Worker 
520*e7c364b6SAndroid Build Coastguard Worker   // fingerprint is required for downgrade
521*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
522*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
523*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
524*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
525*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=0",
526*e7c364b6SAndroid Build Coastguard Worker           "ota-downgrade=yes",
527*e7c364b6SAndroid Build Coastguard Worker       },
528*e7c364b6SAndroid Build Coastguard Worker       "\n");
529*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, false);
530*e7c364b6SAndroid Build Coastguard Worker 
531*e7c364b6SAndroid Build Coastguard Worker   std::string finger_print = android::base::GetProperty("ro.build.fingerprint", "");
532*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE("", finger_print);
533*e7c364b6SAndroid Build Coastguard Worker 
534*e7c364b6SAndroid Build Coastguard Worker   metadata = android::base::Join(
535*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
536*e7c364b6SAndroid Build Coastguard Worker           "ota-type=AB",
537*e7c364b6SAndroid Build Coastguard Worker           "pre-device=" + device,
538*e7c364b6SAndroid Build Coastguard Worker           "post-timestamp=0",
539*e7c364b6SAndroid Build Coastguard Worker           "pre-build=" + finger_print,
540*e7c364b6SAndroid Build Coastguard Worker           "ota-downgrade=yes",
541*e7c364b6SAndroid Build Coastguard Worker       },
542*e7c364b6SAndroid Build Coastguard Worker       "\n");
543*e7c364b6SAndroid Build Coastguard Worker   TestCheckPackageMetadata(metadata, OtaType::AB, true);
544*e7c364b6SAndroid Build Coastguard Worker }
545*e7c364b6SAndroid Build Coastguard Worker 
TEST(InstallTest,SetupPackageMount_package_path)546*e7c364b6SAndroid Build Coastguard Worker TEST(InstallTest, SetupPackageMount_package_path) {
547*e7c364b6SAndroid Build Coastguard Worker   load_volume_table();
548*e7c364b6SAndroid Build Coastguard Worker   bool install_with_fuse;
549*e7c364b6SAndroid Build Coastguard Worker 
550*e7c364b6SAndroid Build Coastguard Worker   // Setup should fail if the input path doesn't exist.
551*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(SetupPackageMount("/does_not_exist", &install_with_fuse));
552*e7c364b6SAndroid Build Coastguard Worker 
553*e7c364b6SAndroid Build Coastguard Worker   // Package should be installed with fuse if it's not in /cache.
554*e7c364b6SAndroid Build Coastguard Worker   TemporaryDir temp_dir;
555*e7c364b6SAndroid Build Coastguard Worker   TemporaryFile update_package(temp_dir.path);
556*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(SetupPackageMount(update_package.path, &install_with_fuse));
557*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(install_with_fuse);
558*e7c364b6SAndroid Build Coastguard Worker 
559*e7c364b6SAndroid Build Coastguard Worker   // Setup should fail if the input path isn't canonicalized.
560*e7c364b6SAndroid Build Coastguard Worker   std::string uncanonical_package_path = android::base::Join(
561*e7c364b6SAndroid Build Coastguard Worker       std::vector<std::string>{
562*e7c364b6SAndroid Build Coastguard Worker           temp_dir.path,
563*e7c364b6SAndroid Build Coastguard Worker           "..",
564*e7c364b6SAndroid Build Coastguard Worker           android::base::Basename(temp_dir.path),
565*e7c364b6SAndroid Build Coastguard Worker           android::base::Basename(update_package.path),
566*e7c364b6SAndroid Build Coastguard Worker       },
567*e7c364b6SAndroid Build Coastguard Worker       '/');
568*e7c364b6SAndroid Build Coastguard Worker 
569*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, access(uncanonical_package_path.c_str(), R_OK));
570*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(SetupPackageMount(uncanonical_package_path, &install_with_fuse));
571*e7c364b6SAndroid Build Coastguard Worker }
572