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 };