xref: /aosp_15_r20/system/linkerconfig/modules/tests/apex_testbase.h (revision e5eeaa8e05bc25a862c0c861bda7c8a6bfb42dad)
1*e5eeaa8eSAndroid Build Coastguard Worker /*
2*e5eeaa8eSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*e5eeaa8eSAndroid Build Coastguard Worker  *
4*e5eeaa8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e5eeaa8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e5eeaa8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e5eeaa8eSAndroid Build Coastguard Worker  *
8*e5eeaa8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e5eeaa8eSAndroid Build Coastguard Worker  *
10*e5eeaa8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e5eeaa8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e5eeaa8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e5eeaa8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e5eeaa8eSAndroid Build Coastguard Worker  * limitations under the License.
15*e5eeaa8eSAndroid Build Coastguard Worker  */
16*e5eeaa8eSAndroid Build Coastguard Worker #pragma once
17*e5eeaa8eSAndroid Build Coastguard Worker 
18*e5eeaa8eSAndroid Build Coastguard Worker #include <filesystem>
19*e5eeaa8eSAndroid Build Coastguard Worker 
20*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/file.h>
21*e5eeaa8eSAndroid Build Coastguard Worker #include <apex_manifest.pb.h>
22*e5eeaa8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*e5eeaa8eSAndroid Build Coastguard Worker 
24*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/apex.h"
25*e5eeaa8eSAndroid Build Coastguard Worker 
26*e5eeaa8eSAndroid Build Coastguard Worker struct ApexTest : ::testing::Test {
27*e5eeaa8eSAndroid Build Coastguard Worker   TemporaryDir tmp_dir;
28*e5eeaa8eSAndroid Build Coastguard Worker   std::string root;
29*e5eeaa8eSAndroid Build Coastguard Worker 
SetUpApexTest30*e5eeaa8eSAndroid Build Coastguard Worker   void SetUp() override {
31*e5eeaa8eSAndroid Build Coastguard Worker     root = tmp_dir.path;
32*e5eeaa8eSAndroid Build Coastguard Worker   }
33*e5eeaa8eSAndroid Build Coastguard Worker 
PrepareApexApexTest34*e5eeaa8eSAndroid Build Coastguard Worker   void PrepareApex(const std::string& apex_name,
35*e5eeaa8eSAndroid Build Coastguard Worker                    const std::vector<std::string>& provide_libs,
36*e5eeaa8eSAndroid Build Coastguard Worker                    const std::vector<std::string>& require_libs,
37*e5eeaa8eSAndroid Build Coastguard Worker                    const std::vector<std::string>& jni_libs) {
38*e5eeaa8eSAndroid Build Coastguard Worker     ::apex::proto::ApexManifest manifest;
39*e5eeaa8eSAndroid Build Coastguard Worker     manifest.set_name(apex_name);
40*e5eeaa8eSAndroid Build Coastguard Worker     for (auto lib : provide_libs) {
41*e5eeaa8eSAndroid Build Coastguard Worker       manifest.add_providenativelibs(lib);
42*e5eeaa8eSAndroid Build Coastguard Worker     }
43*e5eeaa8eSAndroid Build Coastguard Worker     for (auto lib : require_libs) {
44*e5eeaa8eSAndroid Build Coastguard Worker       manifest.add_requirenativelibs(lib);
45*e5eeaa8eSAndroid Build Coastguard Worker     }
46*e5eeaa8eSAndroid Build Coastguard Worker     for (auto lib : jni_libs) {
47*e5eeaa8eSAndroid Build Coastguard Worker       manifest.add_jnilibs(lib);
48*e5eeaa8eSAndroid Build Coastguard Worker     }
49*e5eeaa8eSAndroid Build Coastguard Worker     WriteFile("/apex/" + apex_name + "/apex_manifest.pb",
50*e5eeaa8eSAndroid Build Coastguard Worker               manifest.SerializeAsString());
51*e5eeaa8eSAndroid Build Coastguard Worker   }
52*e5eeaa8eSAndroid Build Coastguard Worker 
MkdirApexTest53*e5eeaa8eSAndroid Build Coastguard Worker   void Mkdir(std::string dir_path) {
54*e5eeaa8eSAndroid Build Coastguard Worker     if (access(dir_path.c_str(), F_OK) == 0) return;
55*e5eeaa8eSAndroid Build Coastguard Worker     Mkdir(android::base::Dirname(dir_path));
56*e5eeaa8eSAndroid Build Coastguard Worker     ASSERT_NE(-1, mkdir(dir_path.c_str(), 0755) == -1)
57*e5eeaa8eSAndroid Build Coastguard Worker         << "Failed to create a directory: " << dir_path;
58*e5eeaa8eSAndroid Build Coastguard Worker   }
59*e5eeaa8eSAndroid Build Coastguard Worker 
WriteFileApexTest60*e5eeaa8eSAndroid Build Coastguard Worker   void WriteFile(const std::string& file, const std::string& content) {
61*e5eeaa8eSAndroid Build Coastguard Worker     std::string file_path = root + file;
62*e5eeaa8eSAndroid Build Coastguard Worker     Mkdir(::android::base::Dirname(file_path));
63*e5eeaa8eSAndroid Build Coastguard Worker     ASSERT_TRUE(::android::base::WriteStringToFile(content, file_path))
64*e5eeaa8eSAndroid Build Coastguard Worker         << "Failed to write a file: " << file_path;
65*e5eeaa8eSAndroid Build Coastguard Worker   }
66*e5eeaa8eSAndroid Build Coastguard Worker 
CreateApexInfoListApexTest67*e5eeaa8eSAndroid Build Coastguard Worker   void CreateApexInfoList() {
68*e5eeaa8eSAndroid Build Coastguard Worker     std::string content =
69*e5eeaa8eSAndroid Build Coastguard Worker         "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<apex-info-list>\n";
70*e5eeaa8eSAndroid Build Coastguard Worker     for (const auto& file :
71*e5eeaa8eSAndroid Build Coastguard Worker          std::filesystem::directory_iterator(root + "/apex")) {
72*e5eeaa8eSAndroid Build Coastguard Worker       if (!file.is_directory()) {
73*e5eeaa8eSAndroid Build Coastguard Worker         continue;
74*e5eeaa8eSAndroid Build Coastguard Worker       }
75*e5eeaa8eSAndroid Build Coastguard Worker 
76*e5eeaa8eSAndroid Build Coastguard Worker       content += "<apex-info moduleName=\"";
77*e5eeaa8eSAndroid Build Coastguard Worker       content += file.path().filename();
78*e5eeaa8eSAndroid Build Coastguard Worker       content += "\" modulePath=\"";
79*e5eeaa8eSAndroid Build Coastguard Worker       content += file.path().string();
80*e5eeaa8eSAndroid Build Coastguard Worker       content +=
81*e5eeaa8eSAndroid Build Coastguard Worker           "\" preinstalledModulePath=\"/test/path/1234\" isFactory=\"true\" "
82*e5eeaa8eSAndroid Build Coastguard Worker           "isActive=\"true\" />\n";
83*e5eeaa8eSAndroid Build Coastguard Worker     }
84*e5eeaa8eSAndroid Build Coastguard Worker     content += "</apex-info-list>";
85*e5eeaa8eSAndroid Build Coastguard Worker 
86*e5eeaa8eSAndroid Build Coastguard Worker     WriteFile("/apex/apex-info-list.xml", content);
87*e5eeaa8eSAndroid Build Coastguard Worker   }
88*e5eeaa8eSAndroid Build Coastguard Worker 
CreatePublicLibrariesTxtApexTest89*e5eeaa8eSAndroid Build Coastguard Worker   void CreatePublicLibrariesTxt() {
90*e5eeaa8eSAndroid Build Coastguard Worker     std::string content = "foo.so\nbar.so\nbaz.so";
91*e5eeaa8eSAndroid Build Coastguard Worker     WriteFile("/system/etc/public.libraries.txt", content);
92*e5eeaa8eSAndroid Build Coastguard Worker   }
93*e5eeaa8eSAndroid Build Coastguard Worker };