• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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