blob: 7aa6c9fc1fd0f8bb96671c1333a77a5005122535 [file] [log] [blame]
// Copyright 2014 The Chromium OS 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 <gtest/gtest.h>
#include "buffet/states/state_change_queue.h"
namespace buffet {
class StateChangeQueueTest : public ::testing::Test {
public:
void SetUp() override {
queue_.reset(new StateChangeQueue(100));
}
void TearDown() override {
queue_.reset();
}
std::unique_ptr<StateChangeQueue> queue_;
};
TEST_F(StateChangeQueueTest, Empty) {
EXPECT_TRUE(queue_->IsEmpty());
EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
}
TEST_F(StateChangeQueueTest, UpdateOne) {
StateChange change{
base::Time::Now(),
chromeos::VariantDictionary{{"prop.name", int{23}}}
};
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change.timestamp,
change.changed_properties));
EXPECT_FALSE(queue_->IsEmpty());
auto changes = queue_->GetAndClearRecordedStateChanges();
ASSERT_EQ(1, changes.size());
EXPECT_EQ(change.timestamp, changes.front().timestamp);
EXPECT_EQ(change.changed_properties, changes.front().changed_properties);
EXPECT_TRUE(queue_->IsEmpty());
EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
}
TEST_F(StateChangeQueueTest, UpdateMany) {
StateChange change1{
base::Time::Now(),
chromeos::VariantDictionary{{"prop.name1", int{23}}}
};
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change1.timestamp,
change1.changed_properties));
StateChange change2{
base::Time::Now(),
chromeos::VariantDictionary{
{"prop.name1", int{17}},
{"prop.name2", double{1.0}},
{"prop.name3", bool{false}},
}
};
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change2.timestamp,
change2.changed_properties));
EXPECT_FALSE(queue_->IsEmpty());
auto changes = queue_->GetAndClearRecordedStateChanges();
ASSERT_EQ(2, changes.size());
EXPECT_EQ(change1.timestamp, changes[0].timestamp);
EXPECT_EQ(change1.changed_properties, changes[0].changed_properties);
EXPECT_EQ(change2.timestamp, changes[1].timestamp);
EXPECT_EQ(change2.changed_properties, changes[1].changed_properties);
EXPECT_TRUE(queue_->IsEmpty());
EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
}
TEST_F(StateChangeQueueTest, GroupByTimestamp) {
base::Time timestamp = base::Time::Now();
base::TimeDelta time_delta = base::TimeDelta::FromMinutes(1);
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
timestamp,
chromeos::VariantDictionary{{"prop.name1", int{1}}}));
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
timestamp,
chromeos::VariantDictionary{{"prop.name2", int{2}}}));
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
timestamp,
chromeos::VariantDictionary{{"prop.name1", int{3}}}));
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
timestamp + time_delta,
chromeos::VariantDictionary{{"prop.name1", int{4}}}));
auto changes = queue_->GetAndClearRecordedStateChanges();
ASSERT_EQ(2, changes.size());
chromeos::VariantDictionary expected1{
{"prop.name1", int{3}},
{"prop.name2", int{2}},
};
chromeos::VariantDictionary expected2{
{"prop.name1", int{4}},
};
EXPECT_EQ(timestamp, changes[0].timestamp);
EXPECT_EQ(expected1, changes[0].changed_properties);
EXPECT_EQ(timestamp + time_delta, changes[1].timestamp);
EXPECT_EQ(expected2, changes[1].changed_properties);
}
TEST_F(StateChangeQueueTest, MaxQueueSize) {
queue_.reset(new StateChangeQueue(2));
base::Time start_time = base::Time::Now();
base::TimeDelta time_delta1 = base::TimeDelta::FromMinutes(1);
base::TimeDelta time_delta2 = base::TimeDelta::FromMinutes(3);
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
start_time,
chromeos::VariantDictionary{
{"prop.name1", int{1}},
{"prop.name2", int{2}},
}));
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
start_time + time_delta1,
chromeos::VariantDictionary{
{"prop.name1", int{3}},
{"prop.name3", int{4}},
}));
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
start_time + time_delta2,
chromeos::VariantDictionary{
{"prop.name10", int{10}},
{"prop.name11", int{11}},
}));
auto changes = queue_->GetAndClearRecordedStateChanges();
ASSERT_EQ(2, changes.size());
chromeos::VariantDictionary expected1{
{"prop.name1", int{3}},
{"prop.name2", int{2}},
{"prop.name3", int{4}},
};
EXPECT_EQ(start_time + time_delta1, changes[0].timestamp);
EXPECT_EQ(expected1, changes[0].changed_properties);
chromeos::VariantDictionary expected2{
{"prop.name10", int{10}},
{"prop.name11", int{11}},
};
EXPECT_EQ(start_time + time_delta2, changes[1].timestamp);
EXPECT_EQ(expected2, changes[1].changed_properties);
}
} // namespace buffet