blob: 7eeaa28f2d089d6072bdcd2b39ee7222cdd4544c [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Alex Vakulenko57123b22014-10-28 13:50:16 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Stefan Sauer2d16dfa2015-09-25 17:08:35 +02005#include "src/states/state_change_queue.h"
Alex Vakulenko57123b22014-10-28 13:50:16 -07006
Alex Deymof6cbe322014-11-10 19:55:35 -08007#include <gtest/gtest.h>
Alex Vakulenko8a05beb2015-11-24 17:13:20 -08008#include <weave/test/unittest_utils.h>
Alex Deymof6cbe322014-11-10 19:55:35 -08009
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020010#include "src/bind_lambda.h"
Anton Muhin01829452014-11-21 02:16:04 +040011
Vitaly Bukab6f015a2015-07-09 14:59:23 -070012namespace weave {
Alex Vakulenko57123b22014-10-28 13:50:16 -070013
Alex Vakulenko7d669212015-11-23 16:05:24 -080014using test::CreateDictionaryValue;
15
Alex Vakulenko57123b22014-10-28 13:50:16 -070016class StateChangeQueueTest : public ::testing::Test {
17 public:
Vitaly Bukaa647c852015-07-06 14:51:01 -070018 void SetUp() override { queue_.reset(new StateChangeQueue(100)); }
Alex Vakulenko57123b22014-10-28 13:50:16 -070019
Vitaly Bukaa647c852015-07-06 14:51:01 -070020 void TearDown() override { queue_.reset(); }
Alex Vakulenko57123b22014-10-28 13:50:16 -070021
22 std::unique_ptr<StateChangeQueue> queue_;
23};
24
25TEST_F(StateChangeQueueTest, Empty) {
Alex Vakulenko57123b22014-10-28 13:50:16 -070026 EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
27}
28
29TEST_F(StateChangeQueueTest, UpdateOne) {
Alex Vakulenko7d669212015-11-23 16:05:24 -080030 auto timestamp = base::Time::Now();
31 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
Alex Vakulenko6869ed72015-12-04 13:59:23 -080032 timestamp, *CreateDictionaryValue("{'prop': {'name': 23}}")));
Alex Vakulenko57123b22014-10-28 13:50:16 -070033 auto changes = queue_->GetAndClearRecordedStateChanges();
Vitaly Buka52d006a2015-11-21 17:14:51 -080034 ASSERT_EQ(1u, changes.size());
Alex Vakulenko7d669212015-11-23 16:05:24 -080035 EXPECT_EQ(timestamp, changes.front().timestamp);
36 EXPECT_JSON_EQ("{'prop':{'name': 23}}", *changes.front().changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -070037 EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
38}
39
Alex Vakulenko7d669212015-11-23 16:05:24 -080040TEST_F(StateChangeQueueTest, UpdateMany) {
41 auto timestamp1 = base::Time::Now();
42 const std::string state1 = "{'prop': {'name1': 23}}";
43 auto timestamp2 = timestamp1 + base::TimeDelta::FromSeconds(1);
44 const std::string state2 =
45 "{'prop': {'name1': 17, 'name2': 1.0, 'name3': false}}";
Vitaly Buka34668e72015-12-15 14:46:47 -080046 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(timestamp1,
47 *CreateDictionaryValue(state1)));
48 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(timestamp2,
49 *CreateDictionaryValue(state2)));
Alex Vakulenko7d669212015-11-23 16:05:24 -080050
Alex Vakulenko57123b22014-10-28 13:50:16 -070051 auto changes = queue_->GetAndClearRecordedStateChanges();
Vitaly Buka52d006a2015-11-21 17:14:51 -080052 ASSERT_EQ(2u, changes.size());
Alex Vakulenko7d669212015-11-23 16:05:24 -080053 EXPECT_EQ(timestamp1, changes[0].timestamp);
54 EXPECT_JSON_EQ(state1, *changes[0].changed_properties);
55 EXPECT_EQ(timestamp2, changes[1].timestamp);
56 EXPECT_JSON_EQ(state2, *changes[1].changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -070057 EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
58}
59
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070060TEST_F(StateChangeQueueTest, GroupByTimestamp) {
61 base::Time timestamp = base::Time::Now();
62 base::TimeDelta time_delta = base::TimeDelta::FromMinutes(1);
63
64 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
Alex Vakulenko6869ed72015-12-04 13:59:23 -080065 timestamp, *CreateDictionaryValue("{'prop': {'name1': 1}}")));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070066
67 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
Alex Vakulenko6869ed72015-12-04 13:59:23 -080068 timestamp, *CreateDictionaryValue("{'prop': {'name2': 2}}")));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070069
70 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
Alex Vakulenko6869ed72015-12-04 13:59:23 -080071 timestamp, *CreateDictionaryValue("{'prop': {'name1': 3}}")));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070072
73 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
Alex Vakulenko6869ed72015-12-04 13:59:23 -080074 timestamp + time_delta,
75 *CreateDictionaryValue("{'prop': {'name1': 4}}")));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070076
77 auto changes = queue_->GetAndClearRecordedStateChanges();
Vitaly Buka52d006a2015-11-21 17:14:51 -080078 ASSERT_EQ(2u, changes.size());
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070079
Alex Vakulenko7d669212015-11-23 16:05:24 -080080 const std::string expected1 = "{'prop': {'name1': 3, 'name2': 2}}";
81 const std::string expected2 = "{'prop': {'name1': 4}}";
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070082 EXPECT_EQ(timestamp, changes[0].timestamp);
Alex Vakulenko7d669212015-11-23 16:05:24 -080083 EXPECT_JSON_EQ(expected1, *changes[0].changed_properties);
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070084 EXPECT_EQ(timestamp + time_delta, changes[1].timestamp);
Alex Vakulenko7d669212015-11-23 16:05:24 -080085 EXPECT_JSON_EQ(expected2, *changes[1].changed_properties);
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070086}
87
Alex Vakulenko57123b22014-10-28 13:50:16 -070088TEST_F(StateChangeQueueTest, MaxQueueSize) {
89 queue_.reset(new StateChangeQueue(2));
90 base::Time start_time = base::Time::Now();
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070091 base::TimeDelta time_delta1 = base::TimeDelta::FromMinutes(1);
92 base::TimeDelta time_delta2 = base::TimeDelta::FromMinutes(3);
Alex Vakulenko57123b22014-10-28 13:50:16 -070093
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070094 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
Alex Vakulenko6869ed72015-12-04 13:59:23 -080095 start_time,
96 *CreateDictionaryValue("{'prop': {'name1': 1, 'name2': 2}}")));
Alex Vakulenko57123b22014-10-28 13:50:16 -070097
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070098 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
99 start_time + time_delta1,
Alex Vakulenko6869ed72015-12-04 13:59:23 -0800100 *CreateDictionaryValue("{'prop': {'name1': 3, 'name3': 4}}")));
Alex Vakulenko57123b22014-10-28 13:50:16 -0700101
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700102 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
103 start_time + time_delta2,
Alex Vakulenko6869ed72015-12-04 13:59:23 -0800104 *CreateDictionaryValue("{'prop': {'name10': 10, 'name11': 11}}")));
Alex Vakulenko57123b22014-10-28 13:50:16 -0700105
106 auto changes = queue_->GetAndClearRecordedStateChanges();
Vitaly Buka52d006a2015-11-21 17:14:51 -0800107 ASSERT_EQ(2u, changes.size());
Alex Vakulenko57123b22014-10-28 13:50:16 -0700108
Alex Vakulenko7d669212015-11-23 16:05:24 -0800109 const std::string expected1 =
110 "{'prop': {'name1': 3, 'name2': 2, 'name3': 4}}";
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700111 EXPECT_EQ(start_time + time_delta1, changes[0].timestamp);
Alex Vakulenko7d669212015-11-23 16:05:24 -0800112 EXPECT_JSON_EQ(expected1, *changes[0].changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -0700113
Vitaly Buka34668e72015-12-15 14:46:47 -0800114 const std::string expected2 = "{'prop': {'name10': 10, 'name11': 11}}";
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700115 EXPECT_EQ(start_time + time_delta2, changes[1].timestamp);
Alex Vakulenko7d669212015-11-23 16:05:24 -0800116 EXPECT_JSON_EQ(expected2, *changes[1].changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -0700117}
118
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700119} // namespace weave