1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_ 6 #define NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_ 7 #pragma once 8 9 #include <list> 10 #include <set> 11 12 #include "net/http/http_auth_sspi_win.h" 13 14 namespace net { 15 16 // The MockSSPILibrary class is intended for unit tests which want to bypass 17 // the system SSPI library calls. 18 class MockSSPILibrary : public SSPILibrary { 19 public: 20 MockSSPILibrary(); 21 virtual ~MockSSPILibrary(); 22 23 // TODO(cbentzel): Only QuerySecurityPackageInfo and FreeContextBuffer 24 // are properly handled currently. 25 // SSPILibrary methods: 26 virtual SECURITY_STATUS AcquireCredentialsHandle(LPWSTR pszPrincipal, 27 LPWSTR pszPackage, 28 unsigned long fCredentialUse, 29 void* pvLogonId, 30 void* pvAuthData, 31 SEC_GET_KEY_FN pGetKeyFn, 32 void* pvGetKeyArgument, 33 PCredHandle phCredential, 34 PTimeStamp ptsExpiry); 35 virtual SECURITY_STATUS InitializeSecurityContext(PCredHandle phCredential, 36 PCtxtHandle phContext, 37 SEC_WCHAR* pszTargetName, 38 unsigned long fContextReq, 39 unsigned long Reserved1, 40 unsigned long TargetDataRep, 41 PSecBufferDesc pInput, 42 unsigned long Reserved2, 43 PCtxtHandle phNewContext, 44 PSecBufferDesc pOutput, 45 unsigned long* contextAttr, 46 PTimeStamp ptsExpiry); 47 virtual SECURITY_STATUS QuerySecurityPackageInfo(LPWSTR pszPackageName, 48 PSecPkgInfoW *pkgInfo); 49 virtual SECURITY_STATUS FreeCredentialsHandle(PCredHandle phCredential); 50 virtual SECURITY_STATUS DeleteSecurityContext(PCtxtHandle phContext); 51 virtual SECURITY_STATUS FreeContextBuffer(PVOID pvContextBuffer); 52 53 // Establishes an expectation for a |QuerySecurityPackageInfo()| call. 54 // 55 // Each expectation established by |ExpectSecurityQueryPackageInfo()| must be 56 // matched by a call to |QuerySecurityPackageInfo()| during the lifetime of 57 // the MockSSPILibrary. The |expected_package| argument must equal the 58 // |*pszPackageName| argument to |QuerySecurityPackageInfo()| for there to be 59 // a match. The expectations also establish an explicit ordering. 60 // 61 // For example, this sequence will be successful. 62 // MockSSPILibrary lib; 63 // lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...) 64 // lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...) 65 // lib.QuerySecurityPackageInfo(L"NTLM", ...) 66 // lib.QuerySecurityPackageInfo(L"Negotiate", ...) 67 // 68 // This sequence will fail since the queries do not occur in the order 69 // established by the expectations. 70 // MockSSPILibrary lib; 71 // lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...) 72 // lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...) 73 // lib.QuerySecurityPackageInfo(L"Negotiate", ...) 74 // lib.QuerySecurityPackageInfo(L"NTLM", ...) 75 // 76 // This sequence will fail because there were not enough queries. 77 // MockSSPILibrary lib; 78 // lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...) 79 // lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...) 80 // lib.QuerySecurityPackageInfo(L"NTLM", ...) 81 // 82 // |response_code| is used as the return value for 83 // |QuerySecurityPackageInfo()|. If |response_code| is SEC_E_OK, 84 // an expectation is also set for a call to |FreeContextBuffer()| after 85 // the matching |QuerySecurityPackageInfo()| is called. 86 // 87 // |package_info| is assigned to |*pkgInfo| in |QuerySecurityPackageInfo|. 88 // The lifetime of |*package_info| should last at least until the matching 89 // |QuerySecurityPackageInfo()| is called. 90 void ExpectQuerySecurityPackageInfo(const std::wstring& expected_package, 91 SECURITY_STATUS response_code, 92 PSecPkgInfoW package_info); 93 94 private: 95 struct PackageQuery { 96 std::wstring expected_package; 97 SECURITY_STATUS response_code; 98 PSecPkgInfoW package_info; 99 }; 100 101 // expected_package_queries contains an ordered list of expected 102 // |QuerySecurityPackageInfo()| calls and the return values for those 103 // calls. 104 std::list<PackageQuery> expected_package_queries_; 105 106 // Set of packages which should be freed. 107 std::set<PSecPkgInfoW> expected_freed_packages_; 108 }; 109 110 } // namespace net 111 112 #endif // NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_ 113