1// Copyright (c) 2011 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_HTTP_AUTH_HANDLER_MOCK_H_
6#define NET_HTTP_HTTP_AUTH_HANDLER_MOCK_H_
7
8#include <string>
9
10#include "base/memory/scoped_vector.h"
11#include "base/memory/weak_ptr.h"
12#include "net/http/http_auth_handler.h"
13#include "net/http/http_auth_handler_factory.h"
14#include "url/gurl.h"
15
16namespace net {
17
18class HostResolver;
19
20// MockAuthHandler is used in tests to reliably trigger edge cases.
21class HttpAuthHandlerMock : public HttpAuthHandler {
22 public:
23  enum Resolve {
24    RESOLVE_INIT,
25    RESOLVE_SKIP,
26    RESOLVE_SYNC,
27    RESOLVE_ASYNC,
28    RESOLVE_TESTED,
29  };
30
31  // The Factory class returns handlers in the order they were added via
32  // AddMockHandler.
33  class Factory : public HttpAuthHandlerFactory {
34   public:
35    Factory();
36    virtual ~Factory();
37
38    void AddMockHandler(HttpAuthHandler* handler, HttpAuth::Target target);
39
40    void set_do_init_from_challenge(bool do_init_from_challenge) {
41      do_init_from_challenge_ = do_init_from_challenge;
42    }
43
44    // HttpAuthHandlerFactory:
45    virtual int CreateAuthHandler(
46        HttpAuthChallengeTokenizer* challenge,
47        HttpAuth::Target target,
48        const GURL& origin,
49        CreateReason reason,
50        int nonce_count,
51        const BoundNetLog& net_log,
52        scoped_ptr<HttpAuthHandler>* handler) OVERRIDE;
53
54   private:
55    ScopedVector<HttpAuthHandler> handlers_[HttpAuth::AUTH_NUM_TARGETS];
56    bool do_init_from_challenge_;
57  };
58
59  HttpAuthHandlerMock();
60
61  virtual ~HttpAuthHandlerMock();
62
63  void SetResolveExpectation(Resolve resolve);
64
65  virtual bool NeedsCanonicalName();
66
67  virtual int ResolveCanonicalName(HostResolver* host_resolver,
68                                   const CompletionCallback& callback);
69
70
71  void SetGenerateExpectation(bool async, int rv);
72
73  void set_connection_based(bool connection_based) {
74    connection_based_ = connection_based;
75  }
76
77  void set_allows_default_credentials(bool allows_default_credentials) {
78    allows_default_credentials_ = allows_default_credentials;
79  }
80
81  void set_allows_explicit_credentials(bool allows_explicit_credentials) {
82    allows_explicit_credentials_ = allows_explicit_credentials;
83  }
84
85  const GURL& request_url() const {
86    return request_url_;
87  }
88
89  // HttpAuthHandler:
90  virtual HttpAuth::AuthorizationResult HandleAnotherChallenge(
91      HttpAuthChallengeTokenizer* challenge) OVERRIDE;
92  virtual bool NeedsIdentity() OVERRIDE;
93  virtual bool AllowsDefaultCredentials() OVERRIDE;
94  virtual bool AllowsExplicitCredentials() OVERRIDE;
95
96 protected:
97  virtual bool Init(HttpAuthChallengeTokenizer* challenge) OVERRIDE;
98
99  virtual int GenerateAuthTokenImpl(const AuthCredentials* credentials,
100                                    const HttpRequestInfo* request,
101                                    const CompletionCallback& callback,
102                                    std::string* auth_token) OVERRIDE;
103
104 private:
105  void OnResolveCanonicalName();
106
107  void OnGenerateAuthToken();
108
109  Resolve resolve_;
110  CompletionCallback callback_;
111  bool generate_async_;
112  int generate_rv_;
113  std::string* auth_token_;
114  bool first_round_;
115  bool connection_based_;
116  bool allows_default_credentials_;
117  bool allows_explicit_credentials_;
118  GURL request_url_;
119  base::WeakPtrFactory<HttpAuthHandlerMock> weak_factory_;
120};
121
122}  // namespace net
123
124#endif  // NET_HTTP_HTTP_AUTH_HANDLER_MOCK_H_
125