// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/socket.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace starboard {
namespace nplb {
namespace {

class SbSocketCreateTest
    : public ::testing::TestWithParam<SbSocketAddressType> {
 public:
  SbSocketAddressType GetAddressType() { return GetParam(); }
};

class PairSbSocketCreateTest
    : public ::testing::TestWithParam<
          std::pair<SbSocketAddressType, SbSocketProtocol> > {
 public:
  SbSocketAddressType GetAddressType() { return GetParam().first; }
  SbSocketProtocol GetProtocol() { return GetParam().second; }
};

TEST_P(PairSbSocketCreateTest, Create) {
  SbSocket socket = SbSocketCreate(GetAddressType(), GetProtocol());
#if !SB_HAS(IPV6)
  // It is allowed for a platform not to support IPv6 sockets, but we use this
  // test to at least exercise the code path.
  if (kSbSocketAddressTypeIpv6 == GetAddressType()) {
    if (SbSocketIsValid(socket)) {
      EXPECT_TRUE(SbSocketDestroy(socket));
    }
    return;
  }
#endif
  if (kSbSocketProtocolUdp == GetProtocol()) {
    // It is allowed for a platform not to support UDP sockets, but we use this
    // test to at least exercise the code path.
    if (SbSocketIsValid(socket)) {
      EXPECT_TRUE(SbSocketDestroy(socket));
    }
    return;
  }
  ASSERT_TRUE(SbSocketIsValid(socket));
  EXPECT_TRUE(SbSocketDestroy(socket));
}

TEST_P(SbSocketCreateTest, ATonOfTcp) {
  const int kATon = 4096;
  for (int i = 0; i < kATon; ++i) {
    SbSocket socket = SbSocketCreate(GetAddressType(), kSbSocketProtocolTcp);
    ASSERT_TRUE(SbSocketIsValid(socket));
    EXPECT_TRUE(SbSocketDestroy(socket));
  }
}

TEST_P(SbSocketCreateTest, ManyTcpAtOnce) {
  const int kMany = 32;
  SbSocket sockets[kMany] = {0};
  for (int i = 0; i < kMany; ++i) {
    sockets[i] = SbSocketCreate(GetAddressType(), kSbSocketProtocolTcp);
    ASSERT_TRUE(SbSocketIsValid(sockets[i]));
  }

  for (int i = 0; i < kMany; ++i) {
    EXPECT_TRUE(SbSocketDestroy(sockets[i]));
  }
}

#if SB_HAS(IPV6)
INSTANTIATE_TEST_CASE_P(SbSocketAddressTypes,
                        SbSocketCreateTest,
                        ::testing::Values(kSbSocketAddressTypeIpv4,
                                          kSbSocketAddressTypeIpv6));
#else
INSTANTIATE_TEST_CASE_P(SbSocketAddressTypes,
                        SbSocketCreateTest,
                        ::testing::Values(kSbSocketAddressTypeIpv4));
#endif

INSTANTIATE_TEST_CASE_P(
    SbSocketTypes,
    PairSbSocketCreateTest,
    ::testing::Values(
        std::make_pair(kSbSocketAddressTypeIpv4, kSbSocketProtocolTcp),
        std::make_pair(kSbSocketAddressTypeIpv4, kSbSocketProtocolUdp),
        std::make_pair(kSbSocketAddressTypeIpv6, kSbSocketProtocolTcp),
        std::make_pair(kSbSocketAddressTypeIpv6, kSbSocketProtocolUdp)));

}  // namespace
}  // namespace nplb
}  // namespace starboard
