1 // Copyright (c) 2013 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.
5 #include "base/memory/scoped_ptr.h"
6 #include "base/message_loop/message_loop.h"
7 #include "base/values.h"
8 #include "content/browser/media/webrtc_internals.h"
9 #include "content/browser/media/webrtc_internals_ui_observer.h"
10 #include "content/public/test/test_browser_thread.h"
11 #include "testing/gtest/include/gtest/gtest.h"
17 static const std::string kContraints = "c";
18 static const std::string kServers = "s";
19 static const std::string kUrl = "u";
21 class MockWebRTCInternalsProxy : public WebRTCInternalsUIObserver {
23 virtual void OnUpdate(const std::string& command,
24 const base::Value* value) OVERRIDE {
26 value_.reset(value->DeepCopy());
29 std::string command() {
33 base::Value* value() {
39 scoped_ptr<base::Value> value_;
42 class WebRTCInternalsTest : public testing::Test {
44 WebRTCInternalsTest() : io_thread_(BrowserThread::UI, &io_loop_) {}
47 std::string ExpectedInfo(std::string prefix,
50 static const std::string kstatic_part1 = std::string(
51 "{\"constraints\":\"c\",");
52 static const std::string kstatic_part2 = std::string(
53 ",\"servers\":\"s\",\"url\":\"u\"}");
54 return prefix + kstatic_part1 + id + kstatic_part2 + suffix;
57 base::MessageLoop io_loop_;
58 TestBrowserThread io_thread_;
63 TEST_F(WebRTCInternalsTest, AddRemoveObserver) {
64 scoped_ptr<MockWebRTCInternalsProxy> observer(
65 new MockWebRTCInternalsProxy());
66 WebRTCInternals::GetInstance()->AddObserver(observer.get());
67 WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
68 WebRTCInternals::GetInstance()->OnAddPeerConnection(
69 0, 3, 4, kUrl, kServers, kContraints);
70 EXPECT_EQ("", observer->command());
72 WebRTCInternals::GetInstance()->OnRemovePeerConnection(3, 4);
75 TEST_F(WebRTCInternalsTest, SendAddPeerConnectionUpdate) {
76 scoped_ptr<MockWebRTCInternalsProxy> observer(
77 new MockWebRTCInternalsProxy());
78 WebRTCInternals::GetInstance()->AddObserver(observer.get());
79 WebRTCInternals::GetInstance()->OnAddPeerConnection(
80 0, 1, 2, kUrl, kServers, kContraints);
81 EXPECT_EQ("addPeerConnection", observer->command());
83 base::DictionaryValue* dict = NULL;
84 EXPECT_TRUE(observer->value()->GetAsDictionary(&dict));
87 EXPECT_TRUE(dict->GetInteger("pid", &int_value));
88 EXPECT_EQ(1, int_value);
89 EXPECT_TRUE(dict->GetInteger("lid", &int_value));
90 EXPECT_EQ(2, int_value);
93 EXPECT_TRUE(dict->GetString("url", &value));
94 EXPECT_EQ(kUrl, value);
95 EXPECT_TRUE(dict->GetString("servers", &value));
96 EXPECT_EQ(kServers, value);
97 EXPECT_TRUE(dict->GetString("constraints", &value));
98 EXPECT_EQ(kContraints, value);
100 WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
101 WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2);
104 TEST_F(WebRTCInternalsTest, SendRemovePeerConnectionUpdate) {
105 scoped_ptr<MockWebRTCInternalsProxy> observer(
106 new MockWebRTCInternalsProxy());
107 WebRTCInternals::GetInstance()->AddObserver(observer.get());
108 WebRTCInternals::GetInstance()->OnAddPeerConnection(
109 0, 1, 2, kUrl, kServers, kContraints);
110 WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2);
111 EXPECT_EQ("removePeerConnection", observer->command());
113 base::DictionaryValue* dict = NULL;
114 EXPECT_TRUE(observer->value()->GetAsDictionary(&dict));
117 EXPECT_TRUE(dict->GetInteger("pid", &int_value));
118 EXPECT_EQ(1, int_value);
119 EXPECT_TRUE(dict->GetInteger("lid", &int_value));
120 EXPECT_EQ(2, int_value);
122 WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
125 TEST_F(WebRTCInternalsTest, SendUpdatePeerConnectionUpdate) {
126 scoped_ptr<MockWebRTCInternalsProxy> observer(
127 new MockWebRTCInternalsProxy());
128 WebRTCInternals::GetInstance()->AddObserver(observer.get());
129 WebRTCInternals::GetInstance()->OnAddPeerConnection(
130 0, 1, 2, kUrl, kServers, kContraints);
132 const std::string update_type = "fakeType";
133 const std::string update_value = "fakeValue";
134 WebRTCInternals::GetInstance()->OnUpdatePeerConnection(
135 1, 2, update_type, update_value);
137 EXPECT_EQ("updatePeerConnection", observer->command());
139 base::DictionaryValue* dict = NULL;
140 EXPECT_TRUE(observer->value()->GetAsDictionary(&dict));
143 EXPECT_TRUE(dict->GetInteger("pid", &int_value));
144 EXPECT_EQ(1, int_value);
145 EXPECT_TRUE(dict->GetInteger("lid", &int_value));
146 EXPECT_EQ(2, int_value);
149 EXPECT_TRUE(dict->GetString("type", &value));
150 EXPECT_EQ(update_type, value);
151 EXPECT_TRUE(dict->GetString("value", &value));
152 EXPECT_EQ(update_value, value);
154 WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2);
155 WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
158 } // namespace content