// Copyright 2013 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.

#import "chrome/browser/ui/app_list/app_list_service_mac.h"

#include <vector>

#include "base/command_line.h"
#include "chrome/browser/apps/app_shim/app_shim_handler_mac.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/mac/app_mode_common.h"
#include "chrome/test/base/in_process_browser_test.h"
#import "ui/app_list/cocoa/app_list_window_controller.h"

using apps::AppShimHandler;

namespace test {

class AppListServiceMacTestApi {
 public:
  static AppListWindowController* window_controller() {
    return AppListServiceMac::GetInstance()->window_controller_;
  }
};

}  // namespace test

namespace {

// Browser test for mac-specific AppListService functionality.
class AppListServiceMacInteractiveTest : public InProcessBrowserTest,
                                         public AppShimHandler::Host {
 public:
  AppListServiceMacInteractiveTest() : launch_count_(0) {}

 protected:
  void LaunchShim() {
    // AppList shims always launch normally (never relaunched via dock icon).
    AppShimHandler::GetForAppMode(app_mode::kAppListModeId)->
        OnShimLaunch(this,
                     apps::APP_SHIM_LAUNCH_NORMAL,
                     std::vector<base::FilePath>());
  }

  AppListViewController* GetViewController() {
    return [test::AppListServiceMacTestApi::window_controller()
        appListViewController];
  }

  // testing::Test overrides:
  virtual void TearDown() override {
    // At tear-down, NOTIFICATION_APP_TERMINATING should have been sent for the
    // browser shutdown. References to browser-owned objects must be removed
    // from the app list UI.
    AppListViewController* view_controller = GetViewController();
    // Note this first check will fail if the test doesn't ever show the
    // app list, but currently all tests in this file do.
    EXPECT_TRUE(view_controller);
    EXPECT_FALSE([view_controller delegate]);
  }

  // AppShimHandler::Host overrides:
  virtual void OnAppLaunchComplete(apps::AppShimLaunchResult result) override {
    // AppList shims are always given APP_SHIM_LAUNCH_DUPLICATE_HOST, indicating
    // that the shim process should immediately close.
    EXPECT_EQ(apps::APP_SHIM_LAUNCH_DUPLICATE_HOST, result);
    ++launch_count_;
  }
  virtual void OnAppClosed() override {
    NOTREACHED();
  }
  virtual void OnAppHide() override {}
  virtual void OnAppRequestUserAttention(
      apps::AppShimAttentionType type) override {}
  virtual base::FilePath GetProfilePath() const override {
    NOTREACHED();  // Currently unused in this test.
    return base::FilePath();
  }
  virtual std::string GetAppId() const override {
    return app_mode::kAppListModeId;
  }

  int launch_count_;

 private:
  DISALLOW_COPY_AND_ASSIGN(AppListServiceMacInteractiveTest);
};

}  // namespace

IN_PROC_BROWSER_TEST_F(AppListServiceMacInteractiveTest, ShowAppListUsingShim) {
  // Check that AppListService has registered as a shim handler for "app_list".
  EXPECT_TRUE(AppShimHandler::GetForAppMode(app_mode::kAppListModeId));

  AppListService* service =
      AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE);
  EXPECT_FALSE(service->IsAppListVisible());

  // Creation should be lazy.
  EXPECT_FALSE(GetViewController());

  // With no saved profile, the default profile should be chosen and saved.
  service->Show();
  EXPECT_EQ(browser()->profile(), service->GetCurrentAppListProfile());
  EXPECT_TRUE(service->IsAppListVisible());
  EXPECT_EQ(0, launch_count_);
  service->DismissAppList();
  EXPECT_FALSE(service->IsAppListVisible());

  // Test showing the app list via the shim. The shim should immediately close
  // leaving the app list visible.
  LaunchShim();
  EXPECT_TRUE(service->IsAppListVisible());
  EXPECT_EQ(1, launch_count_);

  // Launching again should toggle the app list.
  LaunchShim();
  EXPECT_FALSE(service->IsAppListVisible());
  EXPECT_EQ(2, launch_count_);

  // Test showing the app list via the shim, then dismissing the app list.
  LaunchShim();
  EXPECT_TRUE(service->IsAppListVisible());
  EXPECT_EQ(3, launch_count_);
  service->DismissAppList();
  EXPECT_FALSE(service->IsAppListVisible());

  // View sticks around until shutdown.
  AppListViewController* view_controller = GetViewController();
  EXPECT_TRUE(view_controller);
  EXPECT_TRUE([view_controller delegate]);
}
