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