15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#include "net/http/http_auth_handler_negotiate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/mock_allow_url_security_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/mock_sspi_library_win.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/mock_gssapi_library_posix.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef net::MockSSPILibrary MockAuthLibrary;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef net::test::MockGSSAPILibrary MockAuthLibrary;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthHandlerNegotiateTest : public PlatformTest {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth_library_ = new MockAuthLibrary();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resolver_.reset(new MockHostResolver());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resolver_->rules()->AddIPLiteralRule("alias", "10.0.0.2",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "canonical.example.com");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_security_manager_.reset(new MockAllowURLSecurityManager());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_.reset(new HttpAuthHandlerNegotiate::Factory());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_->set_url_security_manager(url_security_manager_.get());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_->set_library(auth_library_);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_->set_host_resolver(resolver_.get());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupMocks(MockAuthLibrary* mock_library) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    security_package_.reset(new SecPkgInfoW);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(security_package_.get(), 0x0, sizeof(SecPkgInfoW));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    security_package_->cbMaxToken = 1337;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_library->ExpectQuerySecurityPackageInfo(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        L"Negotiate", SEC_E_OK, security_package_.get());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Copied from an actual transaction!
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char kAuthResponse[] =
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x60\x82\x02\xCA\x06\x09\x2A\x86\x48\x86\xF7\x12\x01\x02\x02\x01"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x00\x6E\x82\x02\xB9\x30\x82\x02\xB5\xA0\x03\x02\x01\x05\xA1\x03"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x02\x01\x0E\xA2\x07\x03\x05\x00\x00\x00\x00\x00\xA3\x82\x01\xC1"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x61\x82\x01\xBD\x30\x82\x01\xB9\xA0\x03\x02\x01\x05\xA1\x16\x1B"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x14\x55\x4E\x49\x58\x2E\x43\x4F\x52\x50\x2E\x47\x4F\x4F\x47\x4C"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x45\x2E\x43\x4F\x4D\xA2\x2C\x30\x2A\xA0\x03\x02\x01\x01\xA1\x23"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x30\x21\x1B\x04\x68\x6F\x73\x74\x1B\x19\x6E\x69\x6E\x6A\x61\x2E"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x63\x61\x6D\x2E\x63\x6F\x72\x70\x2E\x67\x6F\x6F\x67\x6C\x65\x2E"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x63\x6F\x6D\xA3\x82\x01\x6A\x30\x82\x01\x66\xA0\x03\x02\x01\x10"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xA1\x03\x02\x01\x01\xA2\x82\x01\x58\x04\x82\x01\x54\x2C\xB1\x2B"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x0A\xA5\xFF\x6F\xEC\xDE\xB0\x19\x6E\x15\x20\x18\x0C\x42\xB3\x2C"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x4B\xB0\x37\x02\xDE\xD3\x2F\xB4\xBF\xCA\xEC\x0E\xF9\xF3\x45\x6A"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x43\xF3\x8D\x79\xBD\xCB\xCD\xB2\x2B\xB8\xFC\xD6\xB4\x7F\x09\x48"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x14\xA7\x4F\xD2\xEE\xBC\x1B\x2F\x18\x3B\x81\x97\x7B\x28\xA4\xAF"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xA8\xA3\x7A\x31\x1B\xFC\x97\xB6\xBA\x8A\x50\x50\xD7\x44\xB8\x30"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xA4\x51\x4C\x3A\x95\x6C\xA1\xED\xE2\xEF\x17\xFE\xAB\xD2\xE4\x70"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xDE\xEB\x7E\x86\x48\xC5\x3E\x19\x5B\x83\x17\xBB\x52\x26\xC0\xF3"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x38\x0F\xB0\x8C\x72\xC9\xB0\x8B\x99\x96\x18\xE1\x9E\x67\x9D\xDC"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xF5\x39\x80\x70\x35\x3F\x98\x72\x16\x44\xA2\xC0\x10\xAA\x70\xBD"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x06\x6F\x83\xB1\xF4\x67\xA4\xBD\xDA\xF7\x79\x1D\x96\xB5\x7E\xF8"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xC6\xCF\xB4\xD9\x51\xC9\xBB\xB4\x20\x3C\xDD\xB9\x2C\x38\xEA\x40"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xFB\x02\x6C\xCB\x48\x71\xE8\xF4\x34\x5B\x63\x5D\x13\x57\xBD\xD1"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x3D\xDE\xE8\x4A\x51\x6E\xBE\x4C\xF5\xA3\x84\xF7\x4C\x4E\x58\x04"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xBE\xD1\xCC\x22\xA0\x43\xB0\x65\x99\x6A\xE0\x78\x0D\xFC\xE1\x42"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xA9\x18\xCF\x55\x4D\x23\xBD\x5C\x0D\xB5\x48\x25\x47\xCC\x01\x54"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x36\x4D\x0C\x6F\xAC\xCD\x33\x21\xC5\x63\x18\x91\x68\x96\xE9\xD1"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xD8\x23\x1F\x21\xAE\x96\xA3\xBD\x27\xF7\x4B\xEF\x4C\x43\xFF\xF8"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x22\x57\xCF\x68\x6C\x35\xD5\x21\x48\x5B\x5F\x8F\xA5\xB9\x6F\x99"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xA6\xE0\x6E\xF0\xC5\x7C\x91\xC8\x0B\x8A\x4B\x4E\x80\x59\x02\xE9"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xE8\x3F\x87\x04\xA6\xD1\xCA\x26\x3C\xF0\xDA\x57\xFA\xE6\xAF\x25"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x43\x34\xE1\xA4\x06\x1A\x1C\xF4\xF5\x21\x9C\x00\x98\xDD\xF0\xB4"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x8E\xA4\x81\xDA\x30\x81\xD7\xA0\x03\x02\x01\x10\xA2\x81\xCF\x04"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x81\xCC\x20\x39\x34\x60\x19\xF9\x4C\x26\x36\x46\x99\x7A\xFD\x2B"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x50\x8B\x2D\x47\x72\x38\x20\x43\x0E\x6E\x28\xB3\xA7\x4F\x26\xF1"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xF1\x7B\x02\x63\x58\x5A\x7F\xC8\xD0\x6E\xF5\xD1\xDA\x28\x43\x1B"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x6D\x9F\x59\x64\xDE\x90\xEA\x6C\x8C\xA9\x1B\x1E\x92\x29\x24\x23"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x2C\xE3\xEA\x64\xEF\x91\xA5\x4E\x94\xE1\xDC\x56\x3A\xAF\xD5\xBC"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xC9\xD3\x9B\x6B\x1F\xBE\x40\xE5\x40\xFF\x5E\x21\xEA\xCE\xFC\xD5"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xB0\xE5\xBA\x10\x94\xAE\x16\x54\xFC\xEB\xAB\xF1\xD4\x20\x31\xCC"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x26\xFE\xBE\xFE\x22\xB6\x9B\x1A\xE5\x55\x2C\x93\xB7\x3B\xD6\x4C"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x35\x35\xC1\x59\x61\xD4\x1F\x2E\x4C\xE1\x72\x8F\x71\x4B\x0C\x39"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x80\x79\xFA\xCD\xEA\x71\x1B\xAE\x35\x41\xED\xF9\x65\x0C\x59\xF8"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\xE1\x27\xDA\xD6\xD1\x20\x32\xCD\xBF\xD1\xEF\xE2\xED\xAD\x5D\xA7"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x69\xE3\x55\xF9\x30\xD3\xD4\x08\xC8\xCA\x62\xF8\x64\xEC\x9B\x92"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\x1A\xF1\x03\x2E\xCC\xDC\xEB\x17\xDE\x09\xAC\xA9\x58\x86";
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::GssContextMockImpl context1(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "localhost",                         // Source name
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "example.com",                       // Target name
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        23,                                  // Lifetime
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *CHROME_GSS_SPNEGO_MECH_OID_DESC,    // Mechanism
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,                                   // Context flags
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1,                                   // Locally initiated
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0);                                  // Open
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::GssContextMockImpl context2(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "localhost",                         // Source name
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "example.com",                       // Target name
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        23,                                  // Lifetime
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *CHROME_GSS_SPNEGO_MECH_OID_DESC,    // Mechanism
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,                                   // Context flags
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1,                                   // Locally initiated
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1);                                  // Open
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::MockGSSAPILibrary::SecurityContextQuery queries[] = {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::MockGSSAPILibrary::SecurityContextQuery(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Negotiate",                    // Package name
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GSS_S_CONTINUE_NEEDED,          // Major response code
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,                              // Minor response code
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        context1,                       // Context
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL,                           // Expected input token
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kAuthResponse),                 // Output token
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::MockGSSAPILibrary::SecurityContextQuery(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Negotiate",                    // Package name
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GSS_S_COMPLETE,                 // Major response code
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,                              // Minor response code
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        context2,                       // Context
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kAuthResponse,                  // Expected input token
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kAuthResponse)                  // Output token
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(queries); ++i) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_library->ExpectSecurityContext(queries[i].expected_package,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          queries[i].response_code,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          queries[i].minor_response_code,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          queries[i].context_info,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          queries[i].expected_input_token,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          queries[i].output_token);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_POSIX)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupErrorMocks(MockAuthLibrary* mock_library,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int major_status,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int minor_status) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gss_OID_desc kDefaultMech = { 0, NULL };
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::GssContextMockImpl context(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "localhost",                    // Source name
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "example.com",                  // Target name
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,                              // Lifetime
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kDefaultMech,                   // Mechanism
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,                              // Context flags
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1,                              // Locally initiated
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0);                             // Open
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::MockGSSAPILibrary::SecurityContextQuery query(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Negotiate",                    // Package name
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        major_status,                   // Major response code
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        minor_status,                   // Minor response code
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        context,                        // Context
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL,                           // Expected input token
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL);                          // Output token
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_library->ExpectSecurityContext(query.expected_package,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        query.response_code,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        query.minor_response_code,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        query.context_info,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        query.expected_input_token,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        query.output_token);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_POSIX)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CreateHandler(bool disable_cname_lookup, bool use_port,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool synchronous_resolve_mode,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& url_string,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     scoped_ptr<HttpAuthHandlerNegotiate>* handler) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_->set_disable_cname_lookup(disable_cname_lookup);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_->set_use_port(use_port);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resolver_->set_synchronous_mode(synchronous_resolve_mode);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL gurl(url_string);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note: This is a little tricky because CreateAuthHandlerFromString
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // expects a scoped_ptr<HttpAuthHandler>* rather than a
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // scoped_ptr<HttpAuthHandlerNegotiate>*. This needs to do the cast
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // after creating the handler, and make sure that generic_handler
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // no longer holds on to the HttpAuthHandlerNegotiate object.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<HttpAuthHandler> generic_handler;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv = factory_->CreateAuthHandlerFromString("Negotiate",
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   HttpAuth::AUTH_SERVER,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   gurl,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   BoundNetLog(),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &generic_handler);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rv != OK)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return rv;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpAuthHandlerNegotiate* negotiate_handler =
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<HttpAuthHandlerNegotiate*>(generic_handler.release());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->reset(negotiate_handler);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rv;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockAuthLibrary* AuthLibrary() { return auth_library_; }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SecPkgInfoW> security_package_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |auth_library_| is passed to |factory_|, which assumes ownership of it.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockAuthLibrary* auth_library_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockHostResolver> resolver_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<URLSecurityManager> url_security_manager_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate::Factory> factory_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, DisableCname) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupMocks(AuthLibrary());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true, false, true, "http://alias:500", &auth_handler));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                callback.callback(), &token));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP/alias", auth_handler->spn());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP@alias", auth_handler->spn());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, DisableCnameStandardPort) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupMocks(AuthLibrary());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true, true, true, "http://alias:80", &auth_handler));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                callback.callback(), &token));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP/alias", auth_handler->spn());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP@alias", auth_handler->spn());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, DisableCnameNonstandardPort) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupMocks(AuthLibrary());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true, true, true, "http://alias:500", &auth_handler));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                callback.callback(), &token));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP/alias:500", auth_handler->spn());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP@alias:500", auth_handler->spn());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, CnameSync) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupMocks(AuthLibrary());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false, false, true, "http://alias:500", &auth_handler));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                callback.callback(), &token));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP/canonical.example.com", auth_handler->spn());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP@canonical.example.com", auth_handler->spn());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, CnameAsync) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupMocks(AuthLibrary());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false, false, false, "http://alias:500", &auth_handler));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, auth_handler->GenerateAuthToken(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, &request_info, callback.callback(), &token));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP/canonical.example.com", auth_handler->spn());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("HTTP@canonical.example.com", auth_handler->spn());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is only for GSSAPI, as we can't use explicit credentials with
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that library.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, ServerNotInKerberosDatabase) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupErrorMocks(AuthLibrary(), GSS_S_FAILURE, 0x96C73A07);  // No server
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false, false, false, "http://alias:500", &auth_handler));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, auth_handler->GenerateAuthToken(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, &request_info, callback.callback(), &token));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_MISSING_AUTH_CREDENTIALS, callback.WaitForResult());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is only for GSSAPI, as we can't use explicit credentials with
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that library.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, NoKerberosCredentials) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupErrorMocks(AuthLibrary(), GSS_S_FAILURE, 0x96C73AC3);  // No credentials
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate> auth_handler;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, CreateHandler(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false, false, false, "http://alias:500", &auth_handler));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(auth_handler.get() != NULL);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, auth_handler->GenerateAuthToken(
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, &request_info, callback.callback(), &token));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_MISSING_AUTH_CREDENTIALS, callback.WaitForResult());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(DLOPEN_KERBEROS)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpAuthHandlerNegotiateTest, MissingGSSAPI) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HostResolver> host_resolver(new MockHostResolver());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockAllowURLSecurityManager url_security_manager;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerNegotiate::Factory> negotiate_factory(
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new HttpAuthHandlerNegotiate::Factory());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  negotiate_factory->set_host_resolver(host_resolver.get());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  negotiate_factory->set_url_security_manager(&url_security_manager);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  negotiate_factory->set_library(
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new GSSAPISharedLibrary("/this/library/does/not/exist"));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gurl("http://www.example.com");
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandler> generic_handler;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = negotiate_factory->CreateAuthHandlerFromString(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Negotiate",
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_SERVER,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gurl,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BoundNetLog(),
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &generic_handler);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, rv);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(generic_handler.get() == NULL);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(DLOPEN_KERBEROS)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_POSIX)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
369