Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2011 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifdef HAVE_DBUS_GLIB
     12 
     13 #include "webrtc/base/dbus.h"
     14 #include "webrtc/base/gunit.h"
     15 #include "webrtc/base/thread.h"
     16 
     17 namespace rtc {
     18 
     19 #define SIG_NAME "NameAcquired"
     20 
     21 static const uint32 kTimeoutMs = 5000U;
     22 
     23 class DBusSigFilterTest : public DBusSigFilter {
     24  public:
     25   // DBusSigFilterTest listens on DBus service itself for "NameAcquired" signal.
     26   // This signal should be received when the application connects to DBus
     27   // service and gains ownership of a name.
     28   // http://dbus.freedesktop.org/doc/dbus-specification.html
     29   DBusSigFilterTest()
     30       : DBusSigFilter(GetFilter()),
     31         message_received_(false) {
     32   }
     33 
     34   bool MessageReceived() {
     35     return message_received_;
     36   }
     37 
     38  private:
     39   static std::string GetFilter() {
     40     return rtc::DBusSigFilter::BuildFilterString("", "", SIG_NAME);
     41   }
     42 
     43   // Implement virtual method of DBusSigFilter. On caller thread.
     44   virtual void ProcessSignal(DBusMessage *message) {
     45     EXPECT_TRUE(message != NULL);
     46     message_received_ = true;
     47   }
     48 
     49   bool message_received_;
     50 };
     51 
     52 TEST(DBusMonitorTest, StartStopStartStop) {
     53   DBusSigFilterTest filter;
     54   rtc::scoped_ptr<rtc::DBusMonitor> monitor;
     55   monitor.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
     56   if (monitor) {
     57     EXPECT_TRUE(monitor->AddFilter(&filter));
     58 
     59     EXPECT_TRUE(monitor->StopMonitoring());
     60     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_NOT_INITIALIZED);
     61 
     62     EXPECT_TRUE(monitor->StartMonitoring());
     63     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
     64     EXPECT_TRUE(monitor->StopMonitoring());
     65     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
     66     EXPECT_TRUE(monitor->StopMonitoring());
     67     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
     68 
     69     EXPECT_TRUE(monitor->StartMonitoring());
     70     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
     71     EXPECT_TRUE(monitor->StartMonitoring());
     72     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_RUNNING);
     73     EXPECT_TRUE(monitor->StopMonitoring());
     74     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
     75   } else {
     76     LOG(LS_WARNING) << "DBus Monitor not started. Skipping test.";
     77   }
     78 }
     79 
     80 // DBusMonitorTest listens on DBus service itself for "NameAcquired" signal.
     81 // This signal should be received when the application connects to DBus
     82 // service and gains ownership of a name.
     83 // This test is to make sure that we capture the "NameAcquired" signal.
     84 TEST(DBusMonitorTest, ReceivedNameAcquiredSignal) {
     85   DBusSigFilterTest filter;
     86   rtc::scoped_ptr<rtc::DBusMonitor> monitor;
     87   monitor.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
     88   if (monitor) {
     89     EXPECT_TRUE(monitor->AddFilter(&filter));
     90 
     91     EXPECT_TRUE(monitor->StartMonitoring());
     92     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
     93     EXPECT_TRUE_WAIT(filter.MessageReceived(), kTimeoutMs);
     94     EXPECT_TRUE(monitor->StopMonitoring());
     95     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
     96   } else {
     97     LOG(LS_WARNING) << "DBus Monitor not started. Skipping test.";
     98   }
     99 }
    100 
    101 TEST(DBusMonitorTest, ConcurrentMonitors) {
    102   DBusSigFilterTest filter1;
    103   rtc::scoped_ptr<rtc::DBusMonitor> monitor1;
    104   monitor1.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
    105   if (monitor1) {
    106     EXPECT_TRUE(monitor1->AddFilter(&filter1));
    107     DBusSigFilterTest filter2;
    108     rtc::scoped_ptr<rtc::DBusMonitor> monitor2;
    109     monitor2.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
    110     EXPECT_TRUE(monitor2->AddFilter(&filter2));
    111 
    112     EXPECT_TRUE(monitor1->StartMonitoring());
    113     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor1->GetStatus(), kTimeoutMs);
    114     EXPECT_TRUE(monitor2->StartMonitoring());
    115     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor2->GetStatus(), kTimeoutMs);
    116 
    117     EXPECT_TRUE_WAIT(filter2.MessageReceived(), kTimeoutMs);
    118     EXPECT_TRUE(monitor2->StopMonitoring());
    119     EXPECT_EQ(monitor2->GetStatus(), DBusMonitor::DMS_STOPPED);
    120 
    121     EXPECT_TRUE_WAIT(filter1.MessageReceived(), kTimeoutMs);
    122     EXPECT_TRUE(monitor1->StopMonitoring());
    123     EXPECT_EQ(monitor1->GetStatus(), DBusMonitor::DMS_STOPPED);
    124   } else {
    125     LOG(LS_WARNING) << "DBus Monitor not started. Skipping test.";
    126   }
    127 }
    128 
    129 TEST(DBusMonitorTest, ConcurrentFilters) {
    130   DBusSigFilterTest filter1;
    131   DBusSigFilterTest filter2;
    132   rtc::scoped_ptr<rtc::DBusMonitor> monitor;
    133   monitor.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
    134   if (monitor) {
    135     EXPECT_TRUE(monitor->AddFilter(&filter1));
    136     EXPECT_TRUE(monitor->AddFilter(&filter2));
    137 
    138     EXPECT_TRUE(monitor->StartMonitoring());
    139     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
    140 
    141     EXPECT_TRUE_WAIT(filter1.MessageReceived(), kTimeoutMs);
    142     EXPECT_TRUE_WAIT(filter2.MessageReceived(), kTimeoutMs);
    143 
    144     EXPECT_TRUE(monitor->StopMonitoring());
    145     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
    146   } else {
    147     LOG(LS_WARNING) << "DBus Monitor not started. Skipping test.";
    148   }
    149 }
    150 
    151 TEST(DBusMonitorTest, NoAddFilterIfRunning) {
    152   DBusSigFilterTest filter1;
    153   DBusSigFilterTest filter2;
    154   rtc::scoped_ptr<rtc::DBusMonitor> monitor;
    155   monitor.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
    156   if (monitor) {
    157     EXPECT_TRUE(monitor->AddFilter(&filter1));
    158 
    159     EXPECT_TRUE(monitor->StartMonitoring());
    160     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
    161     EXPECT_FALSE(monitor->AddFilter(&filter2));
    162 
    163     EXPECT_TRUE(monitor->StopMonitoring());
    164     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
    165   } else {
    166     LOG(LS_WARNING) << "DBus Monitor not started. Skipping test.";
    167   }
    168 }
    169 
    170 TEST(DBusMonitorTest, AddFilterAfterStop) {
    171   DBusSigFilterTest filter1;
    172   DBusSigFilterTest filter2;
    173   rtc::scoped_ptr<rtc::DBusMonitor> monitor;
    174   monitor.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
    175   if (monitor) {
    176     EXPECT_TRUE(monitor->AddFilter(&filter1));
    177     EXPECT_TRUE(monitor->StartMonitoring());
    178     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
    179     EXPECT_TRUE_WAIT(filter1.MessageReceived(), kTimeoutMs);
    180     EXPECT_TRUE(monitor->StopMonitoring());
    181     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
    182 
    183     EXPECT_TRUE(monitor->AddFilter(&filter2));
    184     EXPECT_TRUE(monitor->StartMonitoring());
    185     EXPECT_EQ_WAIT(DBusMonitor::DMS_RUNNING, monitor->GetStatus(), kTimeoutMs);
    186     EXPECT_TRUE_WAIT(filter1.MessageReceived(), kTimeoutMs);
    187     EXPECT_TRUE_WAIT(filter2.MessageReceived(), kTimeoutMs);
    188     EXPECT_TRUE(monitor->StopMonitoring());
    189     EXPECT_EQ(monitor->GetStatus(), DBusMonitor::DMS_STOPPED);
    190   } else {
    191     LOG(LS_WARNING) << "DBus Monitor not started. Skipping test.";
    192   }
    193 }
    194 
    195 TEST(DBusMonitorTest, StopRightAfterStart) {
    196   DBusSigFilterTest filter;
    197   rtc::scoped_ptr<rtc::DBusMonitor> monitor;
    198   monitor.reset(rtc::DBusMonitor::Create(DBUS_BUS_SYSTEM));
    199   if (monitor) {
    200     EXPECT_TRUE(monitor->AddFilter(&filter));
    201 
    202     EXPECT_TRUE(monitor->StartMonitoring());
    203     EXPECT_TRUE(monitor->StopMonitoring());
    204 
    205     // Stop the monitoring thread right after it had been started.
    206     // If the monitoring thread got a chance to receive a DBus signal, it would
    207     // post a message to the main thread and signal the main thread wakeup.
    208     // This message will be cleaned out automatically when the filter get
    209     // destructed. Here we also consume the wakeup signal (if there is one) so
    210     // that the testing (main) thread is reset to a clean state.
    211     rtc::Thread::Current()->ProcessMessages(1);
    212   } else {
    213     LOG(LS_WARNING) << "DBus Monitor not started.";
    214   }
    215 }
    216 
    217 TEST(DBusSigFilter, BuildFilterString) {
    218   EXPECT_EQ(DBusSigFilter::BuildFilterString("", "", ""),
    219       (DBUS_TYPE "='" DBUS_SIGNAL "'"));
    220   EXPECT_EQ(DBusSigFilter::BuildFilterString("p", "", ""),
    221       (DBUS_TYPE "='" DBUS_SIGNAL "'," DBUS_PATH "='p'"));
    222   EXPECT_EQ(DBusSigFilter::BuildFilterString("p","i", ""),
    223       (DBUS_TYPE "='" DBUS_SIGNAL "'," DBUS_PATH "='p',"
    224           DBUS_INTERFACE "='i'"));
    225   EXPECT_EQ(DBusSigFilter::BuildFilterString("p","i","m"),
    226       (DBUS_TYPE "='" DBUS_SIGNAL "'," DBUS_PATH "='p',"
    227           DBUS_INTERFACE "='i'," DBUS_MEMBER "='m'"));
    228 }
    229 
    230 }  // namespace rtc
    231 
    232 #endif  // HAVE_DBUS_GLIB
    233