
// Copyright (c) 2013 The Chromium OS 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 "p2p/client/peer_selector.h"

#include "p2p/client/fake_service_finder.h"
#include "p2p/common/fake_clock.h"
#include "p2p/common/testutil.h"

#include <string>

#include <base/bind.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <metrics/metrics_library_mock.h>

using testing::_;

namespace p2p {

namespace client {

class PeerSelectorTest : public ::testing::Test {
 public:
  PeerSelectorTest() : ps_(&sf_, &clock_) {}

 protected:
  p2p::common::FakeClock clock_;
  FakeServiceFinder sf_;
  PeerSelector ps_;  // The PeerSelector under test.
  testing::StrictMock<MetricsLibraryMock> mock_metrics_lib_;
};

TEST_F(PeerSelectorTest, PickUrlForNonExistantId) {
  EXPECT_EQ(ps_.PickUrlForId("non-existant", 1), "");

  // Share some *other* files on the network.
  int peer = sf_.NewPeer("10.0.0.1", false, 1111);
  ASSERT_TRUE(sf_.PeerShareFile(peer, "some-file", 10240));
  ASSERT_TRUE(sf_.PeerShareFile(peer, "other-file", 10240));
  EXPECT_EQ(ps_.PickUrlForId("non-existant", 1), "");

  // PickUrlForId should not call Lookup().
  EXPECT_EQ(sf_.GetNumLookupCalls(), 0);
}

TEST_F(PeerSelectorTest, PickUrlForIdWithZeroBytes) {
  int peer1 = sf_.NewPeer("10.0.0.1", false, 1111);
  int peer2 = sf_.NewPeer("10.0.0.2", false, 2222);
  ASSERT_TRUE(sf_.PeerShareFile(peer1, "some-file", 0));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "some-file", 0));
  // PickUrlForId() should not return an URL for a peer sharing a 0-bytes file.
  EXPECT_EQ(ps_.PickUrlForId("some-file", 1), "");
}

TEST_F(PeerSelectorTest, PickUrlForIdWithMinimumSize) {
  int peer = sf_.NewPeer("10.0.0.1", false, 1111);
  ASSERT_TRUE(sf_.PeerShareFile(peer, "some-file", 999));

  // The file is too small.
  EXPECT_EQ(ps_.PickUrlForId("some-file", 1000), "");

  // The file is exactly the right size.
  EXPECT_EQ(ps_.PickUrlForId("some-file", 999),
      "http://10.0.0.1:1111/some-file");
}

TEST_F(PeerSelectorTest, PickUrlFromTheFirstThird) {
  int peer1 = sf_.NewPeer("2001:db8:85a3:0:0:8a2e:370:7334", true, 1111);
  int peer2 = sf_.NewPeer("10.0.0.2", false, 2222);
  int peer3 = sf_.NewPeer("10.0.0.3", false, 3333);
  int peer4 = sf_.NewPeer("10.0.0.4", false, 4444);
  ASSERT_TRUE(sf_.PeerShareFile(peer1, "some-file", 1000));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "some-file", 500));
  ASSERT_TRUE(sf_.PeerShareFile(peer3, "some-file", 300));
  ASSERT_TRUE(sf_.PeerShareFile(peer4, "some-file", 0));
  EXPECT_EQ(ps_.PickUrlForId("some-file", 1),
      "http://[2001:db8:85a3:0:0:8a2e:370:7334]:1111/some-file");
}

TEST_F(PeerSelectorTest, GetUrlAndWaitWithNoPeers) {
  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1), "");

  // GetUrlAndWait() should call Lookup() once, since doesn't need to wait.
  EXPECT_EQ(sf_.GetNumLookupCalls(), 1);
}

TEST_F(PeerSelectorTest, GetUrlAndWaitWithUnknownFile) {
  int peer1 = sf_.NewPeer("10.0.0.1", false, 1111);
  int peer2 = sf_.NewPeer("10.0.0.2", false, 2222);
  ASSERT_TRUE(sf_.PeerShareFile(peer1, "some-file", 1000));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "some-file", 500));

  EXPECT_EQ(ps_.GetUrlAndWait("unknown-file", 1), "");

  // GetUrlAndWait() should call Lookup() once, since doesn't need to wait.
  EXPECT_EQ(sf_.GetNumLookupCalls(), 1);
}

