// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/values.h" #include "content/browser/media/webrtc_internals.h" #include "content/browser/media/webrtc_internals_ui_observer.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { namespace { static const std::string kContraints = "c"; static const std::string kServers = "s"; static const std::string kUrl = "u"; class MockWebRTCInternalsProxy : public WebRTCInternalsUIObserver { public: virtual void OnUpdate(const std::string& command, const base::Value* value) OVERRIDE { command_ = command; value_.reset(value->DeepCopy()); } std::string command() { return command_; } base::Value* value() { return value_.get(); } private: std::string command_; scoped_ptr<base::Value> value_; }; class WebRTCInternalsTest : public testing::Test { public: WebRTCInternalsTest() : io_thread_(BrowserThread::UI, &io_loop_) {} protected: std::string ExpectedInfo(std::string prefix, std::string id, std::string suffix) { static const std::string kstatic_part1 = std::string( "{\"constraints\":\"c\","); static const std::string kstatic_part2 = std::string( ",\"servers\":\"s\",\"url\":\"u\"}"); return prefix + kstatic_part1 + id + kstatic_part2 + suffix; } base::MessageLoop io_loop_; TestBrowserThread io_thread_; }; } // namespace TEST_F(WebRTCInternalsTest, AddRemoveObserver) { scoped_ptr<MockWebRTCInternalsProxy> observer( new MockWebRTCInternalsProxy()); WebRTCInternals::GetInstance()->AddObserver(observer.get()); WebRTCInternals::GetInstance()->RemoveObserver(observer.get()); WebRTCInternals::GetInstance()->OnAddPeerConnection( 0, 3, 4, kUrl, kServers, kContraints); EXPECT_EQ("", observer->command()); WebRTCInternals::GetInstance()->OnRemovePeerConnection(3, 4); } TEST_F(WebRTCInternalsTest, SendAddPeerConnectionUpdate) { scoped_ptr<MockWebRTCInternalsProxy> observer( new MockWebRTCInternalsProxy()); WebRTCInternals::GetInstance()->AddObserver(observer.get()); WebRTCInternals::GetInstance()->OnAddPeerConnection( 0, 1, 2, kUrl, kServers, kContraints); EXPECT_EQ("addPeerConnection", observer->command()); base::DictionaryValue* dict = NULL; EXPECT_TRUE(observer->value()->GetAsDictionary(&dict)); int int_value; EXPECT_TRUE(dict->GetInteger("pid", &int_value)); EXPECT_EQ(1, int_value); EXPECT_TRUE(dict->GetInteger("lid", &int_value)); EXPECT_EQ(2, int_value); std::string value; EXPECT_TRUE(dict->GetString("url", &value)); EXPECT_EQ(kUrl, value); EXPECT_TRUE(dict->GetString("servers", &value)); EXPECT_EQ(kServers, value); EXPECT_TRUE(dict->GetString("constraints", &value)); EXPECT_EQ(kContraints, value); WebRTCInternals::GetInstance()->RemoveObserver(observer.get()); WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2); } TEST_F(WebRTCInternalsTest, SendRemovePeerConnectionUpdate) { scoped_ptr<MockWebRTCInternalsProxy> observer( new MockWebRTCInternalsProxy()); WebRTCInternals::GetInstance()->AddObserver(observer.get()); WebRTCInternals::GetInstance()->OnAddPeerConnection( 0, 1, 2, kUrl, kServers, kContraints); WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2); EXPECT_EQ("removePeerConnection", observer->command()); base::DictionaryValue* dict = NULL; EXPECT_TRUE(observer->value()->GetAsDictionary(&dict)); int int_value; EXPECT_TRUE(dict->GetInteger("pid", &int_value)); EXPECT_EQ(1, int_value); EXPECT_TRUE(dict->GetInteger("lid", &int_value)); EXPECT_EQ(2, int_value); WebRTCInternals::GetInstance()->RemoveObserver(observer.get()); } TEST_F(WebRTCInternalsTest, SendUpdatePeerConnectionUpdate) { scoped_ptr<MockWebRTCInternalsProxy> observer( new MockWebRTCInternalsProxy()); WebRTCInternals::GetInstance()->AddObserver(observer.get()); WebRTCInternals::GetInstance()->OnAddPeerConnection( 0, 1, 2, kUrl, kServers, kContraints); const std::string update_type = "fakeType"; const std::string update_value = "fakeValue"; WebRTCInternals::GetInstance()->OnUpdatePeerConnection( 1, 2, update_type, update_value); EXPECT_EQ("updatePeerConnection", observer->command()); base::DictionaryValue* dict = NULL; EXPECT_TRUE(observer->value()->GetAsDictionary(&dict)); int int_value; EXPECT_TRUE(dict->GetInteger("pid", &int_value)); EXPECT_EQ(1, int_value); EXPECT_TRUE(dict->GetInteger("lid", &int_value)); EXPECT_EQ(2, int_value); std::string value; EXPECT_TRUE(dict->GetString("type", &value)); EXPECT_EQ(update_type, value); EXPECT_TRUE(dict->GetString("value", &value)); EXPECT_EQ(update_value, value); WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2); WebRTCInternals::GetInstance()->RemoveObserver(observer.get()); } } // namespace content