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