// Copyright 2020 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 "base/bind.h"
#include "base/callback.h"
#include "base/run_loop.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/ash/crostini/crostini_browser_test_util.h"
#include "chrome/browser/ash/crostini/crostini_util.h"
#include "chrome/browser/ash/crostini/fake_crostini_features.h"
#include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
#include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/dbus/vm_applications/apps.pb.h"
#include "content/public/test/browser_test.h"

namespace crostini {

namespace {}

class CrostiniBrowserTest : public CrostiniBrowserTestBase {
 public:
  CrostiniBrowserTest() : CrostiniBrowserTestBase(/*register_termina=*/true) {}

  void RegisterApp() {
    vm_tools::apps::App app;
    app.set_desktop_file_id("app_id");

    vm_tools::apps::App::LocaleString::Entry* entry =
        app.mutable_name()->add_values();
    entry->set_locale(std::string());
    entry->set_value("app_name");

    vm_tools::apps::ApplicationList app_list;
    app_list.set_vm_name(kCrostiniDefaultVmName);
    app_list.set_container_name(kCrostiniDefaultContainerName);
    *app_list.add_apps() = app;

    guest_os::GuestOsRegistryServiceFactory::GetForProfile(browser()->profile())
        ->UpdateApplicationList(app_list);
  }

  void LaunchApp() {
    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
    LaunchCrostiniApp(browser()->profile(), kAppId, display::kInvalidDisplayId,
                      {},
                      base::BindOnce(
                          [](base::OnceClosure quit_closure, bool success,
                             const std::string& failure_reason) {
                            EXPECT_TRUE(success) << failure_reason;
                            std::move(quit_closure).Run();
                          },
                          run_loop.QuitClosure()));
    run_loop.Run();
  }

  const std::string kAppId = guest_os::GuestOsRegistryService::GenerateAppId(
      "app_id",
      kCrostiniDefaultVmName,
      kCrostiniDefaultContainerName);
};

IN_PROC_BROWSER_TEST_F(CrostiniBrowserTest, LaunchApplication) {
  RegisterApp();
  LaunchApp();
}

class CrostiniForbiddenBrowserTest : public CrostiniBrowserTest {
 public:
  CrostiniForbiddenBrowserTest() {
    fake_crostini_features_.set_could_be_allowed(true);
    fake_crostini_features_.set_is_allowed_now(false);
  }
};

// Test launching an application when enterprise policy changed during the
// session to allow crostini.
IN_PROC_BROWSER_TEST_F(CrostiniForbiddenBrowserTest, LaunchApplication) {
  fake_crostini_features_.set_is_allowed_now(true);
  RegisterApp();
  LaunchApp();
}

}  // namespace crostini
