130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h>
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h"
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/memory_byte_array.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/growable_memory_byte_array.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace byte_array_test {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int32_t BYTE_ARRAY_SIZES[] =
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    {1, 7, 127, 128, 129, 255, 256, 257, 666, 1023, 10000, 0xffff, 0x10000};
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid FillTestByteArray(ByteArray* ba, int32_t size) {
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (int32_t i = 0; i < size; ++i) {
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ba->Put(i, (byte_t)(i % 256));
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid ReadByteArrayWithBuffer(ByteArray* ba, ByteVector* buffer, ByteVector* b) {
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b->resize(ba->Length());
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t index = 0;
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  while (index < ba->Length()) {
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t bytes_read = ba->Get(index, buffer);
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    std::copy(buffer->begin(), buffer->begin() + bytes_read,
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun              b->begin() + index);
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    index += bytes_read;
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid ReadByteArrayWithSlidingWindow(ByteArray* ba, int window_size,
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                    ByteVector* b) {
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b->resize(ba->Length());
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t index = 0;
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t actual_window_size = window_size;
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  while (index < ba->Length()) {
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    actual_window_size =
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        std::min<int32_t>(actual_window_size, b->size() - index);
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t bytes_read = ba->Get(index, &((*b)[0]), index, actual_window_size);
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    index += bytes_read;
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool ReadComparison(ByteArray* ba1, ByteArray* ba2) {
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // single byte reads
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (int i = 0; i < ba1->Length(); ++i) {
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_EQ(ba1->Get(i), ba2->Get(i));
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b1, b2;
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // buffer reads
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int increments = std::max<int32_t>(ba1->Length() / 11, 1);
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (int buffer_size = 1; buffer_size < ba1->Length();
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun       buffer_size += increments) {
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ByteVector buffer(buffer_size);
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ReadByteArrayWithBuffer(ba1, &buffer, &b1);
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ReadByteArrayWithBuffer(ba2, &buffer, &b2);
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_GT(b1.size(), static_cast<size_t>(0));
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_EQ(b1.size(), b2.size());
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_TRUE(std::equal(b1.begin(), b1.end(), b2.begin()));
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // sliding window reads
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b1.clear();
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (int window_size = 1; window_size < ba1->Length();
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun       window_size += increments) {
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ReadByteArrayWithSlidingWindow(ba1, window_size, &b1);
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ReadByteArrayWithSlidingWindow(ba2, window_size, &b2);
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_GT(b1.size(), static_cast<size_t>(0));
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_EQ(b1.size(), b2.size());
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_TRUE(std::equal(b1.begin(), b1.end(), b2.begin()));
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool CopyTest(ByteArray* ba) {
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteArrayPtr fixed_copy = new MemoryByteArray(ba->Length());
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ba->CopyTo(fixed_copy);
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(ba->Length(), fixed_copy->Length());
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_TRUE(ReadComparison(ba, fixed_copy));
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteArrayPtr growable_copy = new GrowableMemoryByteArray();
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ba->CopyTo(growable_copy);
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(ba->Length(), growable_copy->Length());
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_TRUE(ReadComparison(ba, growable_copy));
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool ByteArrayTester(ByteArray* ba) {
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return CopyTest(ba);
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace byte_array_test
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestMemoryByteArray() {
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "fixed mem: size ");
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (size_t i = 0;
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun       i < sizeof(byte_array_test::BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t size = byte_array_test::BYTE_ARRAY_SIZES[i];
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    fprintf(stderr, "%d ", size);
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ByteArrayPtr ba = new MemoryByteArray(size);
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    byte_array_test::FillTestByteArray(ba, size);
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_TRUE(byte_array_test::ByteArrayTester(ba));
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "\n");
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestGrowableMemoryByteArray() {
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "growable mem: size ");
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (size_t i = 0;
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun       i < sizeof(byte_array_test::BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t size = byte_array_test::BYTE_ARRAY_SIZES[i];
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    fprintf(stderr, "%d ", size);
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ByteArrayPtr ba = new GrowableMemoryByteArray();
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    byte_array_test::FillTestByteArray(ba, size);
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    EXPECT_TRUE(byte_array_test::ByteArrayTester(ba));
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "\n");
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST(ByteArray, All) {
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestMemoryByteArray());
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestGrowableMemoryByteArray());
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
147