15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_HTTP_HTTP_AUTH_HANDLER_MOCK_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_HTTP_AUTH_HANDLER_MOCK_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostResolver;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockAuthHandler is used in tests to reliably trigger edge cases.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthHandlerMock : public HttpAuthHandler {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Resolve {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESOLVE_INIT,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESOLVE_SKIP,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESOLVE_SYNC,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESOLVE_ASYNC,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESOLVE_TESTED,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Factory class returns handlers in the order they were added via
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddMockHandler.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Factory : public HttpAuthHandlerFactory {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Factory();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Factory();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddMockHandler(HttpAuthHandler* handler, HttpAuth::Target target);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_do_init_from_challenge(bool do_init_from_challenge) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      do_init_from_challenge_ = do_init_from_challenge;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // HttpAuthHandlerFactory:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int CreateAuthHandler(
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        HttpAuthChallengeTokenizer* challenge,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        HttpAuth::Target target,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const GURL& origin,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateReason reason,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int nonce_count,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const BoundNetLog& net_log,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<HttpAuthHandler>* handler) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<HttpAuthHandler> handlers_[HttpAuth::AUTH_NUM_TARGETS];
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool do_init_from_challenge_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpAuthHandlerMock();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HttpAuthHandlerMock();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetResolveExpectation(Resolve resolve);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool NeedsCanonicalName();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ResolveCanonicalName(HostResolver* host_resolver,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const CompletionCallback& callback);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetGenerateExpectation(bool async, int rv);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_connection_based(bool connection_based) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_based_ = connection_based;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_allows_default_credentials(bool allows_default_credentials) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allows_default_credentials_ = allows_default_credentials;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_allows_explicit_credentials(bool allows_explicit_credentials) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allows_explicit_credentials_ = allows_explicit_credentials;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& request_url() const {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return request_url_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HttpAuthHandler:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HttpAuth::AuthorizationResult HandleAnotherChallenge(
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      HttpAuthChallengeTokenizer* challenge) OVERRIDE;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool NeedsIdentity() OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AllowsDefaultCredentials() OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AllowsExplicitCredentials() OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool Init(HttpAuthChallengeTokenizer* challenge) OVERRIDE;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GenerateAuthTokenImpl(const AuthCredentials* credentials,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const HttpRequestInfo* request,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const CompletionCallback& callback,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    std::string* auth_token) OVERRIDE;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnResolveCanonicalName();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGenerateAuthToken();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Resolve resolve_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool generate_async_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int generate_rv_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string* auth_token_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool first_round_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool connection_based_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allows_default_credentials_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allows_explicit_credentials_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL request_url_;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<HttpAuthHandlerMock> weak_factory_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_HTTP_AUTH_HANDLER_MOCK_H_
125