TEST_F(PeerSelectorTest, GetUrlAndWaitOnBusyNetwork) {
  // This test checks that GetUrlAndWait() doesn't return an URL for a file if
  // there are already too many connections on the network. The current limit is
  // set to 3. Update this test if you itentionally changed that value.
  const int max_connections = 3;

  int peer1 = sf_.NewPeer("10.0.0.1", false, 1111);
  int peer2 = sf_.NewPeer("10.0.0.2", false, 2222);
  ASSERT_TRUE(sf_.PeerShareFile(peer1, "some-file", 1000));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "some-file", 500));
  ASSERT_TRUE(sf_.SetPeerConnections(peer1, max_connections));
  ASSERT_TRUE(sf_.SetPeerConnections(peer2, max_connections-1));

  // After 2 Lookup() calls, the network is not as busy (|max_connections|
  // connections), but still not enough.
  ASSERT_TRUE(sf_.SetPeerConnectionsOnLookup(2, peer2, 0));

  // After 4 Lookup() calls, the network reaches the limit to allow the
  // download.
  ASSERT_TRUE(sf_.SetPeerConnectionsOnLookup(4, peer1, max_connections-1));

  // Make the test finish if more than 10 Lookup()'s are made.
  ASSERT_TRUE(sf_.RemoveAvailableFileOnLookup(10, "some-file"));

  // GetUrlAndWait should return the biggest file in this case.
  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1),
      "http://10.0.0.1:1111/some-file");

  EXPECT_EQ(sf_.GetNumLookupCalls(), 4);
  EXPECT_EQ(clock_.GetSleptTime(), base::TimeDelta::FromSeconds(3 * 30));
}

TEST_F(PeerSelectorTest, GetUrlAndWaitWhenThePeerGoesAway) {
  int peer1 = sf_.NewPeer("10.0.0.1", false, 1111);
  int peer2 = sf_.NewPeer("10.0.0.2", false, 2222);
  ASSERT_TRUE(sf_.PeerShareFile(peer1, "some-file", 1000));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "some-file", 500));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "other-file", 500));
  // A super-busy network.
  ASSERT_TRUE(sf_.SetPeerConnections(peer2, 999));

  // After 3 Lookup()'s, peer2 lost the file.
  ASSERT_TRUE(sf_.RemoveAvailableFileOnLookup(3, "some-file"));
  ASSERT_TRUE(sf_.PeerShareFileOnLookup(3, peer1, "some-file", 1000));

  // After 5 Lookup()'s, network is still busy, but the file is not present
  // anymore.
  ASSERT_TRUE(sf_.RemoveAvailableFileOnLookup(5, "some-file"));

  // To ensure test completion (with failure) remove any other file after 10
  // Lookup()'s.
  ASSERT_TRUE(sf_.SetPeerConnectionsOnLookup(10, peer2, 0));
  ASSERT_TRUE(sf_.RemoveAvailableFileOnLookup(10, "other-file"));

  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1), "");

  EXPECT_EQ(sf_.GetNumLookupCalls(), 5);
  EXPECT_EQ(clock_.GetSleptTime(), base::TimeDelta::FromSeconds(4 * 30));

  // Check the metrics. The Lookup should be kVanished.
  EXPECT_CALL(mock_metrics_lib_, SendEnumToUMA(
      "P2P.Client.LookupResult",
      PeerSelector::kVanished,
      PeerSelector::kNumLookupResults));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.NumPeers", 2, _, _, _));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.Vanished.WaitingTimeSeconds", 4 * 30, _, _, _));

  EXPECT_TRUE(ps_.ReportMetrics(&mock_metrics_lib_));
}

