blob: a09558544c2687f562ab8d63f25a035b2a34e833 [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
Kalesh Singhc1d4f192023-08-10 13:46:09 -070018#include <unistd.h>
19
Yi Jinad3e6e52018-04-03 15:10:34 -070020using namespace android::util;
Joe Onoratoceece482019-03-27 00:20:25 -070021using android::sp;
Yi Jinad3e6e52018-04-03 15:10:34 -070022
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070023constexpr size_t __TEST_CHUNK_SIZE = 16UL;
Kalesh Singhc1d4f192023-08-10 13:46:09 -070024const size_t kPageSize = getpagesize();
25const size_t TEST_CHUNK_SIZE = (__TEST_CHUNK_SIZE + (kPageSize - 1)) & ~(kPageSize - 1);
26const size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2;
27const size_t TEST_CHUNK_3X_SIZE = 3 * TEST_CHUNK_SIZE;
Yi Jinc3d4b282018-04-23 16:02:20 -070028
29static void expectPointer(EncodedBuffer::Pointer* p, size_t pos) {
30 EXPECT_EQ(p->pos(), pos);
31 EXPECT_EQ(p->index(), pos / TEST_CHUNK_SIZE);
32 EXPECT_EQ(p->offset(), pos % TEST_CHUNK_SIZE);
33}
34
35TEST(EncodedBufferTest, WriteSimple) {
Joe Onorato05270522019-05-10 16:33:49 -070036 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
37 EXPECT_EQ(buffer->size(), 0UL);
38 expectPointer(buffer->wp(), 0);
39 EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070040 for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070041 buffer->writeRawByte(static_cast<uint8_t>(50 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070042 }
Joe Onorato05270522019-05-10 16:33:49 -070043 EXPECT_EQ(buffer->size(), TEST_CHUNK_HALF_SIZE);
44 expectPointer(buffer->wp(), TEST_CHUNK_HALF_SIZE);
45 EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070046 for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070047 buffer->writeRawByte(static_cast<uint8_t>(80 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070048 }
Joe Onorato05270522019-05-10 16:33:49 -070049 EXPECT_EQ(buffer->size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
50 expectPointer(buffer->wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
51 EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070052
53 // verifies the buffer's data
Joe Onorato05270522019-05-10 16:33:49 -070054 expectPointer(buffer->ep(), 0);
Yi Jinc3d4b282018-04-23 16:02:20 -070055 for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070056 EXPECT_EQ(buffer->readRawByte(), static_cast<uint8_t>(50 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070057 }
58 for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
Kalesh Singhf5a3b8a2023-08-10 13:38:17 -070059 EXPECT_EQ(buffer->readRawByte(), static_cast<uint8_t>(80 + i));
Yi Jinc3d4b282018-04-23 16:02:20 -070060 }
61
62 // clears the buffer
Joe Onorato05270522019-05-10 16:33:49 -070063 buffer->clear();
64 EXPECT_EQ(buffer->size(), 0UL);
65 expectPointer(buffer->wp(), 0);
Yi Jinc3d4b282018-04-23 16:02:20 -070066}
67
68TEST(EncodedBufferTest, WriteVarint) {
Joe Onorato05270522019-05-10 16:33:49 -070069 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -070070 size_t expected_buffer_size = 0;
Joe Onorato05270522019-05-10 16:33:49 -070071 EXPECT_EQ(buffer->writeRawVarint32(13), 1);
Yi Jinc3d4b282018-04-23 16:02:20 -070072 expected_buffer_size += 1;
Joe Onorato05270522019-05-10 16:33:49 -070073 EXPECT_EQ(buffer->size(), expected_buffer_size);
74 EXPECT_EQ(buffer->writeRawVarint32(UINT32_C(-1)), 5);
Yi Jinc3d4b282018-04-23 16:02:20 -070075 expected_buffer_size += 5;
Joe Onorato05270522019-05-10 16:33:49 -070076 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070077
Joe Onorato05270522019-05-10 16:33:49 -070078 EXPECT_EQ(buffer->writeRawVarint64(200), 2);
Yi Jinc3d4b282018-04-23 16:02:20 -070079 expected_buffer_size += 2;
Joe Onorato05270522019-05-10 16:33:49 -070080 EXPECT_EQ(buffer->size(), expected_buffer_size);
81 EXPECT_EQ(buffer->writeRawVarint64(UINT64_C(-1)), 10);
Yi Jinc3d4b282018-04-23 16:02:20 -070082 expected_buffer_size += 10;
Joe Onorato05270522019-05-10 16:33:49 -070083 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070084
Joe Onorato05270522019-05-10 16:33:49 -070085 buffer->writeRawFixed32(UINT32_C(-1));
Yi Jinc3d4b282018-04-23 16:02:20 -070086 expected_buffer_size += 4;
Joe Onorato05270522019-05-10 16:33:49 -070087 EXPECT_EQ(buffer->size(), expected_buffer_size);
88 buffer->writeRawFixed64(UINT64_C(-1));
Yi Jinc3d4b282018-04-23 16:02:20 -070089 expected_buffer_size += 8;
Joe Onorato05270522019-05-10 16:33:49 -070090 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070091
Joe Onorato05270522019-05-10 16:33:49 -070092 EXPECT_EQ(buffer->writeHeader(32, 2), 2);
Yi Jinc3d4b282018-04-23 16:02:20 -070093 expected_buffer_size += 2;
Joe Onorato05270522019-05-10 16:33:49 -070094 EXPECT_EQ(buffer->size(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -070095
96 // verify data are correctly written to the buffer.
Joe Onorato05270522019-05-10 16:33:49 -070097 expectPointer(buffer->ep(), 0);
98 EXPECT_EQ(buffer->readRawVarint(), UINT32_C(13));
99 EXPECT_EQ(buffer->readRawVarint(), UINT32_C(-1));
100 EXPECT_EQ(buffer->readRawVarint(), UINT64_C(200));
101 EXPECT_EQ(buffer->readRawVarint(), UINT64_C(-1));
102 EXPECT_EQ(buffer->readRawFixed32(), UINT32_C(-1));
103 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(-1));
104 EXPECT_EQ(buffer->readRawVarint(), UINT64_C((32 << 3) + 2));
105 expectPointer(buffer->ep(), expected_buffer_size);
Yi Jinc3d4b282018-04-23 16:02:20 -0700106}
107
108TEST(EncodedBufferTest, Edit) {
Joe Onorato05270522019-05-10 16:33:49 -0700109 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
110 buffer->writeRawFixed64(0xdeadbeefdeadbeef);
111 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0xdeadbeefdeadbeef));
Yi Jinc3d4b282018-04-23 16:02:20 -0700112
Joe Onorato05270522019-05-10 16:33:49 -0700113 buffer->editRawFixed32(4, 0x12345678);
Yi Jinc3d4b282018-04-23 16:02:20 -0700114 // fixed 64 is little endian order.
Joe Onorato05270522019-05-10 16:33:49 -0700115 buffer->ep()->rewind(); // rewind ep for readRawFixed64 from 0
116 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0x12345678deadbeef));
Yi Jinc3d4b282018-04-23 16:02:20 -0700117
Joe Onorato05270522019-05-10 16:33:49 -0700118 buffer->wp()->rewind();
119 expectPointer(buffer->wp(), 0);
120 buffer->copy(4, 3);
121 buffer->ep()->rewind(); // rewind ep for readRawFixed64 from 0
122 EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0x12345678de345678));
Yi Jinc3d4b282018-04-23 16:02:20 -0700123}
124
125TEST(EncodedBufferTest, ReadSimple) {
Joe Onorato05270522019-05-10 16:33:49 -0700126 sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -0700127 for (size_t i = 0; i < TEST_CHUNK_3X_SIZE; i++) {
Joe Onorato05270522019-05-10 16:33:49 -0700128 buffer->writeRawByte(i);
Yi Jinc3d4b282018-04-23 16:02:20 -0700129 }
Joe Onorato05270522019-05-10 16:33:49 -0700130 sp<ProtoReader> reader1 = buffer->read();
Joe Onoratoceece482019-03-27 00:20:25 -0700131 EXPECT_EQ(reader1->size(), TEST_CHUNK_3X_SIZE);
132 EXPECT_EQ(reader1->bytesRead(), 0);
Yi Jinc3d4b282018-04-23 16:02:20 -0700133
Joe Onoratoceece482019-03-27 00:20:25 -0700134 while (reader1->readBuffer() != NULL) {
135 reader1->move(reader1->currentToRead());
Yi Jinc3d4b282018-04-23 16:02:20 -0700136 }
Joe Onoratoceece482019-03-27 00:20:25 -0700137 EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -0700138
Joe Onorato05270522019-05-10 16:33:49 -0700139 sp<ProtoReader> reader2 = buffer->read();
Yi Jinc3d4b282018-04-23 16:02:20 -0700140 uint8_t val = 0;
Joe Onoratoceece482019-03-27 00:20:25 -0700141 while (reader2->hasNext()) {
142 EXPECT_EQ(reader2->next(), val);
Yi Jinc3d4b282018-04-23 16:02:20 -0700143 val++;
144 }
Joe Onoratoceece482019-03-27 00:20:25 -0700145 EXPECT_EQ(reader2->bytesRead(), TEST_CHUNK_3X_SIZE);
146 EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
Yi Jinc3d4b282018-04-23 16:02:20 -0700147}
148
Yi Jinad3e6e52018-04-03 15:10:34 -0700149TEST(EncodedBufferTest, ReadVarint) {
Joe Onorato05270522019-05-10 16:33:49 -0700150 sp<EncodedBuffer> buffer = new EncodedBuffer();
Yi Jinad3e6e52018-04-03 15:10:34 -0700151 uint64_t val = UINT64_C(1522865904593);
Joe Onorato05270522019-05-10 16:33:49 -0700152 size_t len = buffer->writeRawVarint64(val);
153 sp<ProtoReader> reader = buffer->read();
Joe Onoratoceece482019-03-27 00:20:25 -0700154 EXPECT_EQ(reader->size(), len);
155 EXPECT_EQ(reader->readRawVarint(), val);
Yi Jinad3e6e52018-04-03 15:10:34 -0700156}