132 lines
3.9 KiB
C++
132 lines
3.9 KiB
C++
// Copyright 2017 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "components/zucchini/image_index.h"
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <numeric>
|
|
#include <vector>
|
|
|
|
#include "base/test/gtest_util.h"
|
|
#include "components/zucchini/image_utils.h"
|
|
#include "components/zucchini/test_disassembler.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace zucchini {
|
|
|
|
class ImageIndexTest : public testing::Test {
|
|
protected:
|
|
ImageIndexTest()
|
|
: buffer_(20),
|
|
image_index_(ConstBufferView(buffer_.data(), buffer_.size())) {
|
|
std::iota(buffer_.begin(), buffer_.end(), 0);
|
|
}
|
|
|
|
void InitializeWithDefaultTestData() {
|
|
TestDisassembler disasm({2, TypeTag(0), PoolTag(0)},
|
|
{{1, 0}, {8, 1}, {10, 2}},
|
|
{4, TypeTag(1), PoolTag(0)}, {{3, 3}},
|
|
{3, TypeTag(2), PoolTag(1)}, {{12, 4}, {17, 5}});
|
|
EXPECT_TRUE(image_index_.Initialize(&disasm));
|
|
}
|
|
|
|
std::vector<uint8_t> buffer_;
|
|
ImageIndex image_index_;
|
|
};
|
|
|
|
TEST_F(ImageIndexTest, TypeAndPool) {
|
|
TestDisassembler disasm({2, TypeTag(0), PoolTag(0)}, {},
|
|
{4, TypeTag(1), PoolTag(0)}, {},
|
|
{3, TypeTag(2), PoolTag(1)}, {});
|
|
EXPECT_TRUE(image_index_.Initialize(&disasm));
|
|
|
|
EXPECT_EQ(3U, image_index_.TypeCount());
|
|
EXPECT_EQ(2U, image_index_.PoolCount());
|
|
|
|
EXPECT_EQ(TypeTag(0), image_index_.refs(TypeTag(0)).type_tag());
|
|
EXPECT_EQ(TypeTag(1), image_index_.refs(TypeTag(1)).type_tag());
|
|
EXPECT_EQ(TypeTag(2), image_index_.refs(TypeTag(2)).type_tag());
|
|
|
|
EXPECT_EQ(PoolTag(0), image_index_.refs(TypeTag(0)).pool_tag());
|
|
EXPECT_EQ(PoolTag(0), image_index_.refs(TypeTag(1)).pool_tag());
|
|
EXPECT_EQ(PoolTag(1), image_index_.refs(TypeTag(2)).pool_tag());
|
|
}
|
|
|
|
TEST_F(ImageIndexTest, InvalidInitialize1) {
|
|
// Overlap within the same group.
|
|
TestDisassembler disasm({2, TypeTag(0), PoolTag(0)}, {{1, 0}, {2, 0}},
|
|
{4, TypeTag(1), PoolTag(0)}, {},
|
|
{3, TypeTag(2), PoolTag(1)}, {});
|
|
EXPECT_FALSE(image_index_.Initialize(&disasm));
|
|
}
|
|
|
|
TEST_F(ImageIndexTest, InvalidInitialize2) {
|
|
// Overlap across different readers.
|
|
TestDisassembler disasm({2, TypeTag(0), PoolTag(0)},
|
|
{{1, 0}, {8, 1}, {10, 2}},
|
|
{4, TypeTag(1), PoolTag(0)}, {{3, 3}},
|
|
{3, TypeTag(2), PoolTag(1)}, {{11, 0}});
|
|
EXPECT_FALSE(image_index_.Initialize(&disasm));
|
|
}
|
|
|
|
TEST_F(ImageIndexTest, LookupType) {
|
|
InitializeWithDefaultTestData();
|
|
|
|
std::vector<int> expected = {
|
|
-1, // raw
|
|
0, 0, // ref 0
|
|
1, 1, 1, 1, // ref 1
|
|
-1, // raw
|
|
0, 0, // ref 0
|
|
0, 0, // ref 0
|
|
2, 2, 2, // ref 2
|
|
-1, -1, // raw
|
|
2, 2, 2, // ref 2
|
|
};
|
|
|
|
for (offset_t i = 0; i < image_index_.size(); ++i)
|
|
EXPECT_EQ(TypeTag(expected[i]), image_index_.LookupType(i));
|
|
}
|
|
|
|
TEST_F(ImageIndexTest, IsToken) {
|
|
InitializeWithDefaultTestData();
|
|
|
|
std::vector<bool> expected = {
|
|
1, // raw
|
|
1, 0, // ref 0
|
|
1, 0, 0, 0, // ref 1
|
|
1, // raw
|
|
1, 0, // ref 0
|
|
1, 0, // ref 0
|
|
1, 0, 0, // ref 2
|
|
1, 1, // raw
|
|
1, 0, 0, // ref 2
|
|
};
|
|
|
|
for (offset_t i = 0; i < image_index_.size(); ++i)
|
|
EXPECT_EQ(expected[i], image_index_.IsToken(i));
|
|
}
|
|
|
|
TEST_F(ImageIndexTest, IsReference) {
|
|
InitializeWithDefaultTestData();
|
|
|
|
std::vector<bool> expected = {
|
|
0, // raw
|
|
1, 1, // ref 0
|
|
1, 1, 1, 1, // ref 1
|
|
0, // raw
|
|
1, 1, // ref 0
|
|
1, 1, // ref 0
|
|
1, 1, 1, // ref 2
|
|
0, 0, // raw
|
|
1, 1, 1, // ref 2
|
|
};
|
|
|
|
for (offset_t i = 0; i < image_index_.size(); ++i)
|
|
EXPECT_EQ(expected[i], image_index_.IsReference(i));
|
|
}
|
|
|
|
} // namespace zucchini
|