blob: 964fc8ec9ee0b8067623bc4d5f17d41fb4ddf57f [file] [log] [blame]
Yi Jinad3e6e52018-04-03 15:10:34 -07001// Copyright (C) 2018 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14#include <android/util/EncodedBuffer.h>
15#include <gmock/gmock.h>
16#include <gtest/gtest.h>
17
18using namespace android::util;
19
Yi Jinc3d4b282018-04-23 16:02:20 -070020constexpr size_t TEST_CHUNK_SIZE = 16UL;
21constexpr size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2;
22constexpr size_t TEST_CHUNK_3X_SIZE = 3 * TEST_CHUNK_SIZE;
23
24static void expectPointer(EncodedBuffer::Pointer* p, size_t pos) {
25 EXPECT_EQ(p->pos(), pos);
26 EXPECT_EQ(p->index(), pos / TEST_CHUNK_SIZE);
27 EXPECT_EQ(p->offset(), pos % TEST_CHUNK_SIZE);
28}
29
30TEST(EncodedBufferTest, WriteSimple) {
31 EncodedBuffer buffer(TEST_CHUNK_SIZE);
32 EXPECT_EQ(buffer.size(), 0UL);
33 expectPointer(buffer.wp(), 0);
34 EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_SIZE);
35 for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
36 buffer.writeRawByte(50 + i);
37 }
38 EXPECT_EQ(buffer.size(), TEST_CHUNK_HALF_SIZE);
39 expectPointer(buffer.wp(), TEST_CHUNK_HALF_SIZE);
40 EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_HALF_SIZE);
41 for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
42 buffer.writeRawByte(80 + i);
43 }
44 EXPECT_EQ(buffer.size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
45 expectPointer(buffer.wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
46 EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_HALF_SIZE);
47
48 // verifies the buffer's data
49 expectPointer(buffer.ep(), 0);
50 for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
51 EXPECT_EQ(buffer.readRawByte(), 50 + i);
52 }
53 for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
54 EXPECT_EQ(buffer.readRawByte(), 80 + i);
55 }
56
57 // clears the buffer
58 buffer.clear();
59 EXPECT_EQ(buffer.size(), 0UL);
60 expectPointer(buffer.wp(), 0);
61}
62
63TEST(EncodedBufferTest, WriteVarint) {
64 EncodedBuffer buffer(TEST_CHUNK_SIZE);
65 size_t expected_buffer_size = 0;
66 EXPECT_EQ(buffer.writeRawVarint32(13), 1);
67 expected_buffer_size += 1;
68 EXPECT_EQ(buffer.size(), expected_buffer_size);
69 EXPECT_EQ(buffer.writeRawVarint32(UINT32_C(-1)), 5);
70 expected_buffer_size += 5;
71 EXPECT_EQ(buffer.size(), expected_buffer_size);
72
73 EXPECT_EQ(buffer.writeRawVarint64(200), 2);
74 expected_buffer_size += 2;
75 EXPECT_EQ(buffer.size(), expected_buffer_size);
76 EXPECT_EQ(buffer.writeRawVarint64(UINT64_C(-1)), 10);
77 expected_buffer_size += 10;
78 EXPECT_EQ(buffer.size(), expected_buffer_size);
79
80 buffer.writeRawFixed32(UINT32_C(-1));
81 expected_buffer_size += 4;
82 EXPECT_EQ(buffer.size(), expected_buffer_size);
83 buffer.writeRawFixed64(UINT64_C(-1));
84 expected_buffer_size += 8;
85 EXPECT_EQ(buffer.size(), expected_buffer_size);
86
87 EXPECT_EQ(buffer.writeHeader(32, 2), 2);
88 expected_buffer_size += 2;
89 EXPECT_EQ(buffer.size(), expected_buffer_size);
90
91 // verify data are correctly written to the buffer.
92 expectPointer(buffer.ep(), 0);
93 EXPECT_EQ(buffer.readRawVarint(), UINT32_C(13));
94 EXPECT_EQ(buffer.readRawVarint(), UINT32_C(-1));
95 EXPECT_EQ(buffer.readRawVarint(), UINT64_C(200));
96 EXPECT_EQ(buffer.readRawVarint(), UINT64_C(-1));
97 EXPECT_EQ(buffer.readRawFixed32(), UINT32_C(-1));
98 EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(-1));
99 EXPECT_EQ(buffer.readRawVarint(), UINT64_C((32 << 3) + 2));
100 expectPointer(buffer.ep(), expected_buffer_size);
101}
102
103TEST(EncodedBufferTest, Edit) {
104 EncodedBuffer buffer(TEST_CHUNK_SIZE);
105 buffer.writeRawFixed64(0xdeadbeefdeadbeef);
106 EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0xdeadbeefdeadbeef));
107
108 buffer.editRawFixed32(4, 0x12345678);
109 // fixed 64 is little endian order.
110 buffer.ep()->rewind(); // rewind ep for readRawFixed64 from 0
111 EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0x12345678deadbeef));
112
113 buffer.wp()->rewind();
114 expectPointer(buffer.wp(), 0);
115 buffer.copy(4, 3);
116 buffer.ep()->rewind(); // rewind ep for readRawFixed64 from 0
117 EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0x12345678de345678));
118}
119
120TEST(EncodedBufferTest, ReadSimple) {
121 EncodedBuffer buffer(TEST_CHUNK_SIZE);
122 for (size_t i = 0; i < TEST_CHUNK_3X_SIZE; i++) {
123 buffer.writeRawByte(i);
124 }
125 auto iter = buffer.begin();
126 EXPECT_EQ(iter.size(), TEST_CHUNK_3X_SIZE);
127 EXPECT_EQ(iter.bytesRead(), 0);
128
129 expectPointer(iter.rp(), 0);
130 while (iter.readBuffer() != NULL) {
131 iter.rp()->move(iter.currentToRead());
132 }
133 EXPECT_EQ(iter.bytesRead(), TEST_CHUNK_3X_SIZE);
134 expectPointer(iter.rp(), TEST_CHUNK_3X_SIZE);
135
136 iter.rp()->rewind();
137 expectPointer(iter.rp(), 0);
138 uint8_t val = 0;
139 while (iter.hasNext()) {
140 EXPECT_EQ(iter.next(), val);
141 val++;
142 }
143 EXPECT_EQ(iter.bytesRead(), TEST_CHUNK_3X_SIZE);
144 expectPointer(iter.rp(), TEST_CHUNK_3X_SIZE);
145}
146
Yi Jinad3e6e52018-04-03 15:10:34 -0700147TEST(EncodedBufferTest, ReadVarint) {
148 EncodedBuffer buffer;
149 uint64_t val = UINT64_C(1522865904593);
Yi Jinc3d4b282018-04-23 16:02:20 -0700150 size_t len = buffer.writeRawVarint64(val);
151 auto iter = buffer.begin();
152 EXPECT_EQ(iter.size(), len);
153 EXPECT_EQ(iter.readRawVarint(), val);
Yi Jinad3e6e52018-04-03 15:10:34 -0700154}