// Copyright (c) 2012 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 "chrome/browser/memory/tab_manager.h"

#include <algorithm>
#include <vector>

#include "base/logging.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "chrome/browser/memory/tab_manager_delegate_chromeos.h"
#include "chrome/browser/memory/tab_stats.h"
#include "chrome/common/url_constants.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

namespace memory {

typedef testing::Test TabManagerDelegateTest;

TEST_F(TabManagerDelegateTest, GetProcessHandles) {
  TabStats stats;
  std::vector<TabManagerDelegate::ProcessInfo> process_id_pairs;

  // Empty stats list gives empty |process_id_pairs| list.
  TabStatsList empty_list;
  process_id_pairs =
      TabManagerDelegate::GetChildProcessInfos(empty_list);
  EXPECT_EQ(0u, process_id_pairs.size());

  // Two tabs in two different processes generates two
  // |child_process_host_id| out.
  TabStatsList two_list;
  stats.child_process_host_id = 100;
  stats.renderer_handle = 101;
  two_list.push_back(stats);
  stats.child_process_host_id = 200;
  stats.renderer_handle = 201;
  two_list.push_back(stats);
  process_id_pairs = TabManagerDelegate::GetChildProcessInfos(two_list);
  EXPECT_EQ(2u, process_id_pairs.size());
  EXPECT_EQ(100, process_id_pairs[0].first);
  EXPECT_EQ(101, process_id_pairs[0].second);
  EXPECT_EQ(200, process_id_pairs[1].first);
  EXPECT_EQ(201, process_id_pairs[1].second);

  // Zero handles are removed.
  TabStatsList zero_handle_list;
  stats.child_process_host_id = 100;
  stats.renderer_handle = 0;
  zero_handle_list.push_back(stats);
  process_id_pairs =
      TabManagerDelegate::GetChildProcessInfos(zero_handle_list);
  EXPECT_EQ(0u, process_id_pairs.size());

  // Two tabs in the same process generates one handle out. When a duplicate
  // occurs the later instance is dropped.
  TabStatsList same_process_list;
  stats.child_process_host_id = 100;
  stats.renderer_handle = 101;
  same_process_list.push_back(stats);
  stats.child_process_host_id = 200;
  stats.renderer_handle = 201;
  same_process_list.push_back(stats);
  stats.child_process_host_id = 300;
  stats.renderer_handle = 101;  // Duplicate.
  same_process_list.push_back(stats);
  process_id_pairs =
      TabManagerDelegate::GetChildProcessInfos(same_process_list);
  EXPECT_EQ(2u, process_id_pairs.size());
  EXPECT_EQ(100, process_id_pairs[0].first);
  EXPECT_EQ(101, process_id_pairs[0].second);
  EXPECT_EQ(200, process_id_pairs[1].first);
  EXPECT_EQ(201, process_id_pairs[1].second);
}

}  // namespace memory