diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-28 17:16:34 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-28 17:16:34 +0000 |
commit | e607ee6779f2213b69a3a5d4a5fd1222e4ea58e7 (patch) | |
tree | 658ae78ac264963db0db8bcd553c0bc4f467dc90 /net/base | |
parent | 0825bc6fff157dd1202fe1d4b019ca2db2eacd27 (diff) | |
download | chromium_src-e607ee6779f2213b69a3a5d4a5fd1222e4ea58e7.zip chromium_src-e607ee6779f2213b69a3a5d4a5fd1222e4ea58e7.tar.gz chromium_src-e607ee6779f2213b69a3a5d4a5fd1222e4ea58e7.tar.bz2 |
Adds unit tests for how HttpAuthHandlerNegotiate creates SPNs.
BUG=None
TEST=net_unittests --gtest_filter="*HttpAuthHandlerNegotiate*"
Review URL: http://codereview.chromium.org/1705001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45821 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base')
-rw-r--r-- | net/base/address_list.cc | 50 | ||||
-rw-r--r-- | net/base/address_list.h | 15 | ||||
-rw-r--r-- | net/base/mock_host_resolver.cc | 80 | ||||
-rw-r--r-- | net/base/mock_host_resolver.h | 24 |
4 files changed, 138 insertions, 31 deletions
diff --git a/net/base/address_list.cc b/net/base/address_list.cc index cf7f0d5..1736a19 100644 --- a/net/base/address_list.cc +++ b/net/base/address_list.cc @@ -13,6 +13,14 @@ namespace net { namespace { +char* do_strdup(const char* src) { +#if defined(OS_WIN) + return _strdup(src); +#else + return strdup(src); +#endif +} + // Make a copy of |info| (the dynamically-allocated parts are copied as well). // If |recursive| is true, chained entries via ai_next are copied too. // Copy returned by this function should be deleted using @@ -27,11 +35,7 @@ struct addrinfo* CreateCopyOfAddrinfo(const struct addrinfo* info, // ai_canonname is a NULL-terminated string. if (info->ai_canonname) { -#ifdef OS_WIN - copy->ai_canonname = _strdup(info->ai_canonname); -#else - copy->ai_canonname = strdup(info->ai_canonname); -#endif + copy->ai_canonname = do_strdup(info->ai_canonname); } // ai_addr is a buffer of length ai_addrlen. @@ -162,21 +166,45 @@ void AddressList::Reset() { } // static -AddressList AddressList::CreateIPv6Address(unsigned char data[16]) { +AddressList AddressList::CreateIPv4Address(unsigned char data[4], + const std::string& canonical_name) { struct addrinfo* ai = new addrinfo; memset(ai, 0, sizeof(addrinfo)); + ai->ai_family = AF_INET; + ai->ai_socktype = SOCK_STREAM; + const size_t sockaddr_in_size = sizeof(struct sockaddr_in); + ai->ai_addrlen = sockaddr_in_size; + if (!canonical_name.empty()) + ai->ai_canonname = do_strdup(canonical_name.c_str()); + + struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>( + new char[sockaddr_in_size]); + memset(addr, 0, sockaddr_in_size); + addr->sin_family = AF_INET; + memcpy(&addr->sin_addr, data, 4); + ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr); + + return AddressList(new Data(ai, false /*is_system_created*/)); +} +// static +AddressList AddressList::CreateIPv6Address(unsigned char data[16], + const std::string& canonical_name) { + struct addrinfo* ai = new addrinfo; + memset(ai, 0, sizeof(addrinfo)); ai->ai_family = AF_INET6; ai->ai_socktype = SOCK_STREAM; - ai->ai_addrlen = sizeof(struct sockaddr_in6); + const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6); + ai->ai_addrlen = sockaddr_in6_size; + if (!canonical_name.empty()) + ai->ai_canonname = do_strdup(canonical_name.c_str()); struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>( - new char[ai->ai_addrlen]); - memset(addr6, 0, sizeof(struct sockaddr_in6)); - - ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6); + new char[sockaddr_in6_size]); + memset(addr6, 0, sockaddr_in6_size); addr6->sin6_family = AF_INET6; memcpy(&addr6->sin6_addr, data, 16); + ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6); return AddressList(new Data(ai, false /*is_system_created*/)); } diff --git a/net/base/address_list.h b/net/base/address_list.h index e8ecb63..ce17645 100644 --- a/net/base/address_list.h +++ b/net/base/address_list.h @@ -59,8 +59,19 @@ class AddressList { // empty state as when first constructed. void Reset(); - // Used by unit-tests to manually set the TCP socket address. - static AddressList CreateIPv6Address(unsigned char data[16]); + // Used by unit-tests to manually create an IPv4 AddressList. |data| should + // be an IPv4 address in network order (big endian). + // If |canonical_name| is non-empty, it will be duplicated in the + // ai_canonname field of the addrinfo struct. + static AddressList CreateIPv4Address(unsigned char data[4], + const std::string& canonical_name); + + // Used by unit-tests to manually create an IPv6 AddressList. |data| should + // be an IPv6 address in network order (big endian). + // If |canonical_name| is non-empty, it will be duplicated in the + // ai_canonname field of the addrinfo struct. + static AddressList CreateIPv6Address(unsigned char data[16], + const std::string& canonical_name); // Get access to the head of the addrinfo list. const struct addrinfo* head() const { return data_->head; } diff --git a/net/base/mock_host_resolver.cc b/net/base/mock_host_resolver.cc index d99b24e..573d57e 100644 --- a/net/base/mock_host_resolver.cc +++ b/net/base/mock_host_resolver.cc @@ -13,10 +13,14 @@ namespace net { namespace { -// Fills |addrlist| with a socket address for |host| which should be an -// IPv6 literal. Returns OK on success. -int ResolveIPV6LiteralUsingGURL(const std::string& host, - AddressList* addrlist) { + +// Fills |*addrlist| with a socket address for |host| which should be an +// IPv6 literal without enclosing brackets. If |canonical_name| is non-empty +// it is used as the DNS canonical name for the host. Returns OK on success, +// ERR_UNEXPECTED otherwise. +int CreateIPv6Address(const std::string& host, + const std::string& canonical_name, + AddressList* addrlist) { // GURL expects the hostname to be surrounded with brackets. std::string host_brackets = "[" + host + "]"; url_parse::Component host_comp(0, host_brackets.size()); @@ -31,7 +35,26 @@ int ResolveIPV6LiteralUsingGURL(const std::string& host, return ERR_UNEXPECTED; } - *addrlist = AddressList::CreateIPv6Address(ipv6_addr); + *addrlist = AddressList::CreateIPv6Address(ipv6_addr, canonical_name); + return OK; +} + +// Fills |*addrlist| with a socket address for |host| which should be an +// IPv4 literal. If |canonical_name| is non-empty it is used as the DNS +// canonical name for the host. Returns OK on success, ERR_UNEXPECTED otherwise. +int CreateIPv4Address(const std::string& host, + const std::string& canonical_name, + AddressList* addrlist) { + unsigned char ipv4_addr[4]; + url_parse::Component host_comp(0, host.size()); + int num_components; + url_canon::CanonHostInfo::Family family = url_canon::IPv4AddressToNumber( + host.data(), host_comp, ipv4_addr, &num_components); + if (family != url_canon::CanonHostInfo::IPV4) { + LOG(WARNING) << "Not an IPv4 literal: " << host; + return ERR_UNEXPECTED; + } + *addrlist = AddressList::CreateIPv4Address(ipv4_addr, canonical_name); return OK; } @@ -104,23 +127,30 @@ struct RuleBasedHostResolverProc::Rule { kResolverTypeFail, kResolverTypeSystem, kResolverTypeIPV6Literal, + kResolverTypeIPV4Literal, }; ResolverType resolver_type; std::string host_pattern; AddressFamily address_family; + HostResolverFlags host_resolver_flags; std::string replacement; + std::string canonical_name; int latency_ms; // In milliseconds. Rule(ResolverType resolver_type, const std::string& host_pattern, AddressFamily address_family, + HostResolverFlags host_resolver_flags, const std::string& replacement, + const std::string& canonical_name, int latency_ms) : resolver_type(resolver_type), host_pattern(host_pattern), address_family(address_family), + host_resolver_flags(host_resolver_flags), replacement(replacement), + canonical_name(canonical_name), latency_ms(latency_ms) {} }; @@ -143,16 +173,32 @@ void RuleBasedHostResolverProc::AddRuleForAddressFamily( const std::string& replacement) { DCHECK(!replacement.empty()); Rule rule(Rule::kResolverTypeSystem, host_pattern, - address_family, replacement, 0); + address_family, 0, replacement, "", 0); + rules_.push_back(rule); +} + +void RuleBasedHostResolverProc::AddIPv4Rule(const std::string& host_pattern, + const std::string& ipv4_literal, + const std::string& canonical_name) { + Rule rule(Rule::kResolverTypeIPV4Literal, + host_pattern, + ADDRESS_FAMILY_UNSPECIFIED, + canonical_name.empty() ? 0 : HOST_RESOLVER_CANONNAME, + ipv4_literal, + canonical_name, + 0); rules_.push_back(rule); } void RuleBasedHostResolverProc::AddIPv6Rule(const std::string& host_pattern, - const std::string& ipv6_literal) { + const std::string& ipv6_literal, + const std::string& canonical_name) { Rule rule(Rule::kResolverTypeIPV6Literal, host_pattern, ADDRESS_FAMILY_UNSPECIFIED, + canonical_name.empty() ? 0 : HOST_RESOLVER_CANONNAME, ipv6_literal, + canonical_name, 0); rules_.push_back(rule); } @@ -163,21 +209,21 @@ void RuleBasedHostResolverProc::AddRuleWithLatency( int latency_ms) { DCHECK(!replacement.empty()); Rule rule(Rule::kResolverTypeSystem, host_pattern, - ADDRESS_FAMILY_UNSPECIFIED, replacement, latency_ms); + ADDRESS_FAMILY_UNSPECIFIED, 0, replacement, "", latency_ms); rules_.push_back(rule); } void RuleBasedHostResolverProc::AllowDirectLookup( const std::string& host_pattern) { Rule rule(Rule::kResolverTypeSystem, host_pattern, - ADDRESS_FAMILY_UNSPECIFIED, "", 0); + ADDRESS_FAMILY_UNSPECIFIED, 0, "", "", 0); rules_.push_back(rule); } void RuleBasedHostResolverProc::AddSimulatedFailure( const std::string& host_pattern) { Rule rule(Rule::kResolverTypeFail, host_pattern, - ADDRESS_FAMILY_UNSPECIFIED, "", 0); + ADDRESS_FAMILY_UNSPECIFIED, 0, "", "", 0); rules_.push_back(rule); } @@ -190,8 +236,14 @@ int RuleBasedHostResolverProc::Resolve(const std::string& host, bool matches_address_family = r->address_family == ADDRESS_FAMILY_UNSPECIFIED || r->address_family == address_family; - - if (matches_address_family && MatchPatternASCII(host, r->host_pattern)) { + // Flags match if all of the bitflags in host_resolver_flags are enabled + // in the rule's host_resolver_flags. However, the rule may have additional + // flags specified, in which case the flags should still be considered a + // match. + bool matches_flags = (r->host_resolver_flags & host_resolver_flags) == + host_resolver_flags; + if (matches_flags && matches_address_family && + MatchPatternASCII(host, r->host_pattern)) { if (r->latency_ms != 0) PlatformThread::Sleep(r->latency_ms); @@ -209,7 +261,9 @@ int RuleBasedHostResolverProc::Resolve(const std::string& host, host_resolver_flags, addrlist); case Rule::kResolverTypeIPV6Literal: - return ResolveIPV6LiteralUsingGURL(effective_host, addrlist); + return CreateIPv6Address(effective_host, r->canonical_name, addrlist); + case Rule::kResolverTypeIPV4Literal: + return CreateIPv4Address(effective_host, r->canonical_name, addrlist); default: NOTREACHED(); return ERR_UNEXPECTED; diff --git a/net/base/mock_host_resolver.h b/net/base/mock_host_resolver.h index 5a1df7f..ad89a48 100644 --- a/net/base/mock_host_resolver.h +++ b/net/base/mock_host_resolver.h @@ -107,12 +107,26 @@ class RuleBasedHostResolverProc : public HostResolverProc { AddressFamily address_family, const std::string& replacement); - // Same as AddRule(), but the replacement is expected to be an IPV6 literal. - // You should use this in place of AddRule(), since the system's host resolver - // may not support IPv6 literals on all systems. Whereas this variant - // constructs the socket address directly so it will always work. + // Same as AddRule(), but the replacement is expected to be an IPV4 literal. + // This can be used in place of AddRule() to bypass the system's host + // resolver. |ipv4_literal| must be an IPv4 literal, typically taking the form + // of "[0-255].[0-255].[0-255].[0-255]". + // If |canonical-name| is non-empty, it is copied to the resulting AddressList + // but does not impact DNS resolution. + void AddIPv4Rule(const std::string& host_pattern, + const std::string& ipv4_literal, + const std::string& canonical_name); + + // Same as AddRule(), but |ipv6_literal| is expected to be an IPV6 literal, + // without enclosing brackets. You should use this in place of AddRule(), + // since the system's host resolver may not support IPv6 literals on all + // systems. This variant constructs the socket address directly so it will + // always work. + // If |canonical-name| is non-empty, it is copied to the resulting AddressList + // but does not impact DNS resolution. void AddIPv6Rule(const std::string& host_pattern, - const std::string& ipv6_literal); + const std::string& ipv6_literal, + const std::string& canonical_name); void AddRuleWithLatency(const std::string& host_pattern, const std::string& replacement, |