// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/quic/network_connection.h"

#include "net/base/network_change_notifier.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {
namespace test {

class NetworkConnectionPeer {
 public:
  static NetworkChangeNotifier::ConnectionType connection_type(
      const NetworkConnection& network_connection) {
    return network_connection.connection_type_;
  }
  static void set_connection_type(NetworkConnection& network_connection,
                                  NetworkChangeNotifier::ConnectionType type) {
    network_connection.connection_type_ = type;
  }

  static const char* connection_description(
      const NetworkConnection& network_connection) {
    return network_connection.connection_description_;
  }
  static void set_connection_description(NetworkConnection& network_connection,
                                         const char* description) {
    network_connection.connection_description_ = description;
  }
};

// Test NetworkConnection().
class NetworkConnectionTest : public testing::Test {
 protected:
  void CheckNetworkConnectionDescription() {
    NetworkChangeNotifier::ConnectionType type =
        NetworkChangeNotifier::GetConnectionType();
    const char* description = network_connection_.GetDescription();
    // Verify GetDescription() updated the cached data.
    EXPECT_EQ(NetworkConnectionPeer::connection_type(network_connection_),
              type);
    EXPECT_EQ(
        NetworkConnectionPeer::connection_description(network_connection_),
        description);

    if (type != NetworkChangeNotifier::CONNECTION_WIFI)
      EXPECT_EQ(description,
                NetworkChangeNotifier::ConnectionTypeToString(type));
    else
      EXPECT_NE(nullptr, network_connection_.GetDescription());
  }

  NetworkConnection network_connection_;
};

TEST_F(NetworkConnectionTest, GetDescription) {
  const char* description = network_connection_.GetDescription();

  // Set connection description to nullptr.
  NetworkConnectionPeer::set_connection_description(network_connection_,
                                                    nullptr);
  CheckNetworkConnectionDescription();

  // Set connection type to a junk value.
  NetworkConnectionPeer::set_connection_type(
      network_connection_, NetworkChangeNotifier::CONNECTION_LAST);
  CheckNetworkConnectionDescription();

  EXPECT_EQ(description, network_connection_.GetDescription());
}

TEST_F(NetworkConnectionTest, Clear) {
  CheckNetworkConnectionDescription();
  network_connection_.Clear();
  CheckNetworkConnectionDescription();
}

}  // namespace test
}  // namespace net
