Home | History | Annotate | Download | only in media
      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.
      4 
      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"
     12 
     13 namespace content {
     14 
     15 namespace {
     16 
     17 static const std::string kContraints = "c";
     18 static const std::string kServers = "s";
     19 static const std::string kUrl = "u";
     20 
     21 class MockWebRTCInternalsProxy : public WebRTCInternalsUIObserver {
     22  public:
     23   virtual void OnUpdate(const std::string& command,
     24                         const base::Value* value) OVERRIDE {
     25     command_ = command;
     26     value_.reset(value->DeepCopy());
     27   }
     28 
     29   std::string command() {
     30     return command_;
     31   }
     32 
     33   base::Value* value() {
     34     return value_.get();
     35   }
     36 
     37  private:
     38    std::string command_;
     39    scoped_ptr<base::Value> value_;
     40 };
     41 
     42 class WebRTCInternalsTest : public testing::Test {
     43  public:
     44   WebRTCInternalsTest() : io_thread_(BrowserThread::UI, &io_loop_) {}
     45 
     46  protected:
     47   std::string ExpectedInfo(std::string prefix,
     48                            std::string id,
     49                            std::string suffix) {
     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;
     55   }
     56 
     57   base::MessageLoop io_loop_;
     58   TestBrowserThread io_thread_;
     59 };
     60 
     61 }  // namespace
     62 
     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());
     71 
     72   WebRTCInternals::GetInstance()->OnRemovePeerConnection(3, 4);
     73 }
     74 
     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());
     82 
     83   base::DictionaryValue* dict = NULL;
     84   EXPECT_TRUE(observer->value()->GetAsDictionary(&dict));
     85 
     86   int int_value;
     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);
     91 
     92   std::string 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);
     99 
    100   WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
    101   WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2);
    102 }
    103 
    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());
    112 
    113   base::DictionaryValue* dict = NULL;
    114   EXPECT_TRUE(observer->value()->GetAsDictionary(&dict));
    115 
    116   int int_value;
    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);
    121 
    122   WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
    123 }
    124 
    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);
    131 
    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);
    136 
    137   EXPECT_EQ("updatePeerConnection", observer->command());
    138 
    139   base::DictionaryValue* dict = NULL;
    140   EXPECT_TRUE(observer->value()->GetAsDictionary(&dict));
    141 
    142   int int_value;
    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);
    147 
    148   std::string 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);
    153 
    154   WebRTCInternals::GetInstance()->OnRemovePeerConnection(1, 2);
    155   WebRTCInternals::GetInstance()->RemoveObserver(observer.get());
    156 }
    157 
    158 }  // namespace content
    159