1// Copyright 2014 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/command_line.h"
6#include "chrome/browser/media/webrtc_browsertest_base.h"
7#include "chrome/browser/media/webrtc_browsertest_common.h"
8#include "chrome/common/chrome_version_info.h"
9#include "content/public/common/content_switches.h"
10#include "media/base/media_switches.h"
11#include "net/test/embedded_test_server/embedded_test_server.h"
12
13static const char kMainWebrtcTestHtmlPage[] =
14    "/webrtc/webrtc_jsep01_test.html";
15
16using chrome::VersionInfo;
17
18// This tests the --disable-webrtc-encryption command line flag. Disabling
19// encryption should only be possible on certain channels.
20
21// NOTE: The test case for each channel will only be exercised when the browser
22// is actually built for that channel. This is not ideal. One can test manually
23// by e.g. faking the channel returned in VersionInfo::GetChannel(). It's
24// likely good to have the test anyway, even though a failure might not be
25// detected until a branch has been promoted to another channel. The unit
26// test for ChromeContentBrowserClient::MaybeCopyDisableWebRtcEncryptionSwitch
27// tests for all channels however.
28// TODO(grunell): Test the different channel cases for any build.
29class WebRtcDisableEncryptionFlagBrowserTest : public WebRtcTestBase {
30 public:
31  WebRtcDisableEncryptionFlagBrowserTest() {}
32  virtual ~WebRtcDisableEncryptionFlagBrowserTest() {}
33
34  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
35    DetectErrorsInJavaScript();  // Look for errors in our rather complex js.
36  }
37
38  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
39    // This test should run with fake devices.
40    command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
41
42    // Disable encryption with the command line flag.
43    command_line->AppendSwitch(switches::kDisableWebRtcEncryption);
44  }
45
46 private:
47  DISALLOW_COPY_AND_ASSIGN(WebRtcDisableEncryptionFlagBrowserTest);
48};
49
50// Makes a call and checks that there's encryption or not in the SDP offer.
51IN_PROC_BROWSER_TEST_F(WebRtcDisableEncryptionFlagBrowserTest,
52                       VerifyEncryption) {
53  if (!OnWinXp())
54    return;  // Flaky timeout on a webrtc Win XP bot. http://crbug.com/368163.
55
56  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
57
58  content::WebContents* left_tab =
59      OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
60  content::WebContents* right_tab =
61      OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
62
63  SetupPeerconnectionWithLocalStream(left_tab);
64  SetupPeerconnectionWithLocalStream(right_tab);
65
66  NegotiateCall(left_tab, right_tab);
67
68  StartDetectingVideo(left_tab, "remote-view");
69  StartDetectingVideo(right_tab, "remote-view");
70
71  WaitForVideoToPlay(left_tab);
72  WaitForVideoToPlay(right_tab);
73
74  bool should_detect_encryption = true;
75  VersionInfo::Channel channel = VersionInfo::GetChannel();
76  if (channel == VersionInfo::CHANNEL_UNKNOWN ||
77      channel == VersionInfo::CHANNEL_CANARY ||
78      channel == VersionInfo::CHANNEL_DEV) {
79    should_detect_encryption = false;
80  }
81#if defined(OS_ANDROID)
82  if (channel == VersionInfo::CHANNEL_BETA)
83    should_detect_encryption = false;
84#endif
85
86  std::string expected_string = should_detect_encryption ?
87    "crypto-seen" : "no-crypto-seen";
88
89  ASSERT_EQ(expected_string,
90            ExecuteJavascript("hasSeenCryptoInSdp()", left_tab));
91
92  HangUp(left_tab);
93  HangUp(right_tab);
94}
95