blob: 8a7becf68d693a93de3eb3b18461e703dbc69255 [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;
Joe Onoratoceece482019-03-27 00:20:25 -070019using android::sp;
Yi Jinad3e6e52018-04-03 15:10:34 -070020
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070021constexpr size_t __TEST_CHUNK_SIZE = 16UL;
22constexpr size_t TEST_CHUNK_SIZE = (__TEST_CHUNK_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
Yi Jinc3d4b282018-04-23 16:02:20 -070023constexpr size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2;
24constexpr size_t TEST_CHUNK_3X_SIZE = 3 * TEST_CHUNK_SIZE;
25
26static void expectPointer(EncodedBuffer::Pointer* p, size_t pos) {
27 EXPECT_EQ(p->pos(), pos);
28 EXPECT_EQ(p->index(), pos / TEST_CHUNK_SIZE);
29 EXPECT_EQ(p->offset(), pos % TEST_CHUNK_SIZE);
30}
31
32TEST(EncodedBufferTest, WriteSimple) {
Joe Onorato05270522019-05-10 16:33:49 -070033 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
34 EXPECT_EQ(buffer->size(), 0UL);
35 expectPointer(buffer->wp(), 0);
36 EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070037 for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070038 buffer->writeRawByte(static_cast<uint8_t>(50 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070039 }
Joe Onorato05270522019-05-10 16:33:49 -070040 EXPECT_EQ(buffer->size(), TEST_CHUNK_HALF_SIZE);
41 expectPointer(buffer->wp(), TEST_CHUNK_HALF_SIZE);
42 EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070043 for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070044 buffer->writeRawByte(static_cast<uint8_t>(80 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070045 }
Joe Onorato05270522019-05-10 16:33:49 -070046 EXPECT_EQ(buffer->size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
47 expectPointer(buffer->wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
48 EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070049
50 // verifies the buffer's data
Joe Onorato05270522019-05-10 16:33:49 -070051 expectPointer(buffer->ep(), 0);
Yi Jinc3d4b282018-04-23 16:02:20 -070052 for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070053 EXPECT_EQ(buffer->readRawByte(), static_cast<uint8_t>(50 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070054 }
55 for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070056 EXPECT_EQ(buffer->readRawByte(), static_cast<uint8_t>(80 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070057 }
58
59 // clears the buffer
Joe Onorato05270522019-05-10 16:33:49 -070060 buffer->clear();
61 EXPECT_EQ(buffer->size(), 0UL);
62 expectPointer(buffer->wp(), 0);
Yi Jinc3d4b282018-04-23 16:02:20 -070063}
64
65TEST(EncodedBufferTest, WriteVarint) {
Joe Onorato05270522019-05-10 16:33:49 -070066 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070067 size_t expected_buffer_size = 0;
Joe Onorato05270522019-05-10 16:33:49 -070068 EXPECT_EQ(buffer->writeRawVarint32(13), 1);
Yi Jinc3d4b282018-04-23 16:02:20 -070069 expected_buffer_size += 1;
Joe Onorato05270522019-05-10 16:33:49 -070070 EXPECT_EQ(buffer->size(), expected_buffer_size);
71 EXPECT_EQ(buffer->writeRawVarint32(UINT32_C(-1)), 5);
Yi Jinc3d4b282018-04-23 16:02:20 -070072 expected_buffer_size += 5;
Joe Onorato05270522019-05-10 16:33:49 -070073 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070074
Joe Onorato05270522019-05-10 16:33:49 -070075 EXPECT_EQ(buffer->writeRawVarint64(200), 2);
Yi Jinc3d4b282018-04-23 16:02:20 -070076 expected_buffer_size += 2;
Joe Onorato05270522019-05-10 16:33:49 -070077 EXPECT_EQ(buffer->size(), expected_buffer_size);
78 EXPECT_EQ(buffer->writeRawVarint64(UINT64_C(-1)), 10);
Yi Jinc3d4b282018-04-23 16:02:20 -070079 expected_buffer_size += 10;
Joe Onorato05270522019-05-10 16:33:49 -070080 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070081
Joe Onorato05270522019-05-10 16:33:49 -070082 buffer->writeRawFixed32(UINT32_C(-1));
Yi Jinc3d4b282018-04-23 16:02:20 -070083 expected_buffer_size += 4;
Joe Onorato05270522019-05-10 16:33:49 -070084 EXPECT_EQ(buffer->size(), expected_buffer_size);
85 buffer->writeRawFixed64(UINT64_C(-1));
Yi Jinc3d4b282018-04-23 16:02:20 -070086 expected_buffer_size += 8;
Joe Onorato05270522019-05-10 16:33:49 -070087 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070088
Joe Onorato05270522019-05-10 16:33:49 -070089 EXPECT_EQ(buffer->writeHeader(32, 2), 2);
Yi Jinc3d4b282018-04-23 16:02:20 -070090 expected_buffer_size += 2;
Joe Onorato05270522019-05-10 16:33:49 -070091 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070092
93 // verify data are correctly written to the buffer.
Joe Onorato05270522019-05-10 16:33:49 -070094 expectPointer(buffer->ep(), 0);
95 EXPECT_EQ(buffer->readRawVarint(), UINT32_C(13));
96 EXPECT_EQ(buffer->readRawVarint(), UINT32_C(-1));
97 EXPECT_EQ(buffer->readRawVarint(), UINT64_C(200));
98 EXPECT_EQ(buffer->readRawVarint(), UINT64_C(-1));
99 EXPECT_EQ(buffer->readRawFixed32(), UINT32_C(-1));
100 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(-1));
101 EXPECT_EQ(buffer->readRawVarint(), UINT64_C((32 << 3) + 2));
102 expectPointer(buffer->ep(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -0700103}
104
105TEST(EncodedBufferTest, Edit) {
Joe Onorato05270522019-05-10 16:33:49 -0700106 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
107 buffer->writeRawFixed64(0xdeadbeefdeadbeef);
108 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0xdeadbeefdeadbeef));
Yi Jinc3d4b282018-04-23 16:02:20 -0700109
Joe Onorato05270522019-05-10 16:33:49 -0700110 buffer->editRawFixed32(4, 0x12345678);
Yi Jinc3d4b282018-04-23 16:02:20 -0700111 // fixed 64 is little endian order.
Joe Onorato05270522019-05-10 16:33:49 -0700112 buffer->ep()->rewind(); // rewind ep for readRawFixed64 from 0
113 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0x12345678deadbeef));
Yi Jinc3d4b282018-04-23 16:02:20 -0700114
Joe Onorato05270522019-05-10 16:33:49 -0700115 buffer->wp()->rewind();
116 expectPointer(buffer->wp(), 0);
117 buffer->copy(4, 3);
118 buffer->ep()->rewind(); // rewind ep for readRawFixed64 from 0
119 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0x12345678de345678));
Yi Jinc3d4b282018-04-23 16:02:20 -0700120}
121
122TEST(EncodedBufferTest, ReadSimple) {
Joe Onorato05270522019-05-10 16:33:49 -0700123 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -0700124 for (size_t i = 0; i < TEST_CHUNK_3X_SIZE; i++) {
Joe Onorato05270522019-05-10 16:33:49 -0700125 buffer->writeRawByte(i);
Yi Jinc3d4b282018-04-23 16:02:20 -0700126 }
Joe Onorato05270522019-05-10 16:33:49 -0700127 sp<ProtoReader> reader1 = buffer->read();
Joe Onoratoceece482019-03-27 00:20:25 -0700128 EXPECT_EQ(reader1->size(), TEST_CHUNK_3X_SIZE);
129 EXPECT_EQ(reader1->bytesRead(), 0);
Yi Jinc3d4b282018-04-23 16:02:20 -0700130
Joe Onoratoceece482019-03-27 00:20:25 -0700131 while (reader1->readBuffer() != NULL) {
132 reader1->move(reader1->currentToRead());
Yi Jinc3d4b282018-04-23 16:02:20 -0700133 }
Joe Onoratoceece482019-03-27 00:20:25 -0700134 EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -0700135
Joe Onorato05270522019-05-10 16:33:49 -0700136 sp<ProtoReader> reader2 = buffer->read();
Yi Jinc3d4b282018-04-23 16:02:20 -0700137 uint8_t val = 0;
Joe Onoratoceece482019-03-27 00:20:25 -0700138 while (reader2->hasNext()) {
139 EXPECT_EQ(reader2->next(), val);
Yi Jinc3d4b282018-04-23 16:02:20 -0700140 val++;
141 }
Joe Onoratoceece482019-03-27 00:20:25 -0700142 EXPECT_EQ(reader2->bytesRead(), TEST_CHUNK_3X_SIZE);
143 EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -0700144}
145
Yi Jinad3e6e52018-04-03 15:10:34 -0700146TEST(EncodedBufferTest, ReadVarint) {
Joe Onorato05270522019-05-10 16:33:49 -0700147 sp<EncodedBuffer> buffer = new EncodedBuffer();
Yi Jinad3e6e52018-04-03 15:10:34 -0700148 uint64_t val = UINT64_C(1522865904593);
Joe Onorato05270522019-05-10 16:33:49 -0700149 size_t len = buffer->writeRawVarint64(val);
150 sp<ProtoReader> reader = buffer->read();
Joe Onoratoceece482019-03-27 00:20:25 -0700151 EXPECT_EQ(reader->size(), len);
152 EXPECT_EQ(reader->readRawVarint(), val);
Yi Jinad3e6e52018-04-03 15:10:34 -0700153}