Home | History | Annotate | Download | only in notification
      1 // Copyright 2015 The Weave 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 "src/notification/notification_parser.h"
      6 
      7 #include <gmock/gmock.h>
      8 #include <gtest/gtest.h>
      9 #include <weave/test/unittest_utils.h>
     10 
     11 using testing::SaveArg;
     12 using testing::Invoke;
     13 using testing::_;
     14 
     15 namespace weave {
     16 
     17 using test::CreateDictionaryValue;
     18 
     19 MATCHER_P(MatchDict, str, "") {
     20   return arg.Equals(CreateDictionaryValue(str).get());
     21 }
     22 
     23 class MockNotificationDelegate : public NotificationDelegate {
     24  public:
     25   MOCK_METHOD1(OnConnected, void(const std::string&));
     26   MOCK_METHOD0(OnDisconnected, void());
     27   MOCK_METHOD0(OnPermanentFailure, void());
     28   MOCK_METHOD2(OnCommandCreated,
     29                void(const base::DictionaryValue& command,
     30                     const std::string& channel_name));
     31   MOCK_METHOD1(OnDeviceDeleted, void(const std::string&));
     32 };
     33 
     34 class NotificationParserTest : public ::testing::Test {
     35  protected:
     36   testing::StrictMock<MockNotificationDelegate> delegate_;
     37 };
     38 
     39 TEST_F(NotificationParserTest, CommandCreated) {
     40   auto json = CreateDictionaryValue(R"({
     41     "kind": "weave#notification",
     42     "type": "COMMAND_CREATED",
     43     "deviceId": "device_id",
     44     "command": {
     45       "kind": "weave#command",
     46       "deviceId": "device_id",
     47       "state": "queued",
     48       "name": "storage.list",
     49       "parameters": {
     50         "path": "/somepath1"
     51       },
     52       "expirationTimeMs": "1406036174811",
     53       "id": "command_id",
     54       "creationTimeMs": "1403444174811"
     55     },
     56     "commandId": "command_id"
     57   })");
     58 
     59   const char expected_json[] = R"({
     60       "kind": "weave#command",
     61       "deviceId": "device_id",
     62       "state": "queued",
     63       "name": "storage.list",
     64       "parameters": {
     65         "path": "/somepath1"
     66       },
     67       "expirationTimeMs": "1406036174811",
     68       "id": "command_id",
     69       "creationTimeMs": "1403444174811"
     70     })";
     71 
     72   EXPECT_CALL(delegate_, OnCommandCreated(MatchDict(expected_json), "foo"))
     73       .Times(1);
     74   EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "foo"));
     75 }
     76 
     77 TEST_F(NotificationParserTest, DeviceDeleted) {
     78   auto json = CreateDictionaryValue(R"({
     79     "kind":"weave#notification",
     80     "type":"DEVICE_DELETED",
     81     "deviceId":"some_device_id"
     82   })");
     83 
     84   std::string device_id;
     85   EXPECT_CALL(delegate_, OnDeviceDeleted(_)).WillOnce(SaveArg<0>(&device_id));
     86   EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "foo"));
     87   EXPECT_EQ("some_device_id", device_id);
     88 }
     89 
     90 TEST_F(NotificationParserTest, Failure_NoKind) {
     91   auto json = CreateDictionaryValue(R"({
     92     "type": "COMMAND_CREATED",
     93     "deviceId": "device_id",
     94     "command": {
     95       "kind": "weave#command",
     96       "deviceId": "device_id",
     97       "state": "queued",
     98       "name": "storage.list",
     99       "parameters": {
    100         "path": "/somepath1"
    101       },
    102       "expirationTimeMs": "1406036174811",
    103       "id": "command_id",
    104       "creationTimeMs": "1403444174811"
    105     },
    106     "commandId": "command_id"
    107   })");
    108 
    109   EXPECT_FALSE(ParseNotificationJson(*json, &delegate_, "bar"));
    110 }
    111 
    112 TEST_F(NotificationParserTest, Failure_NoType) {
    113   auto json = CreateDictionaryValue(R"({
    114     "kind": "weave#notification",
    115     "deviceId": "device_id",
    116     "command": {
    117       "kind": "weave#command",
    118       "deviceId": "device_id",
    119       "state": "queued",
    120       "name": "storage.list",
    121       "parameters": {
    122         "path": "/somepath1"
    123       },
    124       "expirationTimeMs": "1406036174811",
    125       "id": "command_id",
    126       "creationTimeMs": "1403444174811"
    127     },
    128     "commandId": "command_id"
    129   })");
    130 
    131   EXPECT_FALSE(ParseNotificationJson(*json, &delegate_, "baz"));
    132 }
    133 
    134 TEST_F(NotificationParserTest, IgnoredNotificationType) {
    135   auto json = CreateDictionaryValue(R"({
    136     "kind": "weave#notification",
    137     "type": "COMMAND_EXPIRED",
    138     "deviceId": "device_id",
    139     "command": {
    140       "kind": "weave#command",
    141       "deviceId": "device_id",
    142       "state": "queued",
    143       "name": "storage.list",
    144       "parameters": {
    145         "path": "/somepath1"
    146       },
    147       "expirationTimeMs": "1406036174811",
    148       "id": "command_id",
    149       "creationTimeMs": "1403444174811"
    150     },
    151     "commandId": "command_id"
    152   })");
    153 
    154   EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "quux"));
    155 }
    156 
    157 }  // namespace weave
    158