1 /*
2  * Copyright 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <trusty_unittest.h>
18 
19 #include "secure_storage_fake.h"
20 
21 namespace avb {
22 
TEST(AvbTest,BasicReadTest)23 TEST(AvbTest, BasicReadTest) {
24     uint32_t slot = 0;
25     uint64_t value = 0;
26     RollbackIndexRequest request(slot, value);
27     RollbackIndexResponse response;
28     AvbManager avb_manager(new SecureStorageFake);
29     avb_manager.ReadRollbackIndex(request, &response);
30     EXPECT_EQ(AvbError::kNone, response.get_error(), "Read failed");
31     EXPECT_EQ(1, response.get_value(), "Did not read expected value");
32 }
33 
TEST(AvbTest,ValidWriteTest)34 TEST(AvbTest, ValidWriteTest) {
35     uint32_t slot = 0;
36     uint64_t value = 2;  // Read always returns 1
37     RollbackIndexRequest request(slot, value);
38     RollbackIndexResponse response;
39     AvbManager avb_manager(new SecureStorageFake);
40     avb_manager.WriteRollbackIndex(request, &response);
41     EXPECT_EQ(AvbError::kNone, response.get_error(), "Write failed");
42     EXPECT_EQ(2, response.get_value(), "Did not write expected value");
43 }
44 
TEST(AvbTest,InvalidWriteTest)45 TEST(AvbTest, InvalidWriteTest) {
46     uint32_t slot = 0;
47     uint64_t value = 0;  // Read always returns 1
48     RollbackIndexRequest request(slot, value);
49     RollbackIndexResponse response;
50     AvbManager avb_manager(new SecureStorageFake);
51     avb_manager.WriteRollbackIndex(request, &response);
52     EXPECT_EQ(AvbError::kInvalid, response.get_error(),
53               "Allowed writing index value less than existing value");
54     EXPECT_EQ(1, response.get_value(),
55               "Did not read expected value after failed write");
56 }
57 
TEST(AvbTest,SlotUpperBitsSetTest)58 TEST(AvbTest, SlotUpperBitsSetTest) {
59     uint32_t slot = 0x00010000;
60     uint64_t value = 0;
61     RollbackIndexRequest request(slot, value);
62     RollbackIndexResponse response;
63     AvbManager avb_manager(new SecureStorageFake);
64     avb_manager.ReadRollbackIndex(request, &response);
65     EXPECT_EQ(AvbError::kInvalid, response.get_error(),
66               "Slot was not rejected");
67 }
68 
TEST(AvbTest,SlotMaxValueTest)69 TEST(AvbTest, SlotMaxValueTest) {
70     uint32_t slot = kRollbackSlotMax + 1;
71     uint64_t value = 0;
72     RollbackIndexRequest request(slot, value);
73     RollbackIndexResponse response;
74     AvbManager avb_manager(new SecureStorageFake);
75     avb_manager.ReadRollbackIndex(request, &response);
76     EXPECT_EQ(AvbError::kInvalid, response.get_error(),
77               "Failed to reject write to slot > max slot");
78 }
79 
TEST(AvbTest,SlotFlagTest)80 TEST(AvbTest, SlotFlagTest) {
81     uint32_t slot = 0x0000f000;
82     uint64_t value = 0;
83     RollbackIndexRequest request(slot, value);
84     RollbackIndexResponse response;
85     AvbManager avb_manager(new SecureStorageFake);
86     avb_manager.ReadRollbackIndex(request, &response);
87     EXPECT_EQ(AvbError::kNone, response.get_error(),
88               "Could not validate 0xf flag");
89 }
90 
91 }  // namespace avb
92 
main()93 int main() {
94     return RUN_ALL_TESTS() ? 0 : 1;
95 }
96