blob: 68fadcc8412570dfb691b9b63da5863a963fac84 [file] [log] [blame]
Alex Vakulenko57123b22014-10-28 13:50:16 -07001// Copyright 2014 The Chromium OS 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
Alex Vakulenko57123b22014-10-28 13:50:16 -07006#include "buffet/states/state_change_queue.h"
7
Alex Deymof6cbe322014-11-10 19:55:35 -08008#include <gtest/gtest.h>
9
Anton Muhin01829452014-11-21 02:16:04 +040010#include "buffet/commands/unittest_utils.h"
11
Alex Vakulenko57123b22014-10-28 13:50:16 -070012namespace buffet {
13
14class StateChangeQueueTest : public ::testing::Test {
15 public:
16 void SetUp() override {
17 queue_.reset(new StateChangeQueue(100));
18 }
19
20 void TearDown() override {
21 queue_.reset();
22 }
23
24 std::unique_ptr<StateChangeQueue> queue_;
25};
26
27TEST_F(StateChangeQueueTest, Empty) {
28 EXPECT_TRUE(queue_->IsEmpty());
29 EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
30}
31
32TEST_F(StateChangeQueueTest, UpdateOne) {
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070033 StateChange change{
34 base::Time::Now(),
Anton Muhin01829452014-11-21 02:16:04 +040035 native_types::Object{{"prop.name", unittests::make_int_prop_value(23)}}
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070036 };
37 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change.timestamp,
38 change.changed_properties));
Alex Vakulenko57123b22014-10-28 13:50:16 -070039 EXPECT_FALSE(queue_->IsEmpty());
40 auto changes = queue_->GetAndClearRecordedStateChanges();
41 ASSERT_EQ(1, changes.size());
42 EXPECT_EQ(change.timestamp, changes.front().timestamp);
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070043 EXPECT_EQ(change.changed_properties, changes.front().changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -070044 EXPECT_TRUE(queue_->IsEmpty());
45 EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
46}
47
48TEST_F(StateChangeQueueTest, UpdateMany) {
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070049 StateChange change1{
50 base::Time::Now(),
Anton Muhin01829452014-11-21 02:16:04 +040051 native_types::Object{{"prop.name1", unittests::make_int_prop_value(23)}}
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070052 };
53 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change1.timestamp,
54 change1.changed_properties));
55 StateChange change2{
56 base::Time::Now(),
Anton Muhin01829452014-11-21 02:16:04 +040057 native_types::Object{
58 {"prop.name1", unittests::make_int_prop_value(17)},
59 {"prop.name2", unittests::make_double_prop_value(1.0)},
60 {"prop.name3", unittests::make_bool_prop_value(false)},
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070061 }
62 };
63 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change2.timestamp,
64 change2.changed_properties));
Alex Vakulenko57123b22014-10-28 13:50:16 -070065 EXPECT_FALSE(queue_->IsEmpty());
66 auto changes = queue_->GetAndClearRecordedStateChanges();
67 ASSERT_EQ(2, changes.size());
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070068 EXPECT_EQ(change1.timestamp, changes[0].timestamp);
69 EXPECT_EQ(change1.changed_properties, changes[0].changed_properties);
70 EXPECT_EQ(change2.timestamp, changes[1].timestamp);
71 EXPECT_EQ(change2.changed_properties, changes[1].changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -070072 EXPECT_TRUE(queue_->IsEmpty());
73 EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
74}
75
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070076TEST_F(StateChangeQueueTest, GroupByTimestamp) {
77 base::Time timestamp = base::Time::Now();
78 base::TimeDelta time_delta = base::TimeDelta::FromMinutes(1);
79
80 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
81 timestamp,
Anton Muhin01829452014-11-21 02:16:04 +040082 native_types::Object{{"prop.name1", unittests::make_int_prop_value(1)}}));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070083
84 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
85 timestamp,
Anton Muhin01829452014-11-21 02:16:04 +040086 native_types::Object{{"prop.name2", unittests::make_int_prop_value(2)}}));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070087
88 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
89 timestamp,
Anton Muhin01829452014-11-21 02:16:04 +040090 native_types::Object{{"prop.name1", unittests::make_int_prop_value(3)}}));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070091
92 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
93 timestamp + time_delta,
Anton Muhin01829452014-11-21 02:16:04 +040094 native_types::Object{{"prop.name1", unittests::make_int_prop_value(4)}}));
Alex Vakulenkoff73cf22014-10-29 09:53:52 -070095
96 auto changes = queue_->GetAndClearRecordedStateChanges();
97 ASSERT_EQ(2, changes.size());
98
Anton Muhin01829452014-11-21 02:16:04 +040099 native_types::Object expected1{
100 {"prop.name1", unittests::make_int_prop_value(3)},
101 {"prop.name2", unittests::make_int_prop_value(2)},
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700102 };
Anton Muhin01829452014-11-21 02:16:04 +0400103 native_types::Object expected2{
104 {"prop.name1", unittests::make_int_prop_value(4)},
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700105 };
106 EXPECT_EQ(timestamp, changes[0].timestamp);
107 EXPECT_EQ(expected1, changes[0].changed_properties);
108 EXPECT_EQ(timestamp + time_delta, changes[1].timestamp);
109 EXPECT_EQ(expected2, changes[1].changed_properties);
110}
111
Alex Vakulenko57123b22014-10-28 13:50:16 -0700112TEST_F(StateChangeQueueTest, MaxQueueSize) {
113 queue_.reset(new StateChangeQueue(2));
114 base::Time start_time = base::Time::Now();
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700115 base::TimeDelta time_delta1 = base::TimeDelta::FromMinutes(1);
116 base::TimeDelta time_delta2 = base::TimeDelta::FromMinutes(3);
Alex Vakulenko57123b22014-10-28 13:50:16 -0700117
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700118 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
119 start_time,
Anton Muhin01829452014-11-21 02:16:04 +0400120 native_types::Object{
121 {"prop.name1", unittests::make_int_prop_value(1)},
122 {"prop.name2", unittests::make_int_prop_value(2)},
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700123 }));
Alex Vakulenko57123b22014-10-28 13:50:16 -0700124
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700125 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
126 start_time + time_delta1,
Anton Muhin01829452014-11-21 02:16:04 +0400127 native_types::Object{
128 {"prop.name1", unittests::make_int_prop_value(3)},
129 {"prop.name3", unittests::make_int_prop_value(4)},
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700130 }));
Alex Vakulenko57123b22014-10-28 13:50:16 -0700131
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700132 ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
133 start_time + time_delta2,
Anton Muhin01829452014-11-21 02:16:04 +0400134 native_types::Object{
135 {"prop.name10", unittests::make_int_prop_value(10)},
136 {"prop.name11", unittests::make_int_prop_value(11)},
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700137 }));
Alex Vakulenko57123b22014-10-28 13:50:16 -0700138
139 auto changes = queue_->GetAndClearRecordedStateChanges();
140 ASSERT_EQ(2, changes.size());
141
Anton Muhin01829452014-11-21 02:16:04 +0400142 native_types::Object expected1{
143 {"prop.name1", unittests::make_int_prop_value(3)},
144 {"prop.name2", unittests::make_int_prop_value(2)},
145 {"prop.name3", unittests::make_int_prop_value(4)},
Alex Vakulenko57123b22014-10-28 13:50:16 -0700146 };
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700147 EXPECT_EQ(start_time + time_delta1, changes[0].timestamp);
148 EXPECT_EQ(expected1, changes[0].changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -0700149
Anton Muhin01829452014-11-21 02:16:04 +0400150 native_types::Object expected2{
151 {"prop.name10", unittests::make_int_prop_value(10)},
152 {"prop.name11", unittests::make_int_prop_value(11)},
Alex Vakulenko57123b22014-10-28 13:50:16 -0700153 };
Alex Vakulenkoff73cf22014-10-29 09:53:52 -0700154 EXPECT_EQ(start_time + time_delta2, changes[1].timestamp);
155 EXPECT_EQ(expected2, changes[1].changed_properties);
Alex Vakulenko57123b22014-10-28 13:50:16 -0700156}
157
158} // namespace buffet