buffet: Add state change ID to state queue
Each state update will now increment a state change ID to help correlate
device state and command updates.
Right now, each call to NotifyPropertiesUpdated() will increment the ID.
This functionality will be used in subsequent CLs to implement ordering
of state and command updates on GCD server.
BUG=brillo:1202
TEST=`FEATURES=test emerge-link buffet`
Change-Id: I8cd591ec83cef7c1f1019728c0492fdee23d64dc
Reviewed-on: https://chromium-review.googlesource.com/282081
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/states/mock_state_change_queue_interface.h b/buffet/states/mock_state_change_queue_interface.h
index 54b2ccc..c984dbb 100644
--- a/buffet/states/mock_state_change_queue_interface.h
+++ b/buffet/states/mock_state_change_queue_interface.h
@@ -20,6 +20,8 @@
bool(base::Time timestamp,
native_types::Object changed_properties));
MOCK_METHOD0(GetAndClearRecordedStateChanges, std::vector<StateChange>());
+ MOCK_CONST_METHOD0(GetLastStateChangeId,
+ StateChangeQueueInterface::UpdateID());
};
} // namespace buffet
diff --git a/buffet/states/state_change_queue.cc b/buffet/states/state_change_queue.cc
index 74ac682..a6e1a72 100644
--- a/buffet/states/state_change_queue.cc
+++ b/buffet/states/state_change_queue.cc
@@ -42,6 +42,7 @@
element_old->second.end());
state_changes_.erase(element_old);
}
+ ++last_change_id_;
return true;
}
diff --git a/buffet/states/state_change_queue.h b/buffet/states/state_change_queue.h
index 9181ef4..83161fe 100644
--- a/buffet/states/state_change_queue.h
+++ b/buffet/states/state_change_queue.h
@@ -26,6 +26,7 @@
base::Time timestamp,
native_types::Object changed_properties) override;
std::vector<StateChange> GetAndClearRecordedStateChanges() override;
+ UpdateID GetLastStateChangeId() const override { return last_change_id_; }
private:
// To make sure we do not call NotifyPropertiesUpdated() and
@@ -40,6 +41,10 @@
// Accumulated list of device state change notifications.
std::map<base::Time, native_types::Object> state_changes_;
+ // An ID of last state change update. Each NotifyPropertiesUpdated()
+ // invocation increments this value by 1.
+ UpdateID last_change_id_{0};
+
DISALLOW_COPY_AND_ASSIGN(StateChangeQueue);
};
diff --git a/buffet/states/state_change_queue_interface.h b/buffet/states/state_change_queue_interface.h
index 44e0f79..7c67829 100644
--- a/buffet/states/state_change_queue_interface.h
+++ b/buffet/states/state_change_queue_interface.h
@@ -10,7 +10,7 @@
#include <base/time/time.h>
#include <chromeos/variant_dictionary.h>
-#include "commands/schema_utils.h"
+#include "buffet/commands/schema_utils.h"
namespace buffet {
@@ -29,6 +29,8 @@
// change notification events.
class StateChangeQueueInterface {
public:
+ using UpdateID = uint64_t;
+
// Returns true if the state change notification queue is empty.
virtual bool IsEmpty() const = 0;
@@ -40,9 +42,13 @@
// Returns the recorded state changes since last time this method was called.
virtual std::vector<StateChange> GetAndClearRecordedStateChanges() = 0;
+ // Returns an ID of last state change update. Each NotifyPropertiesUpdated()
+ // invocation increments this value by 1.
+ virtual UpdateID GetLastStateChangeId() const = 0;
+
protected:
// No one should attempt do destroy the queue through the interface.
- ~StateChangeQueueInterface() {}
+ virtual ~StateChangeQueueInterface() {}
};
} // namespace buffet
diff --git a/buffet/states/state_change_queue_unittest.cc b/buffet/states/state_change_queue_unittest.cc
index 68fadcc..1a30f97 100644
--- a/buffet/states/state_change_queue_unittest.cc
+++ b/buffet/states/state_change_queue_unittest.cc
@@ -26,6 +26,7 @@
TEST_F(StateChangeQueueTest, Empty) {
EXPECT_TRUE(queue_->IsEmpty());
+ EXPECT_EQ(0, queue_->GetLastStateChangeId());
EXPECT_TRUE(queue_->GetAndClearRecordedStateChanges().empty());
}
@@ -37,7 +38,9 @@
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change.timestamp,
change.changed_properties));
EXPECT_FALSE(queue_->IsEmpty());
+ EXPECT_EQ(1, queue_->GetLastStateChangeId());
auto changes = queue_->GetAndClearRecordedStateChanges();
+ EXPECT_EQ(1, queue_->GetLastStateChangeId());
ASSERT_EQ(1, changes.size());
EXPECT_EQ(change.timestamp, changes.front().timestamp);
EXPECT_EQ(change.changed_properties, changes.front().changed_properties);
@@ -62,6 +65,7 @@
};
ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change2.timestamp,
change2.changed_properties));
+ EXPECT_EQ(2, queue_->GetLastStateChangeId());
EXPECT_FALSE(queue_->IsEmpty());
auto changes = queue_->GetAndClearRecordedStateChanges();
ASSERT_EQ(2, changes.size());
@@ -94,6 +98,7 @@
native_types::Object{{"prop.name1", unittests::make_int_prop_value(4)}}));
auto changes = queue_->GetAndClearRecordedStateChanges();
+ EXPECT_EQ(4, queue_->GetLastStateChangeId());
ASSERT_EQ(2, changes.size());
native_types::Object expected1{
@@ -136,6 +141,7 @@
{"prop.name11", unittests::make_int_prop_value(11)},
}));
+ EXPECT_EQ(3, queue_->GetLastStateChangeId());
auto changes = queue_->GetAndClearRecordedStateChanges();
ASSERT_EQ(2, changes.size());