15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/ref_counted.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/values.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/notification_service.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/api/dns/dns_api.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/api/dns/host_resolver_wrapper.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/api/dns/mock_host_resolver_creator.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/api_test_utils.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/notification_types.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/extension.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/test_util.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/shell/test/shell_apitest.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/net_errors.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using extensions::api_test_utils::RunFunctionAndReturnSingleResult;
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DnsApiTest : public ShellApiTest {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DnsApiTest() : resolver_creator_(new MockHostResolverCreator()) {}
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ShellApiTest::SetUpOnMainThread();
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    HostResolverWrapper::GetInstance()->SetHostResolverForTesting(
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        resolver_creator_->CreateMockHostResolver());
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    HostResolverWrapper::GetInstance()->SetHostResolverForTesting(NULL);
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    resolver_creator_->DeleteMockHostResolver();
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ShellApiTest::TearDownOnMainThread();
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The MockHostResolver asserts that it's used on the same thread on which
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // it's created, which is actually a stronger rule than its real counterpart.
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // But that's fine; it's good practice.
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MockHostResolverCreator> resolver_creator_;
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DnsApiTest, DnsResolveIPLiteral) {
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<DnsResolveFunction> resolve_function(new DnsResolveFunction());
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<Extension> empty_extension = test_util::CreateEmptyExtension();
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resolve_function->set_extension(empty_extension.get());
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resolve_function->set_has_callback(true);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnSingleResult(
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      resolve_function.get(), "[\"127.0.0.1\"]", browser_context()));
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue* dict = NULL;
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(result->GetAsDictionary(&dict));
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int result_code = 0;
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(dict->GetInteger("resultCode", &result_code));
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(net::OK, result_code);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string address;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(dict->GetString("address", &address));
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("127.0.0.1", address);
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DnsApiTest, DnsResolveHostname) {
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<DnsResolveFunction> resolve_function(new DnsResolveFunction());
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<Extension> empty_extension = test_util::CreateEmptyExtension();
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resolve_function->set_extension(empty_extension.get());
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resolve_function->set_has_callback(true);
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string function_arguments("[\"");
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  function_arguments += MockHostResolverCreator::kHostname;
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  function_arguments += "\"]";
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnSingleResult(
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      resolve_function.get(), function_arguments, browser_context()));
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue* dict = NULL;
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(result->GetAsDictionary(&dict));
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int result_code = 0;
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(dict->GetInteger("resultCode", &result_code));
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(net::OK, result_code);
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string address;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(dict->GetString("address", &address));
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(MockHostResolverCreator::kAddress, address);
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DnsApiTest, DnsExtension) {
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(RunAppTest("api_test/dns/api")) << message_;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace extensions
97