blob: fc2bffa5a9015c6b8399c9f73eccb8197765e234 [file] [log] [blame]
// Copyright 2018 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.
#ifndef CHROME_CREDENTIAL_PROVIDER_TEST_COM_FAKES_H_
#define CHROME_CREDENTIAL_PROVIDER_TEST_COM_FAKES_H_
#include <atlcomcli.h>
#include <credentialprovider.h>
#include <propkey.h>
#include <vector>
#include "base/strings/string16.h"
#include "chrome/credential_provider/gaiacp/gaia_credential_provider.h"
#include "chrome/credential_provider/gaiacp/gaia_credential_provider_i.h"
#include "chrome/credential_provider/test/test_credential_provider.h"
namespace credential_provider {
namespace testing {
#define DECLARE_IUNKOWN_NOQI_WITH_REF() \
IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) override; \
ULONG STDMETHODCALLTYPE AddRef() override; \
ULONG STDMETHODCALLTYPE Release(void) override; \
ULONG ref_count_ = 1;
///////////////////////////////////////////////////////////////////////////////
// Fake the CredentialProviderUserArray COM object.
class FakeCredentialProviderUser : public ICredentialProviderUser {
public:
FakeCredentialProviderUser(const wchar_t* sid, const wchar_t* username);
virtual ~FakeCredentialProviderUser();
private:
// ICredentialProviderUser
DECLARE_IUNKOWN_NOQI_WITH_REF()
HRESULT STDMETHODCALLTYPE GetSid(wchar_t** sid) override;
HRESULT STDMETHODCALLTYPE GetProviderID(GUID* providerID) override;
HRESULT STDMETHODCALLTYPE GetStringValue(REFPROPERTYKEY key,
wchar_t** stringValue) override;
HRESULT STDMETHODCALLTYPE GetValue(REFPROPERTYKEY key,
PROPVARIANT* value) override;
base::string16 sid_;
base::string16 username_;
};
///////////////////////////////////////////////////////////////////////////////
// Fake the CredentialProviderUserArray COM object.
class FakeCredentialProviderUserArray : public ICredentialProviderUserArray {
public:
FakeCredentialProviderUserArray();
virtual ~FakeCredentialProviderUserArray();
void AddUser(const wchar_t* sid, const wchar_t* username) {
users_.emplace_back(sid, username);
}
void SetAccountOptions(CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS cpao) {
cpao_ = cpao;
}
private:
// ICredentialProviderUserArray
DECLARE_IUNKOWN_NOQI_WITH_REF()
IFACEMETHODIMP SetProviderFilter(REFGUID guidProviderToFilterTo) override;
IFACEMETHODIMP GetAccountOptions(
CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS* cpao) override;
IFACEMETHODIMP GetCount(DWORD* userCount) override;
IFACEMETHODIMP GetAt(DWORD index, ICredentialProviderUser** user) override;
std::vector<FakeCredentialProviderUser> users_;
CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS cpao_ = CPAO_NONE;
};
///////////////////////////////////////////////////////////////////////////////
// Fake OS imlpementation of ICredentialProviderEvents.
class FakeCredentialProviderEvents : public ICredentialProviderEvents {
public:
FakeCredentialProviderEvents();
virtual ~FakeCredentialProviderEvents();
// ICredentialProviderEvents
DECLARE_IUNKOWN_NOQI_WITH_REF()
IFACEMETHODIMP CredentialsChanged(UINT_PTR upAdviseContext) override;
bool CredentialsChangedReceived() const { return did_change_; }
void ResetCredentialsChangedReceived() { did_change_ = false; }
private:
bool did_change_ = false;
};
///////////////////////////////////////////////////////////////////////////////
// Fake OS imlpementation of ICredentialProviderEvents.
class FakeCredentialProviderCredentialEvents
: public ICredentialProviderCredentialEvents {
public:
FakeCredentialProviderCredentialEvents();
virtual ~FakeCredentialProviderCredentialEvents();
// ICredentialProviderCredentialEvents
DECLARE_IUNKOWN_NOQI_WITH_REF()
IFACEMETHODIMP AppendFieldComboBoxItem(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
LPCWSTR pszItem) override;
IFACEMETHODIMP DeleteFieldComboBoxItem(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
DWORD dwItem) override;
IFACEMETHODIMP OnCreatingWindow(HWND* phwndOwner) override;
IFACEMETHODIMP SetFieldBitmap(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
HBITMAP hbmp) override;
IFACEMETHODIMP SetFieldCheckbox(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
BOOL bChecked,
LPCWSTR pszLabel) override;
IFACEMETHODIMP SetFieldComboBoxSelectedItem(
ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
DWORD dwSelectedItem) override;
IFACEMETHODIMP SetFieldInteractiveState(
ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis) override;
IFACEMETHODIMP SetFieldState(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
CREDENTIAL_PROVIDER_FIELD_STATE cpfs) override;
IFACEMETHODIMP SetFieldString(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
LPCWSTR psz) override;
IFACEMETHODIMP SetFieldSubmitButton(ICredentialProviderCredential* pcpc,
DWORD dwFieldID,
DWORD dwAdjacentTo) override;
CREDENTIAL_PROVIDER_FIELD_STATE GetFieldState(
ICredentialProviderCredential* pcpc,
DWORD dwFieldID);
LPCWSTR GetFieldString(ICredentialProviderCredential* pcpc, DWORD dwFieldID);
private:
std::unordered_map<ICredentialProviderCredential*,
std::unordered_map<DWORD, CREDENTIAL_PROVIDER_FIELD_STATE>>
field_states_;
std::unordered_map<ICredentialProviderCredential*,
std::unordered_map<DWORD, base::string16>>
field_string_;
};
///////////////////////////////////////////////////////////////////////////////
// Test implementation of GaiaCredentialProvider that stores information from
// OnUserAuthenticatedImpl.
class CTestGaiaCredentialProvider : public CGaiaCredentialProvider,
public ITestCredentialProvider {
public:
const CComBSTR& STDMETHODCALLTYPE username() const override;
const CComBSTR& STDMETHODCALLTYPE password() const override;
const CComBSTR& STDMETHODCALLTYPE sid() const override;
bool STDMETHODCALLTYPE credentials_changed_fired() const override;
void STDMETHODCALLTYPE ResetCredentialsChangedFired() override;
BEGIN_COM_MAP(CTestGaiaCredentialProvider)
COM_INTERFACE_ENTRY(IGaiaCredentialProvider)
COM_INTERFACE_ENTRY(ICredentialProviderSetUserArray)
COM_INTERFACE_ENTRY(ICredentialProvider)
COM_INTERFACE_ENTRY(ICredentialUpdateEventsHandler)
COM_INTERFACE_ENTRY(ITestCredentialProvider)
END_COM_MAP()
protected:
// CGaiaCredentialProvider
HRESULT OnUserAuthenticatedImpl(IUnknown* credential,
BSTR username,
BSTR password,
BSTR sid,
BOOL fire_credentials_changed) override;
CTestGaiaCredentialProvider();
~CTestGaiaCredentialProvider() override;
private:
CComBSTR username_;
CComBSTR password_;
CComBSTR sid_;
BOOL credentials_changed_fired_ = FALSE;
};
} // namespace testing
} // namespace credential_provider
#endif // CHROME_CREDENTIAL_PROVIDER_TEST_COM_FAKES_H_