xref: /aosp_15_r20/external/zucchini/image_index_unittest.cc (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/zucchini/image_index.h"
6 
7 #include <stddef.h>
8 
9 #include <numeric>
10 #include <vector>
11 
12 #include "base/test/gtest_util.h"
13 #include "components/zucchini/image_utils.h"
14 #include "components/zucchini/test_disassembler.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 namespace zucchini {
18 
19 class ImageIndexTest : public testing::Test {
20  protected:
ImageIndexTest()21   ImageIndexTest()
22       : buffer_(20),
23         image_index_(ConstBufferView(buffer_.data(), buffer_.size())) {
24     std::iota(buffer_.begin(), buffer_.end(), 0);
25   }
26 
InitializeWithDefaultTestData()27   void InitializeWithDefaultTestData() {
28     TestDisassembler disasm({2, TypeTag(0), PoolTag(0)},
29                             {{1, 0}, {8, 1}, {10, 2}},
30                             {4, TypeTag(1), PoolTag(0)}, {{3, 3}},
31                             {3, TypeTag(2), PoolTag(1)}, {{12, 4}, {17, 5}});
32     EXPECT_TRUE(image_index_.Initialize(&disasm));
33   }
34 
35   std::vector<uint8_t> buffer_;
36   ImageIndex image_index_;
37 };
38 
TEST_F(ImageIndexTest,TypeAndPool)39 TEST_F(ImageIndexTest, TypeAndPool) {
40   TestDisassembler disasm({2, TypeTag(0), PoolTag(0)}, {},
41                           {4, TypeTag(1), PoolTag(0)}, {},
42                           {3, TypeTag(2), PoolTag(1)}, {});
43   EXPECT_TRUE(image_index_.Initialize(&disasm));
44 
45   EXPECT_EQ(3U, image_index_.TypeCount());
46   EXPECT_EQ(2U, image_index_.PoolCount());
47 
48   EXPECT_EQ(TypeTag(0), image_index_.refs(TypeTag(0)).type_tag());
49   EXPECT_EQ(TypeTag(1), image_index_.refs(TypeTag(1)).type_tag());
50   EXPECT_EQ(TypeTag(2), image_index_.refs(TypeTag(2)).type_tag());
51 
52   EXPECT_EQ(PoolTag(0), image_index_.refs(TypeTag(0)).pool_tag());
53   EXPECT_EQ(PoolTag(0), image_index_.refs(TypeTag(1)).pool_tag());
54   EXPECT_EQ(PoolTag(1), image_index_.refs(TypeTag(2)).pool_tag());
55 }
56 
TEST_F(ImageIndexTest,InvalidInitialize1)57 TEST_F(ImageIndexTest, InvalidInitialize1) {
58   // Overlap within the same group.
59   TestDisassembler disasm({2, TypeTag(0), PoolTag(0)}, {{1, 0}, {2, 0}},
60                           {4, TypeTag(1), PoolTag(0)}, {},
61                           {3, TypeTag(2), PoolTag(1)}, {});
62   EXPECT_FALSE(image_index_.Initialize(&disasm));
63 }
64 
TEST_F(ImageIndexTest,InvalidInitialize2)65 TEST_F(ImageIndexTest, InvalidInitialize2) {
66   // Overlap across different readers.
67   TestDisassembler disasm({2, TypeTag(0), PoolTag(0)},
68                           {{1, 0}, {8, 1}, {10, 2}},
69                           {4, TypeTag(1), PoolTag(0)}, {{3, 3}},
70                           {3, TypeTag(2), PoolTag(1)}, {{11, 0}});
71   EXPECT_FALSE(image_index_.Initialize(&disasm));
72 }
73 
TEST_F(ImageIndexTest,LookupType)74 TEST_F(ImageIndexTest, LookupType) {
75   InitializeWithDefaultTestData();
76 
77   std::vector<int> expected = {
78       -1,            // raw
79       0,  0,         // ref 0
80       1,  1,  1, 1,  // ref 1
81       -1,            // raw
82       0,  0,         // ref 0
83       0,  0,         // ref 0
84       2,  2,  2,     // ref 2
85       -1, -1,        // raw
86       2,  2,  2,     // ref 2
87   };
88 
89   for (offset_t i = 0; i < image_index_.size(); ++i)
90     EXPECT_EQ(TypeTag(expected[i]), image_index_.LookupType(i));
91 }
92 
TEST_F(ImageIndexTest,IsToken)93 TEST_F(ImageIndexTest, IsToken) {
94   InitializeWithDefaultTestData();
95 
96   std::vector<bool> expected = {
97       1,           // raw
98       1, 0,        // ref 0
99       1, 0, 0, 0,  // ref 1
100       1,           // raw
101       1, 0,        // ref 0
102       1, 0,        // ref 0
103       1, 0, 0,     // ref 2
104       1, 1,        // raw
105       1, 0, 0,     // ref 2
106   };
107 
108   for (offset_t i = 0; i < image_index_.size(); ++i)
109     EXPECT_EQ(expected[i], image_index_.IsToken(i));
110 }
111 
TEST_F(ImageIndexTest,IsReference)112 TEST_F(ImageIndexTest, IsReference) {
113   InitializeWithDefaultTestData();
114 
115   std::vector<bool> expected = {
116       0,           // raw
117       1, 1,        // ref 0
118       1, 1, 1, 1,  // ref 1
119       0,           // raw
120       1, 1,        // ref 0
121       1, 1,        // ref 0
122       1, 1, 1,     // ref 2
123       0, 0,        // raw
124       1, 1, 1,     // ref 2
125   };
126 
127   for (offset_t i = 0; i < image_index_.size(); ++i)
128     EXPECT_EQ(expected[i], image_index_.IsReference(i));
129 }
130 
131 }  // namespace zucchini
132