Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/base/arraysize.h"
     12 #include "webrtc/base/bytebuffer.h"
     13 #include "webrtc/base/byteorder.h"
     14 #include "webrtc/base/common.h"
     15 #include "webrtc/base/gunit.h"
     16 
     17 namespace rtc {
     18 
     19 TEST(ByteBufferTest, TestByteOrder) {
     20   uint16_t n16 = 1;
     21   uint32_t n32 = 1;
     22   uint64_t n64 = 1;
     23 
     24   EXPECT_EQ(n16, NetworkToHost16(HostToNetwork16(n16)));
     25   EXPECT_EQ(n32, NetworkToHost32(HostToNetwork32(n32)));
     26   EXPECT_EQ(n64, NetworkToHost64(HostToNetwork64(n64)));
     27 
     28   if (IsHostBigEndian()) {
     29     // The host is the network (big) endian.
     30     EXPECT_EQ(n16, HostToNetwork16(n16));
     31     EXPECT_EQ(n32, HostToNetwork32(n32));
     32     EXPECT_EQ(n64, HostToNetwork64(n64));
     33 
     34     // GetBE converts big endian to little endian here.
     35     EXPECT_EQ(n16 >> 8, GetBE16(&n16));
     36     EXPECT_EQ(n32 >> 24, GetBE32(&n32));
     37     EXPECT_EQ(n64 >> 56, GetBE64(&n64));
     38   } else {
     39     // The host is little endian.
     40     EXPECT_NE(n16, HostToNetwork16(n16));
     41     EXPECT_NE(n32, HostToNetwork32(n32));
     42     EXPECT_NE(n64, HostToNetwork64(n64));
     43 
     44     // GetBE converts little endian to big endian here.
     45     EXPECT_EQ(GetBE16(&n16), HostToNetwork16(n16));
     46     EXPECT_EQ(GetBE32(&n32), HostToNetwork32(n32));
     47     EXPECT_EQ(GetBE64(&n64), HostToNetwork64(n64));
     48 
     49     // GetBE converts little endian to big endian here.
     50     EXPECT_EQ(n16 << 8, GetBE16(&n16));
     51     EXPECT_EQ(n32 << 24, GetBE32(&n32));
     52     EXPECT_EQ(n64 << 56, GetBE64(&n64));
     53   }
     54 }
     55 
     56 TEST(ByteBufferTest, TestBufferLength) {
     57   ByteBuffer buffer;
     58   size_t size = 0;
     59   EXPECT_EQ(size, buffer.Length());
     60 
     61   buffer.WriteUInt8(1);
     62   ++size;
     63   EXPECT_EQ(size, buffer.Length());
     64 
     65   buffer.WriteUInt16(1);
     66   size += 2;
     67   EXPECT_EQ(size, buffer.Length());
     68 
     69   buffer.WriteUInt24(1);
     70   size += 3;
     71   EXPECT_EQ(size, buffer.Length());
     72 
     73   buffer.WriteUInt32(1);
     74   size += 4;
     75   EXPECT_EQ(size, buffer.Length());
     76 
     77   buffer.WriteUInt64(1);
     78   size += 8;
     79   EXPECT_EQ(size, buffer.Length());
     80 
     81   EXPECT_TRUE(buffer.Consume(0));
     82   EXPECT_EQ(size, buffer.Length());
     83 
     84   EXPECT_TRUE(buffer.Consume(4));
     85   size -= 4;
     86   EXPECT_EQ(size, buffer.Length());
     87 }
     88 
     89 TEST(ByteBufferTest, TestGetSetReadPosition) {
     90   ByteBuffer buffer("ABCDEF", 6);
     91   EXPECT_EQ(6U, buffer.Length());
     92   ByteBuffer::ReadPosition pos(buffer.GetReadPosition());
     93   EXPECT_TRUE(buffer.SetReadPosition(pos));
     94   EXPECT_EQ(6U, buffer.Length());
     95   std::string read;
     96   EXPECT_TRUE(buffer.ReadString(&read, 3));
     97   EXPECT_EQ("ABC", read);
     98   EXPECT_EQ(3U, buffer.Length());
     99   EXPECT_TRUE(buffer.SetReadPosition(pos));
    100   EXPECT_EQ(6U, buffer.Length());
    101   read.clear();
    102   EXPECT_TRUE(buffer.ReadString(&read, 3));
    103   EXPECT_EQ("ABC", read);
    104   EXPECT_EQ(3U, buffer.Length());
    105   // For a resize by writing Capacity() number of bytes.
    106   size_t capacity = buffer.Capacity();
    107   buffer.ReserveWriteBuffer(buffer.Capacity());
    108   EXPECT_EQ(capacity + 3U, buffer.Length());
    109   EXPECT_FALSE(buffer.SetReadPosition(pos));
    110   read.clear();
    111   EXPECT_TRUE(buffer.ReadString(&read, 3));
    112   EXPECT_EQ("DEF", read);
    113 }
    114 
    115 TEST(ByteBufferTest, TestReadWriteBuffer) {
    116   ByteBuffer::ByteOrder orders[2] = { ByteBuffer::ORDER_HOST,
    117                                       ByteBuffer::ORDER_NETWORK };
    118   for (size_t i = 0; i < arraysize(orders); i++) {
    119     ByteBuffer buffer(orders[i]);
    120     EXPECT_EQ(orders[i], buffer.Order());
    121     uint8_t ru8;
    122     EXPECT_FALSE(buffer.ReadUInt8(&ru8));
    123 
    124     // Write and read uint8_t.
    125     uint8_t wu8 = 1;
    126     buffer.WriteUInt8(wu8);
    127     EXPECT_TRUE(buffer.ReadUInt8(&ru8));
    128     EXPECT_EQ(wu8, ru8);
    129     EXPECT_EQ(0U, buffer.Length());
    130 
    131     // Write and read uint16_t.
    132     uint16_t wu16 = (1 << 8) + 1;
    133     buffer.WriteUInt16(wu16);
    134     uint16_t ru16;
    135     EXPECT_TRUE(buffer.ReadUInt16(&ru16));
    136     EXPECT_EQ(wu16, ru16);
    137     EXPECT_EQ(0U, buffer.Length());
    138 
    139     // Write and read uint24.
    140     uint32_t wu24 = (3 << 16) + (2 << 8) + 1;
    141     buffer.WriteUInt24(wu24);
    142     uint32_t ru24;
    143     EXPECT_TRUE(buffer.ReadUInt24(&ru24));
    144     EXPECT_EQ(wu24, ru24);
    145     EXPECT_EQ(0U, buffer.Length());
    146 
    147     // Write and read uint32_t.
    148     uint32_t wu32 = (4 << 24) + (3 << 16) + (2 << 8) + 1;
    149     buffer.WriteUInt32(wu32);
    150     uint32_t ru32;
    151     EXPECT_TRUE(buffer.ReadUInt32(&ru32));
    152     EXPECT_EQ(wu32, ru32);
    153     EXPECT_EQ(0U, buffer.Length());
    154 
    155     // Write and read uint64_t.
    156     uint32_t another32 = (8 << 24) + (7 << 16) + (6 << 8) + 5;
    157     uint64_t wu64 = (static_cast<uint64_t>(another32) << 32) + wu32;
    158     buffer.WriteUInt64(wu64);
    159     uint64_t ru64;
    160     EXPECT_TRUE(buffer.ReadUInt64(&ru64));
    161     EXPECT_EQ(wu64, ru64);
    162     EXPECT_EQ(0U, buffer.Length());
    163 
    164     // Write and read string.
    165     std::string write_string("hello");
    166     buffer.WriteString(write_string);
    167     std::string read_string;
    168     EXPECT_TRUE(buffer.ReadString(&read_string, write_string.size()));
    169     EXPECT_EQ(write_string, read_string);
    170     EXPECT_EQ(0U, buffer.Length());
    171 
    172     // Write and read bytes
    173     char write_bytes[] = "foo";
    174     buffer.WriteBytes(write_bytes, 3);
    175     char read_bytes[3];
    176     EXPECT_TRUE(buffer.ReadBytes(read_bytes, 3));
    177     for (int i = 0; i < 3; ++i) {
    178       EXPECT_EQ(write_bytes[i], read_bytes[i]);
    179     }
    180     EXPECT_EQ(0U, buffer.Length());
    181 
    182     // Write and read reserved buffer space
    183     char* write_dst = buffer.ReserveWriteBuffer(3);
    184     memcpy(write_dst, write_bytes, 3);
    185     memset(read_bytes, 0, 3);
    186     EXPECT_TRUE(buffer.ReadBytes(read_bytes, 3));
    187     for (int i = 0; i < 3; ++i) {
    188       EXPECT_EQ(write_bytes[i], read_bytes[i]);
    189     }
    190     EXPECT_EQ(0U, buffer.Length());
    191 
    192     // Write and read in order.
    193     buffer.WriteUInt8(wu8);
    194     buffer.WriteUInt16(wu16);
    195     buffer.WriteUInt24(wu24);
    196     buffer.WriteUInt32(wu32);
    197     buffer.WriteUInt64(wu64);
    198     EXPECT_TRUE(buffer.ReadUInt8(&ru8));
    199     EXPECT_EQ(wu8, ru8);
    200     EXPECT_TRUE(buffer.ReadUInt16(&ru16));
    201     EXPECT_EQ(wu16, ru16);
    202     EXPECT_TRUE(buffer.ReadUInt24(&ru24));
    203     EXPECT_EQ(wu24, ru24);
    204     EXPECT_TRUE(buffer.ReadUInt32(&ru32));
    205     EXPECT_EQ(wu32, ru32);
    206     EXPECT_TRUE(buffer.ReadUInt64(&ru64));
    207     EXPECT_EQ(wu64, ru64);
    208     EXPECT_EQ(0U, buffer.Length());
    209   }
    210 }
    211 
    212 }  // namespace rtc
    213