xref: /aosp_15_r20/frameworks/base/cmds/idmap2/tests/Idmap2BinaryTests.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker /*
18*d57664e9SAndroid Build Coastguard Worker  * The tests in this file operate on a higher level than the tests in the other
19*d57664e9SAndroid Build Coastguard Worker  * files. Here, all tests execute the idmap2 binary and only depend on
20*d57664e9SAndroid Build Coastguard Worker  * libidmap2 to verify the output of idmap2.
21*d57664e9SAndroid Build Coastguard Worker  */
22*d57664e9SAndroid Build Coastguard Worker #include <fcntl.h>
23*d57664e9SAndroid Build Coastguard Worker #include <sys/stat.h>
24*d57664e9SAndroid Build Coastguard Worker #include <sys/types.h>
25*d57664e9SAndroid Build Coastguard Worker #include <sys/wait.h>
26*d57664e9SAndroid Build Coastguard Worker #include <unistd.h>
27*d57664e9SAndroid Build Coastguard Worker 
28*d57664e9SAndroid Build Coastguard Worker #include <cerrno>
29*d57664e9SAndroid Build Coastguard Worker #include <cstdlib>
30*d57664e9SAndroid Build Coastguard Worker #include <cstring>  // strerror
31*d57664e9SAndroid Build Coastguard Worker #include <fstream>
32*d57664e9SAndroid Build Coastguard Worker #include <memory>
33*d57664e9SAndroid Build Coastguard Worker #include <sstream>
34*d57664e9SAndroid Build Coastguard Worker #include <string>
35*d57664e9SAndroid Build Coastguard Worker #include <vector>
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker #include "R.h"
38*d57664e9SAndroid Build Coastguard Worker #include "TestConstants.h"
39*d57664e9SAndroid Build Coastguard Worker #include "TestHelpers.h"
40*d57664e9SAndroid Build Coastguard Worker #include "androidfw/PosixUtils.h"
41*d57664e9SAndroid Build Coastguard Worker #include "gmock/gmock.h"
42*d57664e9SAndroid Build Coastguard Worker #include "gtest/gtest.h"
43*d57664e9SAndroid Build Coastguard Worker #include "idmap2/FileUtils.h"
44*d57664e9SAndroid Build Coastguard Worker #include "idmap2/Idmap.h"
45*d57664e9SAndroid Build Coastguard Worker #include "private/android_filesystem_config.h"
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker using ::android::base::StringPrintf;
48*d57664e9SAndroid Build Coastguard Worker using ::android::util::ExecuteBinary;
49*d57664e9SAndroid Build Coastguard Worker 
50*d57664e9SAndroid Build Coastguard Worker namespace android::idmap2 {
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker class Idmap2BinaryTests : public Idmap2Tests {};
53*d57664e9SAndroid Build Coastguard Worker 
54*d57664e9SAndroid Build Coastguard Worker namespace {
55*d57664e9SAndroid Build Coastguard Worker 
AssertIdmap(const Idmap & idmap,const std::string & target_apk_path,const std::string & overlay_apk_path)56*d57664e9SAndroid Build Coastguard Worker void AssertIdmap(const Idmap& idmap, const std::string& target_apk_path,
57*d57664e9SAndroid Build Coastguard Worker                  const std::string& overlay_apk_path) {
58*d57664e9SAndroid Build Coastguard Worker   // check that the idmap file looks reasonable (IdmapTests is responsible for
59*d57664e9SAndroid Build Coastguard Worker   // more in-depth verification)
60*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(idmap.GetHeader()->GetMagic(), kIdmapMagic);
61*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(idmap.GetHeader()->GetVersion(), kIdmapCurrentVersion);
62*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(idmap.GetHeader()->GetTargetPath(), target_apk_path);
63*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(idmap.GetHeader()->GetOverlayPath(), overlay_apk_path);
64*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(idmap.GetData().size(), 1U);
65*d57664e9SAndroid Build Coastguard Worker }
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker #define ASSERT_IDMAP(idmap_ref, target_apk_path, overlay_apk_path)                      \
68*d57664e9SAndroid Build Coastguard Worker   do {                                                                                  \
69*d57664e9SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(AssertIdmap(idmap_ref, target_apk_path, overlay_apk_path)); \
70*d57664e9SAndroid Build Coastguard Worker   } while (0)
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker #ifdef __ANDROID__
73*d57664e9SAndroid Build Coastguard Worker #define SKIP_TEST_IF_CANT_EXEC_IDMAP2           \
74*d57664e9SAndroid Build Coastguard Worker   do {                                          \
75*d57664e9SAndroid Build Coastguard Worker     const uid_t uid = getuid();                 \
76*d57664e9SAndroid Build Coastguard Worker     if (uid != AID_ROOT && uid != AID_SYSTEM) { \
77*d57664e9SAndroid Build Coastguard Worker       GTEST_SKIP();                             \
78*d57664e9SAndroid Build Coastguard Worker     }                                           \
79*d57664e9SAndroid Build Coastguard Worker   } while (0)
80*d57664e9SAndroid Build Coastguard Worker #else
81*d57664e9SAndroid Build Coastguard Worker #define SKIP_TEST_IF_CANT_EXEC_IDMAP2
82*d57664e9SAndroid Build Coastguard Worker #endif
83*d57664e9SAndroid Build Coastguard Worker 
84*d57664e9SAndroid Build Coastguard Worker }  // namespace
85*d57664e9SAndroid Build Coastguard Worker 
TEST_F(Idmap2BinaryTests,Create)86*d57664e9SAndroid Build Coastguard Worker TEST_F(Idmap2BinaryTests, Create) {
87*d57664e9SAndroid Build Coastguard Worker   SKIP_TEST_IF_CANT_EXEC_IDMAP2;
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker   // clang-format off
90*d57664e9SAndroid Build Coastguard Worker   auto result = ExecuteBinary({"idmap2",
91*d57664e9SAndroid Build Coastguard Worker                                "create",
92*d57664e9SAndroid Build Coastguard Worker                                "--target-apk-path", GetTargetApkPath(),
93*d57664e9SAndroid Build Coastguard Worker                                "--overlay-apk-path", GetOverlayApkPath(),
94*d57664e9SAndroid Build Coastguard Worker                                "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT,
95*d57664e9SAndroid Build Coastguard Worker                                "--idmap-path", GetIdmapPath()});
96*d57664e9SAndroid Build Coastguard Worker   // clang-format on
97*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
98*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
99*d57664e9SAndroid Build Coastguard Worker 
100*d57664e9SAndroid Build Coastguard Worker   struct stat st;
101*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(stat(GetIdmapPath().c_str(), &st), 0);
102*d57664e9SAndroid Build Coastguard Worker 
103*d57664e9SAndroid Build Coastguard Worker   std::ifstream fin(GetIdmapPath());
104*d57664e9SAndroid Build Coastguard Worker   const auto idmap = Idmap::FromBinaryStream(fin);
105*d57664e9SAndroid Build Coastguard Worker   fin.close();
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE(idmap);
108*d57664e9SAndroid Build Coastguard Worker   ASSERT_IDMAP(**idmap, GetTargetApkPath(), GetOverlayApkPath());
109*d57664e9SAndroid Build Coastguard Worker 
110*d57664e9SAndroid Build Coastguard Worker   unlink(GetIdmapPath().c_str());
111*d57664e9SAndroid Build Coastguard Worker }
112*d57664e9SAndroid Build Coastguard Worker 
TEST_F(Idmap2BinaryTests,Dump)113*d57664e9SAndroid Build Coastguard Worker TEST_F(Idmap2BinaryTests, Dump) {
114*d57664e9SAndroid Build Coastguard Worker   SKIP_TEST_IF_CANT_EXEC_IDMAP2;
115*d57664e9SAndroid Build Coastguard Worker 
116*d57664e9SAndroid Build Coastguard Worker   // clang-format off
117*d57664e9SAndroid Build Coastguard Worker   auto result = ExecuteBinary({"idmap2",
118*d57664e9SAndroid Build Coastguard Worker                                "create",
119*d57664e9SAndroid Build Coastguard Worker                                "--target-apk-path", GetTargetApkPath(),
120*d57664e9SAndroid Build Coastguard Worker                                "--overlay-apk-path", GetOverlayApkPath(),
121*d57664e9SAndroid Build Coastguard Worker                                "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT,
122*d57664e9SAndroid Build Coastguard Worker                                "--idmap-path", GetIdmapPath()});
123*d57664e9SAndroid Build Coastguard Worker   // clang-format on
124*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
125*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
126*d57664e9SAndroid Build Coastguard Worker 
127*d57664e9SAndroid Build Coastguard Worker   // clang-format off
128*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
129*d57664e9SAndroid Build Coastguard Worker                           "dump",
130*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath()});
131*d57664e9SAndroid Build Coastguard Worker   // clang-format on
132*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
133*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
134*d57664e9SAndroid Build Coastguard Worker 
135*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::integer::int1,
136*d57664e9SAndroid Build Coastguard Worker                                                  R::overlay::integer::int1)),
137*d57664e9SAndroid Build Coastguard Worker             std::string::npos)
138*d57664e9SAndroid Build Coastguard Worker       << result.stdout_str;
139*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str1,
140*d57664e9SAndroid Build Coastguard Worker                                                  R::overlay::string::str1)),
141*d57664e9SAndroid Build Coastguard Worker             std::string::npos)
142*d57664e9SAndroid Build Coastguard Worker       << result.stdout_str;
143*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str3,
144*d57664e9SAndroid Build Coastguard Worker                                                  R::overlay::string::str3)),
145*d57664e9SAndroid Build Coastguard Worker             std::string::npos)
146*d57664e9SAndroid Build Coastguard Worker       << result.stdout_str;
147*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str4,
148*d57664e9SAndroid Build Coastguard Worker                                                  R::overlay::string::str4)),
149*d57664e9SAndroid Build Coastguard Worker             std::string::npos)
150*d57664e9SAndroid Build Coastguard Worker       << result.stdout_str;
151*d57664e9SAndroid Build Coastguard Worker 
152*d57664e9SAndroid Build Coastguard Worker   // clang-format off
153*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
154*d57664e9SAndroid Build Coastguard Worker                           "dump",
155*d57664e9SAndroid Build Coastguard Worker                           "--verbose",
156*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath()});
157*d57664e9SAndroid Build Coastguard Worker   // clang-format on
158*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
159*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
160*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find("00000000: 504d4449  magic"), std::string::npos);
161*d57664e9SAndroid Build Coastguard Worker 
162*d57664e9SAndroid Build Coastguard Worker   // clang-format off
163*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
164*d57664e9SAndroid Build Coastguard Worker                           "dump",
165*d57664e9SAndroid Build Coastguard Worker                           "--verbose",
166*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetTestDataPath() + "/DOES-NOT-EXIST"});
167*d57664e9SAndroid Build Coastguard Worker   // clang-format on
168*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
169*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.status, EXIT_SUCCESS);
170*d57664e9SAndroid Build Coastguard Worker 
171*d57664e9SAndroid Build Coastguard Worker   unlink(GetIdmapPath().c_str());
172*d57664e9SAndroid Build Coastguard Worker }
173*d57664e9SAndroid Build Coastguard Worker 
TEST_F(Idmap2BinaryTests,Lookup)174*d57664e9SAndroid Build Coastguard Worker TEST_F(Idmap2BinaryTests, Lookup) {
175*d57664e9SAndroid Build Coastguard Worker   SKIP_TEST_IF_CANT_EXEC_IDMAP2;
176*d57664e9SAndroid Build Coastguard Worker 
177*d57664e9SAndroid Build Coastguard Worker   // clang-format off
178*d57664e9SAndroid Build Coastguard Worker   auto result = ExecuteBinary({"idmap2",
179*d57664e9SAndroid Build Coastguard Worker                                "create",
180*d57664e9SAndroid Build Coastguard Worker                                "--target-apk-path", GetTargetApkPath(),
181*d57664e9SAndroid Build Coastguard Worker                                "--overlay-apk-path", GetOverlayApkPath(),
182*d57664e9SAndroid Build Coastguard Worker                                "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT,
183*d57664e9SAndroid Build Coastguard Worker                                "--idmap-path", GetIdmapPath()});
184*d57664e9SAndroid Build Coastguard Worker   // clang-format on
185*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
186*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
187*d57664e9SAndroid Build Coastguard Worker 
188*d57664e9SAndroid Build Coastguard Worker   // clang-format off
189*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
190*d57664e9SAndroid Build Coastguard Worker                           "lookup",
191*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath(),
192*d57664e9SAndroid Build Coastguard Worker                           "--config", "",
193*d57664e9SAndroid Build Coastguard Worker                           "--resid", StringPrintf("0x%08x", R::target::string::str1)});
194*d57664e9SAndroid Build Coastguard Worker   // clang-format on
195*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
196*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
197*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find("overlay-1"), std::string::npos);
198*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.stdout_str.find("overlay-1-sv"), std::string::npos);
199*d57664e9SAndroid Build Coastguard Worker 
200*d57664e9SAndroid Build Coastguard Worker   // clang-format off
201*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
202*d57664e9SAndroid Build Coastguard Worker                           "lookup",
203*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath(),
204*d57664e9SAndroid Build Coastguard Worker                           "--config", "",
205*d57664e9SAndroid Build Coastguard Worker                           "--resid", "test.target:string/str1"});
206*d57664e9SAndroid Build Coastguard Worker   // clang-format on
207*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
208*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
209*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find("overlay-1"), std::string::npos);
210*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.stdout_str.find("overlay-1-sv"), std::string::npos);
211*d57664e9SAndroid Build Coastguard Worker 
212*d57664e9SAndroid Build Coastguard Worker   // clang-format off
213*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
214*d57664e9SAndroid Build Coastguard Worker                           "lookup",
215*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath(),
216*d57664e9SAndroid Build Coastguard Worker                           "--config", "sv",
217*d57664e9SAndroid Build Coastguard Worker                           "--resid", "test.target:string/str1"});
218*d57664e9SAndroid Build Coastguard Worker   // clang-format on
219*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
220*d57664e9SAndroid Build Coastguard Worker   ASSERT_EQ(result.status, EXIT_SUCCESS) << result.stderr_str;
221*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.stdout_str.find("overlay-1-sv"), std::string::npos);
222*d57664e9SAndroid Build Coastguard Worker 
223*d57664e9SAndroid Build Coastguard Worker   unlink(GetIdmapPath().c_str());
224*d57664e9SAndroid Build Coastguard Worker }
225*d57664e9SAndroid Build Coastguard Worker 
TEST_F(Idmap2BinaryTests,InvalidCommandLineOptions)226*d57664e9SAndroid Build Coastguard Worker TEST_F(Idmap2BinaryTests, InvalidCommandLineOptions) {
227*d57664e9SAndroid Build Coastguard Worker   SKIP_TEST_IF_CANT_EXEC_IDMAP2;
228*d57664e9SAndroid Build Coastguard Worker 
229*d57664e9SAndroid Build Coastguard Worker   const std::string invalid_target_apk_path = GetTestDataPath() + "/DOES-NOT-EXIST";
230*d57664e9SAndroid Build Coastguard Worker 
231*d57664e9SAndroid Build Coastguard Worker   // missing mandatory options
232*d57664e9SAndroid Build Coastguard Worker   // clang-format off
233*d57664e9SAndroid Build Coastguard Worker   auto result = ExecuteBinary({"idmap2",
234*d57664e9SAndroid Build Coastguard Worker                                "create"});
235*d57664e9SAndroid Build Coastguard Worker   // clang-format on
236*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
237*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.status, EXIT_SUCCESS);
238*d57664e9SAndroid Build Coastguard Worker 
239*d57664e9SAndroid Build Coastguard Worker   // missing argument to option
240*d57664e9SAndroid Build Coastguard Worker   // clang-format off
241*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
242*d57664e9SAndroid Build Coastguard Worker                           "create",
243*d57664e9SAndroid Build Coastguard Worker                           "--target-apk-path", GetTargetApkPath(),
244*d57664e9SAndroid Build Coastguard Worker                           "--overlay-apk-path", GetOverlayApkPath(),
245*d57664e9SAndroid Build Coastguard Worker                           "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT,
246*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path"});
247*d57664e9SAndroid Build Coastguard Worker   // clang-format on
248*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
249*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.status, EXIT_SUCCESS);
250*d57664e9SAndroid Build Coastguard Worker 
251*d57664e9SAndroid Build Coastguard Worker   // invalid target apk path
252*d57664e9SAndroid Build Coastguard Worker   // clang-format off
253*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
254*d57664e9SAndroid Build Coastguard Worker                           "create",
255*d57664e9SAndroid Build Coastguard Worker                           "--target-apk-path", invalid_target_apk_path,
256*d57664e9SAndroid Build Coastguard Worker                           "--overlay-apk-path", GetOverlayApkPath(),
257*d57664e9SAndroid Build Coastguard Worker                           "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT,
258*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath()});
259*d57664e9SAndroid Build Coastguard Worker   // clang-format on
260*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
261*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.status, EXIT_SUCCESS);
262*d57664e9SAndroid Build Coastguard Worker 
263*d57664e9SAndroid Build Coastguard Worker   // unknown policy
264*d57664e9SAndroid Build Coastguard Worker   // clang-format off
265*d57664e9SAndroid Build Coastguard Worker   result = ExecuteBinary({"idmap2",
266*d57664e9SAndroid Build Coastguard Worker                           "create",
267*d57664e9SAndroid Build Coastguard Worker                           "--target-apk-path", GetTargetApkPath(),
268*d57664e9SAndroid Build Coastguard Worker                           "--overlay-apk-path", GetOverlayApkPath(),
269*d57664e9SAndroid Build Coastguard Worker                           "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT,
270*d57664e9SAndroid Build Coastguard Worker                           "--idmap-path", GetIdmapPath(),
271*d57664e9SAndroid Build Coastguard Worker                           "--policy", "this-does-not-exist"});
272*d57664e9SAndroid Build Coastguard Worker   // clang-format on
273*d57664e9SAndroid Build Coastguard Worker   ASSERT_TRUE((bool)result);
274*d57664e9SAndroid Build Coastguard Worker   ASSERT_NE(result.status, EXIT_SUCCESS);
275*d57664e9SAndroid Build Coastguard Worker }
276*d57664e9SAndroid Build Coastguard Worker 
277*d57664e9SAndroid Build Coastguard Worker }  // namespace android::idmap2
278