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