blob: 2296585bae4558b19841db27098eec8c22022c03 [file] [log] [blame]
// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "syzygy/common/buffer_parser.h"
#include "gtest/gtest.h"
namespace common {
namespace {
const char kDataBuffer[] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17
};
size_t kDataBufferSize = sizeof(kDataBuffer);
} // namespace
TEST(BinaryBufferParser, ContainsSucceedsInBuffer) {
BinaryBufferParser parser(kDataBuffer, kDataBufferSize);
// Verify that Contains succeeds and returns the right pointer
// for ranges in the buffer.
for (size_t offset = 0; offset < kDataBufferSize; ++offset) {
for (size_t len = 0; len < kDataBufferSize - offset; ++len) {
ASSERT_TRUE(parser.Contains(offset, len));
}
}
}
TEST(BinaryBufferParser, ContainsFailsOnOutOfBuffer) {
BinaryBufferParser parser(kDataBuffer, kDataBufferSize);
// Verify that Contains fails for ranges not in the buffer.
for (size_t offset = 0; offset < kDataBufferSize + 1; ++offset) {
ASSERT_FALSE(parser.Contains(offset, kDataBufferSize - offset + 1));
}
}
TEST(BinaryBufferParser, ContainsFailsOnOverflow) {
BinaryBufferParser parser(kDataBuffer, kDataBufferSize);
// Verify that Contains fails for offsets that overflow the buffer.
for (size_t offset = 1; offset < kDataBufferSize; ++offset) {
ASSERT_FALSE(parser.Contains(-static_cast<int>(offset), offset));
ASSERT_FALSE(parser.Contains(offset, -static_cast<int>(offset)));
}
}
TEST(BinaryBufferParser, GetAtSucceedsInBuffer) {
BinaryBufferParser parser(kDataBuffer, kDataBufferSize);
// Verify that GetAt succeeds and returns the right pointer
// for ranges in the buffer.
for (size_t offset = 0; offset < kDataBufferSize; ++offset) {
for (size_t len = 0; len < kDataBufferSize - offset; ++len) {
const void* ptr = NULL;
ASSERT_TRUE(parser.GetAt(offset, len, &ptr));
ASSERT_TRUE(ptr != NULL);
if (len > 0) {
ASSERT_EQ(offset, *reinterpret_cast<const char*>(ptr));
}
}
}
}
TEST(BinaryBufferParser, GetAtTyped) {
struct Foo { int a; int b; };
static const char kBuffer[sizeof(Foo) + 1];
BinaryBufferParser parser(kBuffer, sizeof(kBuffer));
const Foo* foo = NULL;
ASSERT_TRUE(parser.GetAt(0, &foo));
ASSERT_EQ(parser.data(), foo);
ASSERT_TRUE(parser.GetAt(1, &foo));
ASSERT_FALSE(parser.GetAt(2, &foo));
}
template <class CharType>
void TestGetStringAt() {
static const CharType kBuf[] = {
L'a', L'b', L'c', L'd', L'\0',
L'e', L'f', L'g',
};
BinaryBufferParser parser(kBuf, sizeof(kBuf));
const CharType* str = NULL;
size_t len = 0;
ASSERT_TRUE(parser.GetStringAt(0, &str, &len));
ASSERT_EQ(4, len);
ASSERT_TRUE(parser.GetStringAt(4 * sizeof(kBuf[0]), &str, &len));
ASSERT_EQ(0, len);
ASSERT_FALSE(parser.GetStringAt(5 * sizeof(kBuf[0]), &str, &len));
ASSERT_FALSE(parser.GetStringAt(sizeof(kBuf), &str, &len));
}
TEST(BinaryBufferParser, GetStringAtSucceeds) {
TestGetStringAt<char>();
}
TEST(BinaryBufferParser, GetStringAtWideSucceeds) {
TestGetStringAt<wchar_t>();
}
TEST(BinaryBufferReader, IsAligned) {
BinaryBufferReader reader(kDataBuffer, kDataBufferSize);
EXPECT_TRUE(reader.IsAligned(1));
EXPECT_TRUE(reader.IsAligned(2));
EXPECT_TRUE(reader.IsAligned(4));
EXPECT_TRUE(reader.IsAligned(8));
EXPECT_TRUE(reader.Consume(1));
EXPECT_TRUE(reader.IsAligned(1));
EXPECT_FALSE(reader.IsAligned(2));
EXPECT_FALSE(reader.IsAligned(4));
EXPECT_FALSE(reader.IsAligned(8));
EXPECT_TRUE(reader.Consume(3));
EXPECT_TRUE(reader.IsAligned(1));
EXPECT_TRUE(reader.IsAligned(2));
EXPECT_TRUE(reader.IsAligned(4));
EXPECT_FALSE(reader.IsAligned(8));
}
TEST(BinaryBufferReader, Align) {
BinaryBufferReader reader(kDataBuffer, kDataBufferSize);
EXPECT_TRUE(reader.Align(1));
EXPECT_TRUE(reader.Align(2));
EXPECT_TRUE(reader.Align(4));
EXPECT_TRUE(reader.Align(8));
EXPECT_EQ(0, reader.pos());
EXPECT_TRUE(reader.Consume(1));
EXPECT_TRUE(reader.Align(2));
EXPECT_EQ(2, reader.pos());
EXPECT_TRUE(reader.Align(4));
EXPECT_EQ(4, reader.pos());
}
TEST(BinaryBufferReader, PeekSucceedsInBuffer) {
BinaryBufferReader reader(kDataBuffer, kDataBufferSize);
// Verify that Peek succeeds and returns the right pointer
// for ranges in the buffer.
for (size_t offset = 0; offset < kDataBufferSize; ++offset) {
for (size_t len = 0; len < kDataBufferSize - offset; ++len) {
const void* ptr = NULL;
reader.set_pos(offset);
ASSERT_TRUE(reader.Peek(len, &ptr));
ASSERT_TRUE(ptr != NULL);
if (len > 0) {
ASSERT_EQ(offset, *reinterpret_cast<const char*>(ptr));
}
}
}
}
TEST(BinaryBufferReader, Read) {
BinaryBufferReader reader(kDataBuffer, kDataBufferSize);
EXPECT_EQ(0, reader.pos());
const char* ptr = NULL;
EXPECT_TRUE(reader.Read(&ptr));
EXPECT_EQ(0, *ptr);
EXPECT_TRUE(reader.Read(2, &ptr));
EXPECT_EQ(1, *ptr);
EXPECT_TRUE(reader.Read(4, &ptr));
EXPECT_EQ(3, *ptr);
EXPECT_FALSE(reader.Read(kDataBufferSize, &ptr));
}
TEST(BinaryBufferReader, ReadCharString) {
static const char kBuf[] = {
L'a', L'b', L'c', L'd', L'\0', L'e', L'f', L'g', L'\0', L'h', L'i'
};
BinaryBufferReader reader(kBuf, sizeof(kBuf));
const char* str = NULL;
size_t str_len = 0;
ASSERT_TRUE(reader.ReadString(&str, &str_len));
EXPECT_STREQ("abcd", str);
ASSERT_TRUE(reader.ReadString(&str, &str_len));
EXPECT_STREQ("efg", str);
ASSERT_FALSE(reader.ReadString(&str, &str_len));
}
TEST(BinaryBufferReader, ReadWideString) {
static const wchar_t kBuf[] = {
L'a', L'b', L'c', L'd', L'\0', L'e', L'f', L'g', L'\0', L'h', L'i'
};
BinaryBufferReader reader(kBuf, sizeof(kBuf));
const wchar_t* str = NULL;
size_t str_len = 0;
ASSERT_TRUE(reader.ReadString(&str, &str_len));
EXPECT_STREQ(L"abcd", str);
ASSERT_TRUE(reader.ReadString(&str, &str_len));
EXPECT_STREQ(L"efg", str);
ASSERT_FALSE(reader.ReadString(&str, &str_len));
}
} // namespace common