xref: /aosp_15_r20/system/apex/libs/libapexutil/apexutil_test.cpp (revision 33f3758387333dbd2962d7edbd98681940d895da)
1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker  *
4*33f37583SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker  *
8*33f37583SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker  *
10*33f37583SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker  * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker  */
16*33f37583SAndroid Build Coastguard Worker 
17*33f37583SAndroid Build Coastguard Worker #include "apexutil.h"
18*33f37583SAndroid Build Coastguard Worker 
19*33f37583SAndroid Build Coastguard Worker #include <unistd.h>
20*33f37583SAndroid Build Coastguard Worker 
21*33f37583SAndroid Build Coastguard Worker #include <string>
22*33f37583SAndroid Build Coastguard Worker #include <utility>
23*33f37583SAndroid Build Coastguard Worker #include <vector>
24*33f37583SAndroid Build Coastguard Worker 
25*33f37583SAndroid Build Coastguard Worker #include <android-base/file.h>
26*33f37583SAndroid Build Coastguard Worker #include <apex_manifest.pb.h>
27*33f37583SAndroid Build Coastguard Worker #include <gmock/gmock.h>
28*33f37583SAndroid Build Coastguard Worker #include <gtest/gtest.h>
29*33f37583SAndroid Build Coastguard Worker 
30*33f37583SAndroid Build Coastguard Worker using namespace std::literals;
31*33f37583SAndroid Build Coastguard Worker 
32*33f37583SAndroid Build Coastguard Worker using ::android::apex::GetActivePackages;
33*33f37583SAndroid Build Coastguard Worker using ::android::base::WriteStringToFile;
34*33f37583SAndroid Build Coastguard Worker using ::apex::proto::ApexManifest;
35*33f37583SAndroid Build Coastguard Worker using ::testing::Contains;
36*33f37583SAndroid Build Coastguard Worker using ::testing::Pair;
37*33f37583SAndroid Build Coastguard Worker using ::testing::UnorderedElementsAre;
38*33f37583SAndroid Build Coastguard Worker 
39*33f37583SAndroid Build Coastguard Worker namespace {
40*33f37583SAndroid Build Coastguard Worker 
CreateApexManifest(std::string apex_name,int version)41*33f37583SAndroid Build Coastguard Worker ApexManifest CreateApexManifest(std::string apex_name, int version) {
42*33f37583SAndroid Build Coastguard Worker   ApexManifest manifest;
43*33f37583SAndroid Build Coastguard Worker   manifest.set_name(apex_name);
44*33f37583SAndroid Build Coastguard Worker   manifest.set_version(version);
45*33f37583SAndroid Build Coastguard Worker   return manifest;
46*33f37583SAndroid Build Coastguard Worker }
47*33f37583SAndroid Build Coastguard Worker 
Mkdir(std::string dir_path)48*33f37583SAndroid Build Coastguard Worker void Mkdir(std::string dir_path) {
49*33f37583SAndroid Build Coastguard Worker   if (access(dir_path.c_str(), F_OK) == 0)
50*33f37583SAndroid Build Coastguard Worker     return;
51*33f37583SAndroid Build Coastguard Worker   ASSERT_NE(-1, mkdir(dir_path.c_str(), 0755) == -1)
52*33f37583SAndroid Build Coastguard Worker       << "Failed to create a directory: " << dir_path;
53*33f37583SAndroid Build Coastguard Worker }
54*33f37583SAndroid Build Coastguard Worker 
WriteFile(std::string file_path,std::string content)55*33f37583SAndroid Build Coastguard Worker void WriteFile(std::string file_path, std::string content) {
56*33f37583SAndroid Build Coastguard Worker   ASSERT_TRUE(WriteStringToFile(content, file_path))
57*33f37583SAndroid Build Coastguard Worker       << "Failed to write a file: " << file_path;
58*33f37583SAndroid Build Coastguard Worker }
59*33f37583SAndroid Build Coastguard Worker 
60*33f37583SAndroid Build Coastguard Worker } // namespace
61*33f37583SAndroid Build Coastguard Worker 
62*33f37583SAndroid Build Coastguard Worker namespace apex {
63*33f37583SAndroid Build Coastguard Worker namespace proto {
64*33f37583SAndroid Build Coastguard Worker 
65*33f37583SAndroid Build Coastguard Worker // simple implementation for testing purpose
operator ==(const ApexManifest & lhs,const ApexManifest & rhs)66*33f37583SAndroid Build Coastguard Worker bool operator==(const ApexManifest &lhs, const ApexManifest &rhs) {
67*33f37583SAndroid Build Coastguard Worker   return lhs.SerializeAsString() == rhs.SerializeAsString();
68*33f37583SAndroid Build Coastguard Worker }
69*33f37583SAndroid Build Coastguard Worker 
70*33f37583SAndroid Build Coastguard Worker } // namespace proto
71*33f37583SAndroid Build Coastguard Worker } // namespace apex
72*33f37583SAndroid Build Coastguard Worker 
TEST(ApexUtil,GetActivePackages)73*33f37583SAndroid Build Coastguard Worker TEST(ApexUtil, GetActivePackages) {
74*33f37583SAndroid Build Coastguard Worker   TemporaryDir td;
75*33f37583SAndroid Build Coastguard Worker 
76*33f37583SAndroid Build Coastguard Worker   // com.android.foo: valid
77*33f37583SAndroid Build Coastguard Worker   auto foo_path = td.path + "/com.android.foo"s;
78*33f37583SAndroid Build Coastguard Worker   auto foo_manifest = CreateApexManifest("com.android.foo", 1);
79*33f37583SAndroid Build Coastguard Worker   Mkdir(foo_path);
80*33f37583SAndroid Build Coastguard Worker   WriteFile(foo_path + "/apex_manifest.pb", foo_manifest.SerializeAsString());
81*33f37583SAndroid Build Coastguard Worker 
82*33f37583SAndroid Build Coastguard Worker   // com.android.foo@1: ignore versioned
83*33f37583SAndroid Build Coastguard Worker   Mkdir(foo_path + "@1");
84*33f37583SAndroid Build Coastguard Worker   WriteFile(foo_path + "@1/apex_manifest.pb", foo_manifest.SerializeAsString());
85*33f37583SAndroid Build Coastguard Worker 
86*33f37583SAndroid Build Coastguard Worker   // com.android.baz: valid
87*33f37583SAndroid Build Coastguard Worker   auto bar_path = td.path + "/com.android.bar"s;
88*33f37583SAndroid Build Coastguard Worker   auto bar_manifest = CreateApexManifest("com.android.bar", 2);
89*33f37583SAndroid Build Coastguard Worker   Mkdir(bar_path);
90*33f37583SAndroid Build Coastguard Worker   WriteFile(bar_path + "/apex_manifest.pb", bar_manifest.SerializeAsString());
91*33f37583SAndroid Build Coastguard Worker 
92*33f37583SAndroid Build Coastguard Worker   // invalid: a directory without apex_manifest.pb
93*33f37583SAndroid Build Coastguard Worker   Mkdir(td.path + "/com.android.baz"s);
94*33f37583SAndroid Build Coastguard Worker   // invalid: a file
95*33f37583SAndroid Build Coastguard Worker   WriteFile(td.path + "/com.android.qux.apex"s, "");
96*33f37583SAndroid Build Coastguard Worker 
97*33f37583SAndroid Build Coastguard Worker   auto apexes = GetActivePackages(td.path);
98*33f37583SAndroid Build Coastguard Worker   ASSERT_EQ(2U, apexes.size());
99*33f37583SAndroid Build Coastguard Worker 
100*33f37583SAndroid Build Coastguard Worker   ASSERT_THAT(apexes, UnorderedElementsAre(Pair(foo_path, foo_manifest),
101*33f37583SAndroid Build Coastguard Worker                                            Pair(bar_path, bar_manifest)));
102*33f37583SAndroid Build Coastguard Worker }