1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
|
// Copyright 2018 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_CREDENTIAL_PROVIDER_TEST_GLS_RUNNER_TEST_BASE_H_
#define CHROME_CREDENTIAL_PROVIDER_TEST_GLS_RUNNER_TEST_BASE_H_
#include <wrl/client.h>
#include "base/base_paths_win.h"
#include "base/test/scoped_path_override.h"
#include "base/test/test_reg_util_win.h"
#include "chrome/credential_provider/common/gcp_strings.h"
#include "chrome/credential_provider/gaiacp/gaia_credential_provider.h"
#include "chrome/credential_provider/test/com_fakes.h"
#include "chrome/credential_provider/test/gcp_fakes.h"
#include "google_apis/gaia/gaia_id.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace credential_provider {
namespace testing {
extern const char kDefaultEmail[];
extern const GaiaId::Literal kDefaultGaiaId;
extern const wchar_t kDefaultUsername[];
extern const char kDefaultInvalidTokenHandleResponse[];
extern const char kDefaultValidTokenHandleResponse[];
// Helper class used to test the full call sequence of a credential provider by
// LoginUI. This includes creation of a credential provider filter and
// application of remote credentials if specified. There are default token
// handle responses (always valid token handles) and usage scenarios
// (CPUS_LOGON) that can be overridden before starting the call sequence for the
// credential provider.
class GlsRunnerTestBase : public ::testing::Test {
public:
// Gets a command line that runs a fake GLS that produces the desired output.
// |default_exit_code| is the default value that will be written unless the
// other command line arguments require a specific error code to be returned.
static HRESULT GetFakeGlsCommandline(UiExitCodes default_exit_code,
const std::string& gls_email,
const GaiaId& gaia_id_override,
const std::string& gaia_password,
const std::string& full_name_override,
const std::wstring& start_gls_event_name,
bool ignore_expected_gaia_id,
base::CommandLine* command_line);
protected:
GlsRunnerTestBase();
~GlsRunnerTestBase() override;
void SetUp() override;
void TearDown() override;
FakeOSUserManager* fake_os_user_manager() { return &fake_os_user_manager_; }
FakeWinHttpUrlFetcherFactory* fake_http_url_fetcher_factory() {
return &fake_http_url_fetcher_factory_;
}
FakeCredentialProviderUserArray* fake_user_array() {
return &fake_user_array_;
}
FakeAssociatedUserValidator* fake_associated_user_validator() {
return &fake_associated_user_validator_;
}
FakePasswordRecoveryManager* fake_password_recovery_manager() {
return &fake_password_recovery_manager_;
}
FakeGemDeviceDetailsManager* fake_gem_device_details_manager() {
return &fake_gem_device_details_manager_;
}
FakeCredentialProviderEvents* fake_provider_events() {
return &fake_provider_events_;
}
FakeCredentialProviderCredentialEvents*
fake_credential_provider_credential_events() {
return &fake_credential_provider_credential_events_;
}
FakeInternetAvailabilityChecker* fake_internet_checker() {
return &fake_internet_checker_;
}
FakeChromeAvailabilityChecker* fake_chrome_checker() {
return &fake_chrome_checker_;
}
const Microsoft::WRL::ComPtr<ICredentialProvider>& created_provider() const {
return gaia_provider_;
}
void SetSidLockingWorkstation(const std::wstring& sid) {
sid_locking_workstation_ = sid;
}
void SetDefaultTokenHandleResponse(const std::string& response) {
default_token_handle_response_ = response;
}
void SetUsageScenario(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus) {
// Must be called before creating the provide. The usage does not normally
// change during the execution of a provider.
DCHECK(!gaia_provider_);
cpus_ = cpus;
}
// Creates the provider and also all the credentials associated to users that
// are already created before this call. Fills |credential_count| with the
// number of credentials in the provider and |provider| with a pointer to the
// created provider (this also correctly adds a reference to the provider).
HRESULT
InitializeProviderWithCredentials(DWORD* credential_count,
ICredentialProvider** provider);
// Creates the provider and also all the credentials associated to users that
// are already created before this call. If |pcps_in| is non null then it will
// pass this information as remote credentials to the credential provider
// filter and provider. Fills |provider| with a pointer to the created
// provider (this also correctly adds a reference to the provider).
HRESULT
InitializeProviderWithRemoteCredentials(
const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs_in,
ICredentialProvider** provider);
// Creates the provider and also all the credentials associated to users that
// are already created before this call. Once credentials are created, the
// function tries to fill |credential| with the credential at index |index|.
HRESULT InitializeProviderAndGetCredential(
DWORD index,
ICredentialProviderCredential** credential);
// Used to release the provider before normal TearDown to test certain
// cancellation scenarios. No other references should be held on the provider
// to ensure that the provider can actually be released.
HRESULT ReleaseProvider();
// Initiates the logon process on the current |testing_credential_| that
// is selected by a call to InitializeProviderAndGetCredential.
// |succeeds| specifies whether we expect the first call to GetSerialization
// on |testing_credential_| to succeed and start a GLS process or not.
// If false, we will check that an appropriate error has been returned.
HRESULT StartLogonProcess(bool succeeds);
// The below method provides additional control of expecting a specific
// error message whenever the logon process is expected to fail.
// The |expected_error_message| is the id of the error message defined
// under gaia_resources.grd file.
HRESULT StartLogonProcess(bool succeeds, int expected_error_message);
// Waits for the GLS process that was started in StartLogonProcess to
// complete and returns.
HRESULT WaitForLogonProcess();
// Combines StartLogonProcess and WaitForLogonProcess.
HRESULT StartLogonProcessAndWait();
// Calls the final GetSerialization on the |testing_credential_| to complete
// the logon process. |expected_success| specifies whether the final
// GetSerialization is expected to succeed.
// |expected_credentials_change_fired| specifies if a credential changed fired
// event should have been detected by the provider. |expected_error_message|
// is the error message that is expected. This message only applies if
// |expected_success| is false.
// This function combines the calls to FinishLogonProcessWithPred and
// ReportLogonProcessResult which can be called separately to perform extra
// operations between the last GetSerialization and the call to ReportResult.
HRESULT FinishLogonProcess(bool expected_success,
bool expected_credentials_change_fired,
int expected_error_message);
HRESULT FinishLogonProcess(bool expected_success,
bool expected_credentials_change_fired,
const std::wstring& expected_error_message);
HRESULT FinishLogonProcessWithCred(
bool expected_success,
bool expected_credentials_change_fired,
int expected_error_message,
const Microsoft::WRL::ComPtr<ICredentialProviderCredential>&
local_testing_cred);
HRESULT FinishLogonProcessWithCred(
bool expected_success,
bool expected_credentials_change_fired,
const std::wstring& expected_error_message,
const Microsoft::WRL::ComPtr<ICredentialProviderCredential>&
local_testing_cred);
HRESULT ReportLogonProcessResult(
const Microsoft::WRL::ComPtr<ICredentialProviderCredential>&
local_testing_cred);
private:
HRESULT InternalInitializeProvider(
const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs_in,
DWORD* count);
HRESULT ApplyProviderFilter(
const Microsoft::WRL::ComPtr<ICredentialProvider>& provider,
const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs_in,
CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs_out,
HRESULT* update_remote_credentials_hr);
registry_util::RegistryOverrideManager registry_override_;
FakeOSProcessManager fake_os_process_manager_;
FakeOSUserManager fake_os_user_manager_;
FakeScopedLsaPolicyFactory fake_scoped_lsa_policy_factory_;
FakeScopedUserProfileFactory fake_scoped_user_profile_factory_;
FakeInternetAvailabilityChecker fake_internet_checker_;
FakeAssociatedUserValidator fake_associated_user_validator_;
FakePasswordRecoveryManager fake_password_recovery_manager_;
FakeGemDeviceDetailsManager fake_gem_device_details_manager_;
FakeWinHttpUrlFetcherFactory fake_http_url_fetcher_factory_;
FakeCredentialProviderEvents fake_provider_events_;
FakeCredentialProviderCredentialEvents
fake_credential_provider_credential_events_;
FakeCredentialProviderUserArray fake_user_array_;
FakeChromeAvailabilityChecker fake_chrome_checker_;
// SID of the user that is considered to be locking the workstation. This is
// only relevant for CPUS_UNLOCK_WORKSTATION usage.
std::wstring sid_locking_workstation_;
// Reference to the provider that is created and owned by this class.
Microsoft::WRL::ComPtr<ICredentialProvider> gaia_provider_;
// Reference to the credential in provider that is being tested by this class.
// This member is kept so that it can be automatically released on destruction
// of the test if the test did not explicitly release it. This allows us to
// write less boiler plate test code and ensures that proper destruction order
// of the credentials is respected.
Microsoft::WRL::ComPtr<ICredentialProviderCredential> testing_cred_;
// Keeps track of whether a logon process has started for |testing_cred_|.
// Testers who do not explicitly call FinishLogonProcess before the end of
// their test will leave the completion of the logon process to the TearDown
// of this class.
bool logon_process_started_successfully_ = false;
// The current usage scenario that this test is running. This should be
// set before |gaia_provider_| is set.
CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus_;
// Default response returned by |fake_http_url_fetcher_factory_| when checking
// for token handle validity.
std::string default_token_handle_response_;
base::ScopedTempDir scoped_temp_program_files_dir_;
base::ScopedTempDir scoped_temp_program_files_x86_dir_;
base::ScopedTempDir scoped_temp_progdata_dir_;
std::unique_ptr<base::ScopedPathOverride> program_files_override_;
std::unique_ptr<base::ScopedPathOverride> program_files_x86_override_;
std::unique_ptr<base::ScopedPathOverride> programdata_override_;
};
} // namespace testing
} // namespace credential_provider
#endif // CHROME_CREDENTIAL_PROVIDER_TEST_GLS_RUNNER_TEST_BASE_H_
|