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)#include <string.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InProcessBrowserTestP
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public InProcessBrowserTest,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ::testing::WithParamInterface<const char*> {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(InProcessBrowserTestP, TestP) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, strcmp("foo", GetParam()));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(IPBTP,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        InProcessBrowserTestP,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ::testing::Values("foo"));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContents observer that can detect provisional load failures.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LoadFailObserver : public content::WebContentsObserver {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit LoadFailObserver(content::WebContents* contents)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : content::WebContentsObserver(contents),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        failed_load_(false),
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        error_code_(net::OK) { }
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidFailProvisionalLoad(
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::string16& frame_unique_name,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& validated_url,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int error_code,
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::string16& error_description,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    failed_load_ = true;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_code_ = static_cast<net::Error>(error_code);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    validated_url_ = validated_url;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool failed_load() const { return failed_load_; }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::Error error_code() const { return error_code_; }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL& validated_url() const { return validated_url_; }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool failed_load_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::Error error_code_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL validated_url_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LoadFailObserver);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that InProcessBrowserTest cannot resolve external host, in this case
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "google.com" and "cnn.com". Using external resources is disabled by default
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// in InProcessBrowserTest because it causes flakiness.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, ExternalConnectionFail) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* contents =
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kURLs[] = {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "http://www.google.com/",
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "http://www.cnn.com/"
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kURLs); ++i) {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL url(kURLs[i]);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadFailObserver observer(contents);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.failed_load());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, observer.error_code());
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(url, observer.validated_url());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
87