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