TEST_F(PeerSelectorTest, GetUrlDoesntWaitForSmallFiles) {
  int peer = sf_.NewPeer("10.0.0.1", false, 1111);
  ASSERT_TRUE(sf_.PeerShareFile(peer, "some-file", 500));

  // After 3 Lookup()'s, peer has a bigger file, but GetUrlAndWait() shouldn't
  // wait for it.
  ASSERT_TRUE(sf_.RemoveAvailableFileOnLookup(3, "some-file"));
  ASSERT_TRUE(sf_.PeerShareFileOnLookup(3, peer, "some-file", 2000));

  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1000), "");

  EXPECT_EQ(sf_.GetNumLookupCalls(), 1);
  EXPECT_EQ(clock_.GetSleptTime(), base::TimeDelta::FromSeconds(0));

  // Check the metrics. The Lookup should be kVanished.
  EXPECT_CALL(mock_metrics_lib_, SendEnumToUMA(
      "P2P.Client.LookupResult",
      PeerSelector::kNotFound,
      PeerSelector::kNumLookupResults));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.NumPeers", 1, _, _, _));

  EXPECT_TRUE(ps_.ReportMetrics(&mock_metrics_lib_));
}

TEST_F(PeerSelectorTest, ReportMetricsFailsWhenNoLookup) {
  // This is to ensure that the check for calling ReportMetrics without calling
  // GetUrlAndWait() before works.
  EXPECT_FALSE(ps_.ReportMetrics(&mock_metrics_lib_));
}

TEST_F(PeerSelectorTest, ReportMetricsOnFilteredNetwork) {
  sf_.SetServiceFiltered(true);

  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1000), "");

  EXPECT_CALL(mock_metrics_lib_, SendEnumToUMA(
      "P2P.Client.LookupResult", PeerSelector::kFiltered, _));

  EXPECT_TRUE(ps_.ReportMetrics(&mock_metrics_lib_));
}

TEST_F(PeerSelectorTest, ReportMetricsWhenFound) {
  int peer1 = sf_.NewPeer("10.0.0.1", false, 1111);
  int peer2 = sf_.NewPeer("10.0.0.2", false, 2222);
  int peer3 = sf_.NewPeer("10.0.0.3", false, 3333);
  int peer4 = sf_.NewPeer("10.0.0.4", false, 4444);
  ASSERT_TRUE(sf_.PeerShareFile(peer1, "some-file", 2000));
  ASSERT_TRUE(sf_.PeerShareFile(peer2, "some-file", 500));
  ASSERT_TRUE(sf_.PeerShareFile(peer3, "other-file", 500));
  ASSERT_TRUE(sf_.PeerShareFile(peer4, "some-file", 0));
  ASSERT_TRUE(sf_.SetPeerConnections(peer1, 1));

  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1),
      "http://10.0.0.1:1111/some-file");

  EXPECT_EQ(sf_.GetNumLookupCalls(), 1);

  // Check the metrics.
  EXPECT_CALL(mock_metrics_lib_, SendEnumToUMA(
      "P2P.Client.LookupResult",
      PeerSelector::kFound,
      PeerSelector::kNumLookupResults));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.NumPeers", 4, _, _, _));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.Found.ConnectionCount", 1, _, _, _));
  // Only two peers are sharing a non-empty file.
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.Found.CandidateCount", 2, _, _, _));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.Found.WaitingTimeSeconds", 0, _, _, _));

  EXPECT_TRUE(ps_.ReportMetrics(&mock_metrics_lib_));
}

TEST_F(PeerSelectorTest, ReportMetricsWhenCanceled) {
  // Technically speaking, the call to Abort should be made *while*
  // GetUrlAndWait() is running, but we could also call it right before.
  ps_.Abort();
  EXPECT_EQ(ps_.GetUrlAndWait("some-file", 1), "");

  EXPECT_EQ(sf_.GetNumLookupCalls(), 1);

  // Check the metrics.
  EXPECT_CALL(mock_metrics_lib_, SendEnumToUMA(
      "P2P.Client.LookupResult",
      PeerSelector::kCanceled,
      PeerSelector::kNumLookupResults));
  EXPECT_CALL(mock_metrics_lib_, SendToUMA(
      "P2P.Client.Canceled.WaitingTimeSeconds", 0, _, _, _));

  EXPECT_TRUE(ps_.ReportMetrics(&mock_metrics_lib_));
}

}  // namespace client

}  // namespace p2p
