xref: /aosp_15_r20/system/extras/mtectrl/mtectrl_test.cc (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker  *
4*288bf522SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker  *
8*288bf522SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker  *
10*288bf522SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker  * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker  */
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker #include <stdio.h>
18*288bf522SAndroid Build Coastguard Worker 
19*288bf522SAndroid Build Coastguard Worker #include <gmock/gmock.h>
20*288bf522SAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*288bf522SAndroid Build Coastguard Worker 
22*288bf522SAndroid Build Coastguard Worker #include <android-base/file.h>
23*288bf522SAndroid Build Coastguard Worker #include <android-base/logging.h>
24*288bf522SAndroid Build Coastguard Worker #include <android-base/properties.h>
25*288bf522SAndroid Build Coastguard Worker #include <bootloader_message/bootloader_message.h>
26*288bf522SAndroid Build Coastguard Worker #include <string_view>
27*288bf522SAndroid Build Coastguard Worker 
28*288bf522SAndroid Build Coastguard Worker namespace {
29*288bf522SAndroid Build Coastguard Worker using ::testing::StartsWith;
30*288bf522SAndroid Build Coastguard Worker 
mtectrl(std::string_view arg)31*288bf522SAndroid Build Coastguard Worker int mtectrl(std::string_view arg) {
32*288bf522SAndroid Build Coastguard Worker   std::string cmd = "mtectrl -t /data/local/tmp/misc_memtag ";
33*288bf522SAndroid Build Coastguard Worker   cmd += arg;
34*288bf522SAndroid Build Coastguard Worker   return system(cmd.c_str());
35*288bf522SAndroid Build Coastguard Worker }
36*288bf522SAndroid Build Coastguard Worker 
RunMteCtrl()37*288bf522SAndroid Build Coastguard Worker int RunMteCtrl() {
38*288bf522SAndroid Build Coastguard Worker   CHECK(android::base::GetIntProperty("arm64.memtag.test_bootctl_loaded", 0) == 1);
39*288bf522SAndroid Build Coastguard Worker   std::string arg = android::base::GetProperty("arm64.memtag.test_bootctl", "none");
40*288bf522SAndroid Build Coastguard Worker   arg += " ";
41*288bf522SAndroid Build Coastguard Worker   arg += android::base::GetProperty("arm64.memtag.test_bootctl_override", "default");
42*288bf522SAndroid Build Coastguard Worker   return mtectrl(arg);
43*288bf522SAndroid Build Coastguard Worker }
44*288bf522SAndroid Build Coastguard Worker 
Boot(misc_memtag_message m)45*288bf522SAndroid Build Coastguard Worker void Boot(misc_memtag_message m) {
46*288bf522SAndroid Build Coastguard Worker   std::string m_str(reinterpret_cast<char*>(&m), sizeof(m));
47*288bf522SAndroid Build Coastguard Worker   android::base::WriteStringToFile(m_str, "/data/local/tmp/misc_memtag");
48*288bf522SAndroid Build Coastguard Worker   mtectrl("-s arm64.memtag.test_bootctl -f arm64.memtag.test_bootctl_loaded");
49*288bf522SAndroid Build Coastguard Worker   // arm64.memtag.test_bootctl got updated, so we trigger ourselves.
50*288bf522SAndroid Build Coastguard Worker   RunMteCtrl();
51*288bf522SAndroid Build Coastguard Worker }
52*288bf522SAndroid Build Coastguard Worker 
Reboot()53*288bf522SAndroid Build Coastguard Worker void Reboot() {
54*288bf522SAndroid Build Coastguard Worker   android::base::SetProperty("arm64.memtag.test_bootctl", "INVALID");
55*288bf522SAndroid Build Coastguard Worker   android::base::SetProperty("arm64.memtag.test_bootctl_loaded", "0");
56*288bf522SAndroid Build Coastguard Worker   std::string m_str;
57*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(android::base::ReadFileToString("/data/local/tmp/misc_memtag", &m_str));
58*288bf522SAndroid Build Coastguard Worker   misc_memtag_message m;
59*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(m_str.size(), sizeof(m));
60*288bf522SAndroid Build Coastguard Worker   memcpy(&m, m_str.c_str(), sizeof(m));
61*288bf522SAndroid Build Coastguard Worker   m.memtag_mode &= ~MISC_MEMTAG_MODE_MEMTAG_ONCE;
62*288bf522SAndroid Build Coastguard Worker   Boot(m);
63*288bf522SAndroid Build Coastguard Worker }
64*288bf522SAndroid Build Coastguard Worker 
SetMemtagProp(const std::string & s)65*288bf522SAndroid Build Coastguard Worker void SetMemtagProp(const std::string& s) {
66*288bf522SAndroid Build Coastguard Worker   android::base::SetProperty("arm64.memtag.test_bootctl", s);
67*288bf522SAndroid Build Coastguard Worker   RunMteCtrl();
68*288bf522SAndroid Build Coastguard Worker }
69*288bf522SAndroid Build Coastguard Worker 
SetOverrideProp(const std::string & s)70*288bf522SAndroid Build Coastguard Worker void SetOverrideProp(const std::string& s) {
71*288bf522SAndroid Build Coastguard Worker   android::base::SetProperty("arm64.memtag.test_bootctl_override", s);
72*288bf522SAndroid Build Coastguard Worker   RunMteCtrl();
73*288bf522SAndroid Build Coastguard Worker }
74*288bf522SAndroid Build Coastguard Worker 
GetMisc()75*288bf522SAndroid Build Coastguard Worker std::string GetMisc() {
76*288bf522SAndroid Build Coastguard Worker   std::string data;
77*288bf522SAndroid Build Coastguard Worker   CHECK(android::base::ReadFileToString("/data/local/tmp/misc_memtag", &data, false));
78*288bf522SAndroid Build Coastguard Worker   return data;
79*288bf522SAndroid Build Coastguard Worker }
80*288bf522SAndroid Build Coastguard Worker 
TestProperty()81*288bf522SAndroid Build Coastguard Worker std::string TestProperty() {
82*288bf522SAndroid Build Coastguard Worker   return android::base::GetProperty("arm64.memtag.test_bootctl", "");
83*288bf522SAndroid Build Coastguard Worker }
TestFlag()84*288bf522SAndroid Build Coastguard Worker std::string TestFlag() {
85*288bf522SAndroid Build Coastguard Worker   return android::base::GetProperty("arm64.memtag.test_bootctl_loaded", "");
86*288bf522SAndroid Build Coastguard Worker }
87*288bf522SAndroid Build Coastguard Worker }  // namespace
88*288bf522SAndroid Build Coastguard Worker 
89*288bf522SAndroid Build Coastguard Worker class MteCtrlTest : public ::testing::Test {
SetUp()90*288bf522SAndroid Build Coastguard Worker   void SetUp() override {
91*288bf522SAndroid Build Coastguard Worker     // Empty fake misc partition.
92*288bf522SAndroid Build Coastguard Worker     int fd = creat("/data/local/tmp/misc_memtag", 0600);
93*288bf522SAndroid Build Coastguard Worker     CHECK(fd != -1);
94*288bf522SAndroid Build Coastguard Worker     CHECK(ftruncate(fd, sizeof(misc_memtag_message)) != -1);
95*288bf522SAndroid Build Coastguard Worker     close(fd);
96*288bf522SAndroid Build Coastguard Worker     android::base::SetProperty("arm64.memtag.test_bootctl", "INVALID");
97*288bf522SAndroid Build Coastguard Worker     android::base::SetProperty("arm64.memtag.test_bootctl_override", "");
98*288bf522SAndroid Build Coastguard Worker     android::base::SetProperty("arm64.memtag.test_bootctl_loaded", "0");
99*288bf522SAndroid Build Coastguard Worker   }
TearDown()100*288bf522SAndroid Build Coastguard Worker   void TearDown() override {
101*288bf522SAndroid Build Coastguard Worker     CHECK(unlink("/data/local/tmp/misc_memtag") == 0);
102*288bf522SAndroid Build Coastguard Worker   }
103*288bf522SAndroid Build Coastguard Worker };
104*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,invalid)105*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, invalid) {
106*288bf522SAndroid Build Coastguard Worker   EXPECT_NE(mtectrl("memtag-invalid"), 0);
107*288bf522SAndroid Build Coastguard Worker   EXPECT_NE(mtectrl("memtag override-invalid"), 0);
108*288bf522SAndroid Build Coastguard Worker }
109*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_once)110*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_once) {
111*288bf522SAndroid Build Coastguard Worker   Boot({});
112*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-once");
113*288bf522SAndroid Build Coastguard Worker   EXPECT_THAT(GetMisc(), StartsWith("\x01\x5a\xfe\xfe\x5a\x02"));
114*288bf522SAndroid Build Coastguard Worker }
115*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_once_kernel)116*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_once_kernel) {
117*288bf522SAndroid Build Coastguard Worker   Boot({});
118*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-once,memtag-kernel");
119*288bf522SAndroid Build Coastguard Worker   EXPECT_THAT(GetMisc(), StartsWith("\x01\x5a\xfe\xfe\x5a\x06"));
120*288bf522SAndroid Build Coastguard Worker }
121*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,read_memtag)122*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, read_memtag) {
123*288bf522SAndroid Build Coastguard Worker   Boot({});
124*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag");
125*288bf522SAndroid Build Coastguard Worker   Reboot();
126*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
127*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestFlag(), "1");
128*288bf522SAndroid Build Coastguard Worker }
129*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,read_invalid_memtag_message)130*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, read_invalid_memtag_message) {
131*288bf522SAndroid Build Coastguard Worker   misc_memtag_message m = {.version = 1, .magic = 0xffff, .memtag_mode = MISC_MEMTAG_MODE_MEMTAG};
132*288bf522SAndroid Build Coastguard Worker   Boot(m);
133*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
134*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestFlag(), "1");
135*288bf522SAndroid Build Coastguard Worker }
136*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,read_invalid_memtag_mode)137*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, read_invalid_memtag_mode) {
138*288bf522SAndroid Build Coastguard Worker   misc_memtag_message m = {.version = MISC_MEMTAG_MESSAGE_VERSION,
139*288bf522SAndroid Build Coastguard Worker                            .magic = MISC_MEMTAG_MAGIC_HEADER,
140*288bf522SAndroid Build Coastguard Worker                            .memtag_mode = MISC_MEMTAG_MODE_MEMTAG | 1u << 31};
141*288bf522SAndroid Build Coastguard Worker   Boot(m);
142*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
143*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestFlag(), "1");
144*288bf522SAndroid Build Coastguard Worker }
145*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_off)146*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_off) {
147*288bf522SAndroid Build Coastguard Worker   Boot({});
148*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag,memtag-once");
149*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
150*288bf522SAndroid Build Coastguard Worker   Reboot();
151*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off,forced");
152*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
153*288bf522SAndroid Build Coastguard Worker   Reboot();
154*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
155*288bf522SAndroid Build Coastguard Worker }
156*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_off_none)157*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_off_none) {
158*288bf522SAndroid Build Coastguard Worker   Boot({});
159*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("none");
160*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
161*288bf522SAndroid Build Coastguard Worker   Reboot();
162*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off,forced");
163*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
164*288bf522SAndroid Build Coastguard Worker   Reboot();
165*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
166*288bf522SAndroid Build Coastguard Worker }
167*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_off_and_on)168*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_off_and_on) {
169*288bf522SAndroid Build Coastguard Worker   Boot({});
170*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag,memtag-once");
171*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
172*288bf522SAndroid Build Coastguard Worker   Reboot();
173*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off,forced");
174*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
175*288bf522SAndroid Build Coastguard Worker   Reboot();
176*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
177*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
178*288bf522SAndroid Build Coastguard Worker   Reboot();
179*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag,forced");
180*288bf522SAndroid Build Coastguard Worker }
181*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_off_already)182*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_off_already) {
183*288bf522SAndroid Build Coastguard Worker   Boot({});
184*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-off,memtag-once");
185*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
186*288bf522SAndroid Build Coastguard Worker   Reboot();
187*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off");
188*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
189*288bf522SAndroid Build Coastguard Worker   Reboot();
190*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off");
191*288bf522SAndroid Build Coastguard Worker }
192*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_off_and_on_already)193*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_off_and_on_already) {
194*288bf522SAndroid Build Coastguard Worker   Boot({});
195*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-off,memtag-once");
196*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
197*288bf522SAndroid Build Coastguard Worker   Reboot();
198*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off");
199*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
200*288bf522SAndroid Build Coastguard Worker   Reboot();
201*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off");
202*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
203*288bf522SAndroid Build Coastguard Worker   Reboot();
204*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag,forced");
205*288bf522SAndroid Build Coastguard Worker }
206*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_on)207*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_on) {
208*288bf522SAndroid Build Coastguard Worker   Boot({});
209*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-once");
210*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
211*288bf522SAndroid Build Coastguard Worker   Reboot();
212*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag,forced");
213*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
214*288bf522SAndroid Build Coastguard Worker   Reboot();
215*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
216*288bf522SAndroid Build Coastguard Worker }
217*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_on_none)218*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_on_none) {
219*288bf522SAndroid Build Coastguard Worker   Boot({});
220*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("none");
221*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
222*288bf522SAndroid Build Coastguard Worker   Reboot();
223*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag,forced");
224*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
225*288bf522SAndroid Build Coastguard Worker   Reboot();
226*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
227*288bf522SAndroid Build Coastguard Worker }
228*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_on_and_off)229*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_on_and_off) {
230*288bf522SAndroid Build Coastguard Worker   Boot({});
231*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-once");
232*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
233*288bf522SAndroid Build Coastguard Worker   Reboot();
234*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag,forced");
235*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
236*288bf522SAndroid Build Coastguard Worker   Reboot();
237*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
238*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
239*288bf522SAndroid Build Coastguard Worker   Reboot();
240*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off,forced");
241*288bf522SAndroid Build Coastguard Worker }
242*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_on_already)243*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_on_already) {
244*288bf522SAndroid Build Coastguard Worker   Boot({});
245*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag,memtag-once");
246*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
247*288bf522SAndroid Build Coastguard Worker   Reboot();
248*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
249*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
250*288bf522SAndroid Build Coastguard Worker   Reboot();
251*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
252*288bf522SAndroid Build Coastguard Worker }
253*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,set_read_force_on_and_off_already)254*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, set_read_force_on_and_off_already) {
255*288bf522SAndroid Build Coastguard Worker   Boot({});
256*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag,memtag-once");
257*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
258*288bf522SAndroid Build Coastguard Worker   Reboot();
259*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
260*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
261*288bf522SAndroid Build Coastguard Worker   Reboot();
262*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
263*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
264*288bf522SAndroid Build Coastguard Worker   Reboot();
265*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off,forced");
266*288bf522SAndroid Build Coastguard Worker }
267*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,override)268*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, override) {
269*288bf522SAndroid Build Coastguard Worker   Boot({});
270*288bf522SAndroid Build Coastguard Worker   SetMemtagProp(("memtag"));
271*288bf522SAndroid Build Coastguard Worker   SetMemtagProp(("memtag-once"));
272*288bf522SAndroid Build Coastguard Worker   EXPECT_THAT(GetMisc(), StartsWith("\x01\x5a\xfe\xfe\x5a\x02"));
273*288bf522SAndroid Build Coastguard Worker }
274*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,read_empty)275*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, read_empty) {
276*288bf522SAndroid Build Coastguard Worker   Boot({});
277*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
278*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestFlag(), "1");
279*288bf522SAndroid Build Coastguard Worker }
280*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,force_off_invalid_mode)281*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, force_off_invalid_mode) {
282*288bf522SAndroid Build Coastguard Worker   Boot({});
283*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-invalid");
284*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_off");
285*288bf522SAndroid Build Coastguard Worker   EXPECT_THAT(GetMisc(), StartsWith("\x01\x5a\xfe\xfe\x5a\x30"));
286*288bf522SAndroid Build Coastguard Worker   Reboot();
287*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag-off,forced");
288*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
289*288bf522SAndroid Build Coastguard Worker   Reboot();
290*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
291*288bf522SAndroid Build Coastguard Worker }
292*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,force_on_invalid_mode)293*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, force_on_invalid_mode) {
294*288bf522SAndroid Build Coastguard Worker   Boot({});
295*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag-invalid");
296*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_on");
297*288bf522SAndroid Build Coastguard Worker   EXPECT_THAT(GetMisc(), StartsWith("\x01\x5a\xfe\xfe\x5a\x21"));
298*288bf522SAndroid Build Coastguard Worker   Reboot();
299*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag,forced");
300*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
301*288bf522SAndroid Build Coastguard Worker   Reboot();
302*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "none");
303*288bf522SAndroid Build Coastguard Worker }
304*288bf522SAndroid Build Coastguard Worker 
TEST_F(MteCtrlTest,mode_invalid_override)305*288bf522SAndroid Build Coastguard Worker TEST_F(MteCtrlTest, mode_invalid_override) {
306*288bf522SAndroid Build Coastguard Worker   Boot({});
307*288bf522SAndroid Build Coastguard Worker   SetMemtagProp("memtag");
308*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("force_invalid");
309*288bf522SAndroid Build Coastguard Worker   EXPECT_THAT(GetMisc(), StartsWith("\x01\x5a\xfe\xfe\x5a\x01"));
310*288bf522SAndroid Build Coastguard Worker   Reboot();
311*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
312*288bf522SAndroid Build Coastguard Worker   SetOverrideProp("default");
313*288bf522SAndroid Build Coastguard Worker   Reboot();
314*288bf522SAndroid Build Coastguard Worker   EXPECT_EQ(TestProperty(), "memtag");
315*288bf522SAndroid Build Coastguard Worker }
316