Chromium Code Reviews| Index: native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
| index ef7f7baff3413ca33f8d27bcb5ea950b1b74c924..b6372f10ee06fdb6c36faf72a92faec2528827c6 100644 |
| --- a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
| @@ -15,12 +15,11 @@ namespace { |
| class FakeHostResolverResource : public FakeResource { |
| public: |
| - FakeHostResolverResource() : resolved(false), name(NULL) {} |
| + FakeHostResolverResource() : resolved(false) {} |
| static const char* classname() { return "FakeHostResolverResource"; } |
| bool resolved; |
| - in_addr_t address; |
| - const char* name; |
| + PP_HostResolver_Hint hints; |
| }; |
| int32_t RunCompletionCallback(PP_CompletionCallback* callback, int32_t result) { |
| @@ -40,7 +39,7 @@ PP_Resource FakeHostResolverInterface::Create(PP_Instance instance) { |
| if (instance != ppapi_->GetInstance()) |
| return PP_ERROR_BADRESOURCE; |
| - FakeHostResolverResource* resolver_resource = new FakeHostResolverResource; |
| + FakeHostResolverResource* resolver_resource = new FakeHostResolverResource(); |
| return CREATE_RESOURCE(ppapi_->resource_manager(), |
| FakeHostResolverResource, |
| @@ -50,15 +49,14 @@ PP_Resource FakeHostResolverInterface::Create(PP_Instance instance) { |
| int32_t FakeHostResolverInterface::Resolve(PP_Resource resource, |
| const char* hostname, |
| uint16_t, |
| - const PP_HostResolver_Hint*, |
| + const PP_HostResolver_Hint* hints, |
| PP_CompletionCallback callback) { |
| FakeHostResolverResource* resolver = |
| ppapi_->resource_manager()->Get<FakeHostResolverResource>(resource); |
| resolver->resolved = false; |
| - if (!strcmp(hostname, FAKE_HOSTNAME)) { |
| + resolver->hints = *hints; |
| + if (!fake_hostname.empty() && fake_hostname == std::string(hostname)) { |
|
binji
2014/01/29 19:18:52
fake_hostname == hostname
|
| resolver->resolved = true; |
| - resolver->name = FAKE_HOSTNAME; |
| - resolver->address = htonl(FAKE_IP); |
| return RunCompletionCallback(&callback, PP_OK); |
| } |
| return RunCompletionCallback(&callback, PP_ERROR_NAME_NOT_RESOLVED); |
| @@ -69,7 +67,8 @@ PP_Var FakeHostResolverInterface::GetCanonicalName(PP_Resource resource) { |
| ppapi_->resource_manager()->Get<FakeHostResolverResource>(resource); |
| if (!res->resolved) |
| return PP_Var(); |
| - return ppapi_->GetVarInterface()->VarFromUtf8(res->name, strlen(res->name)); |
| + return ppapi_->GetVarInterface()->VarFromUtf8(fake_hostname.data(), |
| + fake_hostname.length()); |
| } |
| uint32_t FakeHostResolverInterface::GetNetAddressCount(PP_Resource resolver) { |
| @@ -77,7 +76,17 @@ uint32_t FakeHostResolverInterface::GetNetAddressCount(PP_Resource resolver) { |
| ppapi_->resource_manager()->Get<FakeHostResolverResource>(resolver); |
| if (!res->resolved) |
| return 0; |
| - return 1; |
| + |
| + uint32_t rtn = 0; |
| + if (res->hints.family == PP_NETADDRESS_FAMILY_IPV6 || |
| + res->hints.family == PP_NETADDRESS_FAMILY_UNSPECIFIED) |
| + rtn += fake_addresses_v6.size(); |
| + |
| + if (res->hints.family == PP_NETADDRESS_FAMILY_IPV4 || |
| + res->hints.family == PP_NETADDRESS_FAMILY_UNSPECIFIED) |
| + rtn += fake_addresses_v4.size(); |
| + |
| + return rtn; |
| } |
| PP_Resource FakeHostResolverInterface::GetNetAddress(PP_Resource resource, |
| @@ -87,12 +96,41 @@ PP_Resource FakeHostResolverInterface::GetNetAddress(PP_Resource resource, |
| if (!res->resolved) |
| return 0; |
| - if (index != 0) |
| + bool include_v4 = false; |
| + int max_index = 0; |
| + switch (res->hints.family) { |
| + case PP_NETADDRESS_FAMILY_IPV4: |
| + max_index = fake_addresses_v4.size(); |
| + include_v4 = true; |
| + break; |
| + case PP_NETADDRESS_FAMILY_IPV6: |
| + max_index = fake_addresses_v6.size(); |
| + break; |
| + case PP_NETADDRESS_FAMILY_UNSPECIFIED: |
| + include_v4 = true; |
| + max_index = fake_addresses_v4.size() + fake_addresses_v6.size(); |
| + break; |
| + default: |
| + return 0; |
| + } |
| + |
| + if (index >= max_index) |
| return 0; |
| - // Create a new NetAddress resource and return it. |
| - PP_NetAddress_IPv4 addr; |
| - memcpy(addr.addr, &res->address, sizeof(res->address)); |
| nacl_io::NetAddressInterface* iface = ppapi_->GetNetAddressInterface(); |
| - return iface->CreateFromIPv4Address(ppapi_->GetInstance(), &addr); |
| + |
| + // Create a new NetAddress resource and return it. |
| + if (include_v4 && index < fake_addresses_v4.size()) { |
| + PP_NetAddress_IPv4 addr; |
| + sockaddr_in& addr4 = fake_addresses_v4[index]; |
| + memcpy(addr.addr, &addr4.sin_addr, sizeof(addr4.sin_addr)); |
| + return iface->CreateFromIPv4Address(ppapi_->GetInstance(), &addr); |
| + } else { |
| + if (include_v4) |
| + index -= fake_addresses_v4.size(); |
| + PP_NetAddress_IPv6 addr; |
| + sockaddr_in6& addr6 = fake_addresses_v6[index]; |
| + memcpy(addr.addr, &addr6.sin6_addr, sizeof(addr6.sin6_addr)); |
| + return iface->CreateFromIPv6Address(ppapi_->GetInstance(), &addr); |
| + } |
| } |