Vitaly Buka | 4615e0d | 2015-10-14 15:35:12 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Weave Authors. All rights reserved. |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Stefan Sauer | 2d16dfa | 2015-09-25 17:08:35 +0200 | [diff] [blame] | 5 | #include "src/notification/notification_parser.h" |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 6 | |
| 7 | #include <gmock/gmock.h> |
| 8 | #include <gtest/gtest.h> |
Alex Vakulenko | 8a05beb | 2015-11-24 17:13:20 -0800 | [diff] [blame] | 9 | #include <weave/test/unittest_utils.h> |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 10 | |
Alex Vakulenko | 6b40d8f | 2015-06-24 11:44:22 -0700 | [diff] [blame] | 11 | using testing::SaveArg; |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 12 | using testing::Invoke; |
| 13 | using testing::_; |
| 14 | |
Vitaly Buka | b6f015a | 2015-07-09 14:59:23 -0700 | [diff] [blame] | 15 | namespace weave { |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 16 | |
Vitaly Buka | 0f6b2ec | 2015-08-20 15:35:19 -0700 | [diff] [blame] | 17 | using test::CreateDictionaryValue; |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 18 | |
Alex Vakulenko | e07c29d | 2015-10-22 10:31:12 -0700 | [diff] [blame] | 19 | MATCHER_P(MatchDict, str, "") { |
| 20 | return arg.Equals(CreateDictionaryValue(str).get()); |
| 21 | } |
| 22 | |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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()); |
Vitaly Buka | 34668e7 | 2015-12-15 14:46:47 -0800 | [diff] [blame] | 28 | MOCK_METHOD2(OnCommandCreated, |
| 29 | void(const base::DictionaryValue& command, |
| 30 | const std::string& channel_name)); |
Alex Vakulenko | 6b40d8f | 2015-06-24 11:44:22 -0700 | [diff] [blame] | 31 | MOCK_METHOD1(OnDeviceDeleted, void(const std::string&)); |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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"({ |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 41 | "kind": "weave#notification", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 42 | "type": "COMMAND_CREATED", |
| 43 | "deviceId": "device_id", |
| 44 | "command": { |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 45 | "kind": "weave#command", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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 | |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 59 | const char expected_json[] = R"({ |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 60 | "kind": "weave#command", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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 | })"; |
Alex Vakulenko | e07c29d | 2015-10-22 10:31:12 -0700 | [diff] [blame] | 71 | |
| 72 | EXPECT_CALL(delegate_, OnCommandCreated(MatchDict(expected_json), "foo")) |
| 73 | .Times(1); |
| 74 | EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "foo")); |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 75 | } |
| 76 | |
Alex Vakulenko | 6b40d8f | 2015-06-24 11:44:22 -0700 | [diff] [blame] | 77 | TEST_F(NotificationParserTest, DeviceDeleted) { |
| 78 | auto json = CreateDictionaryValue(R"({ |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 79 | "kind":"weave#notification", |
Alex Vakulenko | 6b40d8f | 2015-06-24 11:44:22 -0700 | [diff] [blame] | 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)); |
Alex Vakulenko | e07c29d | 2015-10-22 10:31:12 -0700 | [diff] [blame] | 86 | EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "foo")); |
Alex Vakulenko | 6b40d8f | 2015-06-24 11:44:22 -0700 | [diff] [blame] | 87 | EXPECT_EQ("some_device_id", device_id); |
| 88 | } |
| 89 | |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 90 | TEST_F(NotificationParserTest, Failure_NoKind) { |
| 91 | auto json = CreateDictionaryValue(R"({ |
| 92 | "type": "COMMAND_CREATED", |
| 93 | "deviceId": "device_id", |
| 94 | "command": { |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 95 | "kind": "weave#command", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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 | |
Alex Vakulenko | e07c29d | 2015-10-22 10:31:12 -0700 | [diff] [blame] | 109 | EXPECT_FALSE(ParseNotificationJson(*json, &delegate_, "bar")); |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | TEST_F(NotificationParserTest, Failure_NoType) { |
| 113 | auto json = CreateDictionaryValue(R"({ |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 114 | "kind": "weave#notification", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 115 | "deviceId": "device_id", |
| 116 | "command": { |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 117 | "kind": "weave#command", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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 | |
Alex Vakulenko | e07c29d | 2015-10-22 10:31:12 -0700 | [diff] [blame] | 131 | EXPECT_FALSE(ParseNotificationJson(*json, &delegate_, "baz")); |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | TEST_F(NotificationParserTest, IgnoredNotificationType) { |
| 135 | auto json = CreateDictionaryValue(R"({ |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 136 | "kind": "weave#notification", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 137 | "type": "COMMAND_EXPIRED", |
| 138 | "deviceId": "device_id", |
| 139 | "command": { |
Alex Vakulenko | f21c83a | 2015-11-25 11:34:33 -0800 | [diff] [blame] | 140 | "kind": "weave#command", |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 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 | |
Alex Vakulenko | e07c29d | 2015-10-22 10:31:12 -0700 | [diff] [blame] | 154 | EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "quux")); |
Alex Vakulenko | 6e3c30e | 2015-05-21 17:39:25 -0700 | [diff] [blame] | 155 | } |
| 156 | |
Vitaly Buka | b6f015a | 2015-07-09 14:59:23 -0700 | [diff] [blame] | 157 | } // namespace weave |