/*
 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/voice_engine/include/voe_network.h"

#include "webrtc/test/gtest.h"
#include "webrtc/voice_engine/include/voe_errors.h"
#include "webrtc/voice_engine/voice_engine_fixture.h"

namespace webrtc {

enum {
  kMinValidSizeOfRtcpPacketInBytes = 4,
  kMinValidSizeOfRtpPacketInBytes = 12,
  kMaxValidSizeOfRtpPacketInBytes = 1292
};

// A packet with a valid header for both RTP and RTCP.
// Methods that are tested in this file are checking only packet header.
static const uint8_t kPacket[kMinValidSizeOfRtpPacketInBytes] = {0x80};
static const uint8_t kPacketJunk[kMinValidSizeOfRtpPacketInBytes] = {};

static const int kNonExistingChannel = 1234;

class VoENetworkTest : public VoiceEngineFixture {
 protected:
  int CreateChannelAndRegisterExternalTransport() {
    EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
    int channelID = base_->CreateChannel();
    EXPECT_NE(channelID, -1);
    EXPECT_EQ(0, network_->RegisterExternalTransport(channelID, transport_));
    return channelID;
  }
};

TEST_F(VoENetworkTest, RegisterAndDeRegisterExternalTransport) {
  int channelID = CreateChannelAndRegisterExternalTransport();
  EXPECT_EQ(0, network_->DeRegisterExternalTransport(channelID));
}

TEST_F(VoENetworkTest,
       RegisterExternalTransportOnNonExistingChannelShouldFail) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  EXPECT_NE(
      0, network_->RegisterExternalTransport(kNonExistingChannel, transport_));
}

TEST_F(VoENetworkTest,
       DeRegisterExternalTransportOnNonExistingChannelShouldFail) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  EXPECT_NE(0, network_->DeRegisterExternalTransport(kNonExistingChannel));
}

TEST_F(VoENetworkTest, DeRegisterExternalTransportBeforeRegister) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  int channelID = base_->CreateChannel();
  EXPECT_NE(channelID, -1);
  EXPECT_EQ(0, network_->DeRegisterExternalTransport(channelID));
}

TEST_F(VoENetworkTest, ReceivedRTPPacketWithJunkDataShouldFail) {
  int channelID = CreateChannelAndRegisterExternalTransport();
  EXPECT_EQ(-1, network_->ReceivedRTPPacket(channelID, kPacketJunk,
                                            sizeof(kPacketJunk)));
}

TEST_F(VoENetworkTest, ReceivedRTPPacketOnNonExistingChannelShouldFail) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  EXPECT_EQ(-1, network_->ReceivedRTPPacket(kNonExistingChannel, kPacket,
                                            sizeof(kPacket)));
}

TEST_F(VoENetworkTest, ReceivedRTPPacketOnChannelWithoutTransportShouldFail) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  int channelID = base_->CreateChannel();
  EXPECT_NE(channelID, -1);
  EXPECT_EQ(-1,
            network_->ReceivedRTPPacket(channelID, kPacket, sizeof(kPacket)));
}

TEST_F(VoENetworkTest, ReceivedTooSmallRTPPacketShouldFail) {
  int channelID = CreateChannelAndRegisterExternalTransport();
  EXPECT_EQ(-1, network_->ReceivedRTPPacket(
                    channelID, kPacket, kMinValidSizeOfRtpPacketInBytes - 1));
}

TEST_F(VoENetworkTest, ReceivedTooLargeRTPPacketShouldFail) {
  int channelID = CreateChannelAndRegisterExternalTransport();
  EXPECT_EQ(-1, network_->ReceivedRTPPacket(
                    channelID, kPacket, kMaxValidSizeOfRtpPacketInBytes + 1));
}

TEST_F(VoENetworkTest, ReceivedRTCPPacketOnNonExistingChannelShouldFail) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  EXPECT_EQ(-1, network_->ReceivedRTCPPacket(kNonExistingChannel, kPacket,
                                             sizeof(kPacket)));
}

TEST_F(VoENetworkTest, ReceivedRTCPPacketOnChannelWithoutTransportShouldFail) {
  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
  int channelID = base_->CreateChannel();
  EXPECT_NE(channelID, -1);
  EXPECT_EQ(-1,
            network_->ReceivedRTCPPacket(channelID, kPacket, sizeof(kPacket)));
}

TEST_F(VoENetworkTest, ReceivedTooSmallRTCPPacket4ShouldFail) {
  int channelID = CreateChannelAndRegisterExternalTransport();
  EXPECT_EQ(-1, network_->ReceivedRTCPPacket(
                    channelID, kPacket, kMinValidSizeOfRtcpPacketInBytes - 1));
}

}  // namespace webrtc
