MemBlockTest.cpp revision 0198ef5cd67b74a4e67a485a03c1c12c815aa32b
10198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline/*
20198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * Copyright (C) 2018 The Android Open Source Project
30198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline *
40198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * Licensed under the Apache License, Version 2.0 (the "License");
50198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * you may not use this file except in compliance with the License.
60198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * You may obtain a copy of the License at
70198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline *
80198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline *      http://www.apache.org/licenses/LICENSE-2.0
90198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline *
100198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * Unless required by applicable law or agreed to in writing, software
110198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * distributed under the License is distributed on an "AS IS" BASIS,
120198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * See the License for the specific language governing permissions and
140198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline * limitations under the License.
150198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline */
160198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
170198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline#include <algorithm>
180198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline#include <cstdint>
190198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline#include <utility>
200198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
210198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline#include <gtest/gtest.h>
220198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
230198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline#include "netdutils/MemBlock.h"
240198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline#include "netdutils/Slice.h"
250198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
260198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klinenamespace android {
270198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klinenamespace netdutils {
280198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
290198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klinenamespace {
300198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
310198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klineconstexpr int DNS_PACKET_SIZE = 512;
320198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klineconstexpr int ARBITRARY_VALUE = 0x55;
330198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
340198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineMemBlock makeArbitraryMemBlock(size_t len) {
350198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock result(len);
360198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    Slice slice = result.get();
370198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    // Do some fictional work before returning.
380198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    for (int i = 0; i < slice.size(); i++) {
390198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        slice.base()[i] = ARBITRARY_VALUE;
400198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    }
410198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    return result;
420198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
430198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
440198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klinevoid checkAllZeros(Slice slice) {
450198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    for (int i = 0; i < slice.size(); i++) {
460198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        EXPECT_EQ(0U, slice.base()[i]);
470198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    }
480198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
490198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
500198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klinevoid checkArbitraryMemBlock(const MemBlock& block, size_t expectedSize) {
510198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    Slice slice = block.get();
520198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ(expectedSize, slice.size());
530198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_NE(nullptr, slice.base());
540198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    for (int i = 0; i < slice.size(); i++) {
550198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        EXPECT_EQ(ARBITRARY_VALUE, slice.base()[i]);
560198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    }
570198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
580198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
590198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Klinevoid checkHelloMello(Slice dest, Slice src) {
600198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ('h', dest.base()[0]);
610198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ('e', dest.base()[1]);
620198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ('l', dest.base()[2]);
630198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ('l', dest.base()[3]);
640198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ('o', dest.base()[4]);
650198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
660198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    src.base()[0] = 'm';
670198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ('h', dest.base()[0]);
680198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
690198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
700198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}  // namespace
710198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
720198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, Empty) {
730198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock empty;
740198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_TRUE(empty.get().empty());
750198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ(nullptr, empty.get().base());
760198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
770198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
780198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, ExplicitZero) {
790198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock zero(0);
800198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_TRUE(zero.get().empty());
810198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ(nullptr, zero.get().base());
820198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
830198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
840198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, BasicAllocation) {
850198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock dnsPacket(DNS_PACKET_SIZE);
860198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    Slice slice = dnsPacket.get();
870198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ(DNS_PACKET_SIZE, slice.size());
880198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    // Verify the space is '\0'-initialized.
890198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    ASSERT_NO_FATAL_FAILURE(checkAllZeros(slice));
900198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_NE(nullptr, slice.base());
910198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
920198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
930198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, MoveConstruction) {
940198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock block(makeArbitraryMemBlock(DNS_PACKET_SIZE));
950198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    ASSERT_NO_FATAL_FAILURE(checkArbitraryMemBlock(block, DNS_PACKET_SIZE));
960198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
970198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
980198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, MoveAssignmentOrConstruction) {
990198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock block = makeArbitraryMemBlock(DNS_PACKET_SIZE);
1000198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    ASSERT_NO_FATAL_FAILURE(checkArbitraryMemBlock(block, DNS_PACKET_SIZE));
1010198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
1020198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1030198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, StdMoveAssignment) {
1040198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    constexpr int SIZE = 10;
1050198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1060198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock block;
1070198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_TRUE(block.get().empty());
1080198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ(nullptr, block.get().base());
1090198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1100198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    {
1110198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        MemBlock block2 = makeArbitraryMemBlock(SIZE);
1120198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        EXPECT_EQ(SIZE, block2.get().size());
1130198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        // More fictional work.
1140198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        for (int i = 0; i < SIZE; i++) {
1150198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline            block2.get().base()[i] = i;
1160198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        }
1170198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        block = std::move(block2);
1180198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    }
1190198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1200198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    EXPECT_EQ(SIZE, block.get().size());
1210198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    for (int i = 0; i < SIZE; i++) {
1220198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline        EXPECT_EQ(i, block.get().base()[i]);
1230198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    }
1240198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
1250198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1260198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, ConstructionFromSlice) {
1270198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    uint8_t data[] = {'h', 'e', 'l', 'l', 'o'};
1280198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    Slice dataSlice(Slice(data, sizeof(data) / sizeof(data[0])));
1290198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1300198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock dataCopy(dataSlice);
1310198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    ASSERT_NO_FATAL_FAILURE(checkHelloMello(dataCopy.get(), dataSlice));
1320198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
1330198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1340198ef5cd67b74a4e67a485a03c1c12c815aa32bErik KlineTEST(MemBlockTest, ImplicitCastToSlice) {
1350198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    uint8_t data[] = {'h', 'e', 'l', 'l', 'o'};
1360198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    Slice dataSlice(Slice(data, sizeof(data) / sizeof(data[0])));
1370198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1380198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    MemBlock dataCopy(dataSlice.size());
1390198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    // NOTE: no explicit MemBlock::get().
1400198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    // Verify the space is '\0'-initialized.
1410198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    ASSERT_NO_FATAL_FAILURE(checkAllZeros(dataCopy));
1420198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    copy(dataCopy, dataSlice);
1430198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline    ASSERT_NO_FATAL_FAILURE(checkHelloMello(dataCopy, dataSlice));
1440198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}
1450198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline
1460198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}  // namespace netdutils
1470198ef5cd67b74a4e67a485a03c1c12c815aa32bErik Kline}  // namespace android
148