// 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