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

#ifndef CHROME_BROWSER_ASH_LOGIN_LOGIN_MANAGER_TEST_H_
#define CHROME_BROWSER_ASH_LOGIN_LOGIN_MANAGER_TEST_H_

#include <string>

#include "chrome/browser/ash/login/test/embedded_test_server_setup_mixin.h"
#include "chrome/test/base/mixin_based_in_process_browser_test.h"

class AccountId;

namespace ash {

class UserContext;

// Base class for Chrome OS Login tests. Should be used if you need to start at
// the Chrome OS Login screen (especially with existing users). For the tests
// that are focused more on OOBE - prefer OobeBaseTest. Use LoginManagerMixin to
// configure users for tests.
class LoginManagerTest : public MixinBasedInProcessBrowserTest {
 public:
  LoginManagerTest();

  LoginManagerTest(const LoginManagerTest&) = delete;
  LoginManagerTest& operator=(const LoginManagerTest&) = delete;

  ~LoginManagerTest() override;

  void SetUpCommandLine(base::CommandLine* command_line) override;
  void SetUpOnMainThread() override;

  // Could be used to registers the user with the given `account_id` on the
  // device. This method should be called in PRE_* test. Use only if necessary,
  // prefer LoginManagerMixin instead.
  void RegisterUser(const AccountId& account_id);

  static const char kPassword[];
  static const char kLocalPassword[];
  UserContext CreateUserContext(const AccountId& account_id,
                                const std::string& password);

  UserContext CreateUserContextWithLocalPassword(const AccountId& account_id,
                                                 const std::string& password);

  UserContext CreateUserContextWithPin(const AccountId& account_id,
                                       const std::string& pin);

  // Set expected credentials for next login attempt.
  void SetExpectedCredentials(const UserContext& user_context);

  // Tries to login with the credentials in `user_context`. The return value
  // indicates whether the login attempt succeeded.
  bool TryToLogin(const UserContext& user_context);

  // Tries to add the user identified and authenticated by `user_context` to the
  // session. The return value indicates whether the attempt succeeded. This
  // method does the same as TryToLogin() but doesn't verify that the new user
  // has become the active user.
  bool AddUserToSession(const UserContext& user_context);

  // Log in user with `user_id`. User should be registered using RegisterUser().
  void LoginUser(const AccountId& account_id);

  // Log in user with local password.
  void LoginUserWithLocalPassword(const AccountId& account_id);

  // Log in user with pin.
  void LoginUserWithPin(const AccountId& account_id);

  // Add user with `user_id` to session.
  void AddUser(const AccountId& user_id);

  // TODO(b/260718534): Fully switch from StubAuthenticator to
  // FakeUserDataAuthClient.
  void LoginUserWithDbusClient(const AccountId& account_id,
                               const std::string& password);
  void AddUserWithDbusClient(const AccountId& account_id,
                             const std::string& password);
  void SetExpectedCredentialsWithDbusClient(const AccountId& account_id,
                                            const std::string& password);

  void set_should_launch_browser(bool launch) {
    should_launch_browser_ = launch;
  }

 private:
  bool should_launch_browser_ = false;
  EmbeddedTestServerSetupMixin embedded_test_server_{&mixin_host_,
                                                     embedded_test_server()};
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_LOGIN_LOGIN_MANAGER_TEST_H_
