// Copyright 2015 The Weave Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/notification/notification_parser.h" #include <gmock/gmock.h> #include <gtest/gtest.h> #include <weave/test/unittest_utils.h> using testing::SaveArg; using testing::Invoke; using testing::_; namespace weave { using test::CreateDictionaryValue; MATCHER_P(MatchDict, str, "") { return arg.Equals(CreateDictionaryValue(str).get()); } class MockNotificationDelegate : public NotificationDelegate { public: MOCK_METHOD1(OnConnected, void(const std::string&)); MOCK_METHOD0(OnDisconnected, void()); MOCK_METHOD0(OnPermanentFailure, void()); MOCK_METHOD2(OnCommandCreated, void(const base::DictionaryValue& command, const std::string& channel_name)); MOCK_METHOD1(OnDeviceDeleted, void(const std::string&)); }; class NotificationParserTest : public ::testing::Test { protected: testing::StrictMock<MockNotificationDelegate> delegate_; }; TEST_F(NotificationParserTest, CommandCreated) { auto json = CreateDictionaryValue(R"({ "kind": "weave#notification", "type": "COMMAND_CREATED", "deviceId": "device_id", "command": { "kind": "weave#command", "deviceId": "device_id", "state": "queued", "name": "storage.list", "parameters": { "path": "/somepath1" }, "expirationTimeMs": "1406036174811", "id": "command_id", "creationTimeMs": "1403444174811" }, "commandId": "command_id" })"); const char expected_json[] = R"({ "kind": "weave#command", "deviceId": "device_id", "state": "queued", "name": "storage.list", "parameters": { "path": "/somepath1" }, "expirationTimeMs": "1406036174811", "id": "command_id", "creationTimeMs": "1403444174811" })"; EXPECT_CALL(delegate_, OnCommandCreated(MatchDict(expected_json), "foo")) .Times(1); EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "foo")); } TEST_F(NotificationParserTest, DeviceDeleted) { auto json = CreateDictionaryValue(R"({ "kind":"weave#notification", "type":"DEVICE_DELETED", "deviceId":"some_device_id" })"); std::string device_id; EXPECT_CALL(delegate_, OnDeviceDeleted(_)).WillOnce(SaveArg<0>(&device_id)); EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "foo")); EXPECT_EQ("some_device_id", device_id); } TEST_F(NotificationParserTest, Failure_NoKind) { auto json = CreateDictionaryValue(R"({ "type": "COMMAND_CREATED", "deviceId": "device_id", "command": { "kind": "weave#command", "deviceId": "device_id", "state": "queued", "name": "storage.list", "parameters": { "path": "/somepath1" }, "expirationTimeMs": "1406036174811", "id": "command_id", "creationTimeMs": "1403444174811" }, "commandId": "command_id" })"); EXPECT_FALSE(ParseNotificationJson(*json, &delegate_, "bar")); } TEST_F(NotificationParserTest, Failure_NoType) { auto json = CreateDictionaryValue(R"({ "kind": "weave#notification", "deviceId": "device_id", "command": { "kind": "weave#command", "deviceId": "device_id", "state": "queued", "name": "storage.list", "parameters": { "path": "/somepath1" }, "expirationTimeMs": "1406036174811", "id": "command_id", "creationTimeMs": "1403444174811" }, "commandId": "command_id" })"); EXPECT_FALSE(ParseNotificationJson(*json, &delegate_, "baz")); } TEST_F(NotificationParserTest, IgnoredNotificationType) { auto json = CreateDictionaryValue(R"({ "kind": "weave#notification", "type": "COMMAND_EXPIRED", "deviceId": "device_id", "command": { "kind": "weave#command", "deviceId": "device_id", "state": "queued", "name": "storage.list", "parameters": { "path": "/somepath1" }, "expirationTimeMs": "1406036174811", "id": "command_id", "creationTimeMs": "1403444174811" }, "commandId": "command_id" })"); EXPECT_TRUE(ParseNotificationJson(*json, &delegate_, "quux")); } } // namespace weave