135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org/*
2d41f59a23f333b61531045e9ff8cc99f022c5c49andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org *
435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org *  Use of this source code is governed by a BSD-style license
535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org *  that can be found in the LICENSE file in the root of the source
635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org *  tree. An additional intellectual property rights grant can be found
735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org *  in the file PATENTS.  All contributing project authors may
835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org */
105b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org
1134741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "webrtc/test/testsupport/packet_reader.h"
125b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org
1334741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
1434741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "webrtc/test/testsupport/unittest_utils.h"
1535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
1635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgnamespace webrtc {
1735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgnamespace test {
1835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
1935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgclass PacketReaderTest: public PacketRelatedTest {
2035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org protected:
215b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  PacketReaderTest() {}
225b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  virtual ~PacketReaderTest() {}
2335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  void SetUp() {
2435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org    reader_ = new PacketReader();
2535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  }
2635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  void TearDown() {
2735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org    delete reader_;
2835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  }
294591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  void VerifyPacketData(size_t expected_length,
3035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org                        int actual_length,
31a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                        uint8_t* original_data_pointer,
32a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                        uint8_t* new_data_pointer) {
334591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    EXPECT_EQ(static_cast<int>(expected_length), actual_length);
3435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org    EXPECT_EQ(*original_data_pointer, *new_data_pointer);
3535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org    EXPECT_EQ(0, memcmp(original_data_pointer, new_data_pointer,
3635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org                        actual_length));
3735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  }
385b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  PacketReader* reader_;
3935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org};
4035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
4135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org// Test lack of initialization
4235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgTEST_F(PacketReaderTest, Uninitialized) {
43a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t* data_pointer = NULL;
4435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(-1, reader_->NextPacket(&data_pointer));
4535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(NULL, data_pointer);
4635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}
4735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
4835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgTEST_F(PacketReaderTest, InitializeZeroLengthArgument) {
4935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  reader_->InitializeReading(packet_data_, 0, kPacketSizeInBytes);
5035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  ASSERT_EQ(0, reader_->NextPacket(&packet_data_pointer_));
5135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}
5235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
5335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org// Test with something smaller than one packet
5435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgTEST_F(PacketReaderTest, NormalSmallData) {
5535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  const int kDataLengthInBytes = 1499;
56a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t data[kDataLengthInBytes];
57a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t* data_pointer = data;
5835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  memset(data, 1, kDataLengthInBytes);
5935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
6035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  reader_->InitializeReading(data, kDataLengthInBytes, kPacketSizeInBytes);
6135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  int length_to_read = reader_->NextPacket(&data_pointer);
6235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  VerifyPacketData(kDataLengthInBytes, length_to_read, data, data_pointer);
6335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(0, data_pointer - data);  // pointer hasn't moved
6435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
6535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  // Reading another one shall result in 0 bytes:
6635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  length_to_read = reader_->NextPacket(&data_pointer);
6735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(0, length_to_read);
6835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(kDataLengthInBytes, data_pointer - data);
6935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}
7035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
7135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org// Test with data length that exactly matches one packet
7235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgTEST_F(PacketReaderTest, NormalOnePacketData) {
73a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t data[kPacketSizeInBytes];
74a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t* data_pointer = data;
7535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  memset(data, 1, kPacketSizeInBytes);
7635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
7735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  reader_->InitializeReading(data, kPacketSizeInBytes, kPacketSizeInBytes);
7835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  int length_to_read = reader_->NextPacket(&data_pointer);
7935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  VerifyPacketData(kPacketSizeInBytes, length_to_read, data, data_pointer);
8035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(0, data_pointer - data);  // pointer hasn't moved
8135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
8235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  // Reading another one shall result in 0 bytes:
8335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  length_to_read = reader_->NextPacket(&data_pointer);
8435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(0, length_to_read);
854591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(kPacketSizeInBytes, static_cast<size_t>(data_pointer - data));
8635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}
8735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
8835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org// Test with data length that will result in 3 packets
8935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgTEST_F(PacketReaderTest, NormalLargeData) {
9035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  reader_->InitializeReading(packet_data_, kPacketDataLength,
9135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org                             kPacketSizeInBytes);
9235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
9335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  int length_to_read = reader_->NextPacket(&packet_data_pointer_);
9435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  VerifyPacketData(kPacketSizeInBytes, length_to_read,
9535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org                   packet1_, packet_data_pointer_);
9635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
9735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  length_to_read = reader_->NextPacket(&packet_data_pointer_);
9835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  VerifyPacketData(kPacketSizeInBytes, length_to_read,
9935a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org                   packet2_, packet_data_pointer_);
10035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
10135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  length_to_read = reader_->NextPacket(&packet_data_pointer_);
10235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  VerifyPacketData(1u, length_to_read,
10335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org                   packet3_, packet_data_pointer_);
10435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
10535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  // Reading another one shall result in 0 bytes:
10635a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  length_to_read = reader_->NextPacket(&packet_data_pointer_);
10735a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  EXPECT_EQ(0, length_to_read);
1084591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(kPacketDataLength,
1094591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(packet_data_pointer_ - packet_data_));
11035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}
11135a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
11235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org// Test with empty data.
11335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.orgTEST_F(PacketReaderTest, EmptyData) {
11435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  const int kDataLengthInBytes = 0;
115d41f59a23f333b61531045e9ff8cc99f022c5c49andrew@webrtc.org  // But don't really try to allocate a zero-length array...
116a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t data[kPacketSizeInBytes];
117a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org  uint8_t* data_pointer = data;
11835a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  reader_->InitializeReading(data, kDataLengthInBytes, kPacketSizeInBytes);
119d41f59a23f333b61531045e9ff8cc99f022c5c49andrew@webrtc.org  EXPECT_EQ(kDataLengthInBytes, reader_->NextPacket(&data_pointer));
12035a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org  // Do it again to make sure nothing changes
121d41f59a23f333b61531045e9ff8cc99f022c5c49andrew@webrtc.org  EXPECT_EQ(kDataLengthInBytes, reader_->NextPacket(&data_pointer));
12235a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}
12335a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org
12435a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}  // namespace test
12535a1756502707ffd88069b9ccdc97a80c68c9812kjellander@webrtc.org}  // namespace webrtc
126