1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/strings/string_util.h" 6 #include "base/strings/utf_string_conversions.h" 7 #include "chrome/browser/ui/browser.h" 8 #include "chrome/browser/ui/tabs/tab_strip_model.h" 9 #include "chrome/test/base/in_process_browser_test.h" 10 #include "chrome/test/base/ui_test_utils.h" 11 #include "content/public/test/browser_test_utils.h" 12 #include "net/base/test_data_directory.h" 13 #include "net/test/spawned_test_server/spawned_test_server.h" 14 15 namespace { 16 17 class WebSocketBrowserTest : public InProcessBrowserTest { 18 public: 19 WebSocketBrowserTest() 20 : ws_server_(net::SpawnedTestServer::TYPE_WS, 21 net::SpawnedTestServer::kLocalhost, 22 net::GetWebSocketTestDataDirectory()), 23 wss_server_(net::SpawnedTestServer::TYPE_WSS, 24 SSLOptions(SSLOptions::CERT_OK), 25 net::GetWebSocketTestDataDirectory()) { 26 } 27 28 protected: 29 net::SpawnedTestServer ws_server_; 30 net::SpawnedTestServer wss_server_; 31 32 private: 33 typedef net::SpawnedTestServer::SSLOptions SSLOptions; 34 35 DISALLOW_COPY_AND_ASSIGN(WebSocketBrowserTest); 36 }; 37 38 // Test that the browser can handle a WebSocket frame split into multiple TCP 39 // segments. 40 IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest, WebSocketSplitSegments) { 41 // Launch a WebSocket server. 42 ASSERT_TRUE(ws_server_.Start()); 43 44 // Setup page title observer. 45 content::WebContents* tab = 46 browser()->tab_strip_model()->GetActiveWebContents(); 47 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); 48 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); 49 50 // Visit a HTTP page for testing. 51 std::string scheme("http"); 52 GURL::Replacements replacements; 53 replacements.SetSchemeStr(scheme); 54 ui_test_utils::NavigateToURL( 55 browser(), 56 ws_server_.GetURL( 57 "split_packet_check.html").ReplaceComponents(replacements)); 58 59 const base::string16 result = watcher.WaitAndGetTitle(); 60 EXPECT_TRUE(EqualsASCII(result, "PASS")); 61 } 62 63 // Test that the browser can handle a WebSocket frame split into multiple SSL 64 // records. This test is flaky on Linux; see http://crbug.com/176867. 65 #if defined(OS_LINUX) 66 #define MAYBE_SecureWebSocketSplitRecords DISABLED_SecureWebSocketSplitRecords 67 #else 68 #define MAYBE_SecureWebSocketSplitRecords SecureWebSocketSplitRecords 69 #endif 70 IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest, 71 MAYBE_SecureWebSocketSplitRecords) { 72 // Launch a secure WebSocket server. 73 ASSERT_TRUE(wss_server_.Start()); 74 75 // Setup page title observer. 76 content::WebContents* tab = 77 browser()->tab_strip_model()->GetActiveWebContents(); 78 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); 79 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); 80 81 // Visit a HTTPS page for testing. 82 std::string scheme("https"); 83 GURL::Replacements replacements; 84 replacements.SetSchemeStr(scheme); 85 ui_test_utils::NavigateToURL( 86 browser(), 87 wss_server_.GetURL( 88 "split_packet_check.html").ReplaceComponents(replacements)); 89 90 const base::string16 result = watcher.WaitAndGetTitle(); 91 EXPECT_TRUE(EqualsASCII(result, "PASS")); 92 } 93 94 } // namespace 95