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:
WebSocketBrowserTest()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.
IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest,WebSocketSplitSegments)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
IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest,MAYBE_SecureWebSocketSplitRecords)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