Add support of Components/Traits to local privet APIs Added support for new privet APIs /privet/v3/traits and /privet/v3/components to obtain the full trait/component trees as well as expanded the existing /privet/v3/checkForUpdates to include the component/trait fingerprints. BUG: 25917521 Change-Id: Ib753817f88f611935057ca7bd1a1bf02addfb69c Reviewed-on: https://weave-review.googlesource.com/1791 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/privet/privet_handler_unittest.cc b/src/privet/privet_handler_unittest.cc index df4555c..77cabdd 100644 --- a/src/privet/privet_handler_unittest.cc +++ b/src/privet/privet_handler_unittest.cc
@@ -592,7 +592,7 @@ EXPECT_JSON_EQ("{'state': {'test': {}}, 'fingerprint': '0'}", HandleRequest("/privet/v3/state", "{}")); - cloud_.NotifyOnComponentTreeChanged(); + cloud_.NotifyOnStateChanged(); EXPECT_JSON_EQ("{'state': {'test': {}}, 'fingerprint': '1'}", HandleRequest("/privet/v3/state", "{}")); @@ -608,6 +608,32 @@ HandleRequest("/privet/v3/commandDefs", "{}")); } +TEST_F(PrivetHandlerSetupTest, Traits) { + EXPECT_JSON_EQ("{'traits': {'test': {}}, 'fingerprint': '0'}", + HandleRequest("/privet/v3/traits", "{}")); + + cloud_.NotifyOnTraitDefsChanged(); + + EXPECT_JSON_EQ("{'traits': {'test': {}}, 'fingerprint': '1'}", + HandleRequest("/privet/v3/traits", "{}")); +} + +TEST_F(PrivetHandlerSetupTest, Components) { + EXPECT_JSON_EQ("{'components': {'test': {}}, 'fingerprint': '0'}", + HandleRequest("/privet/v3/components", "{}")); + + cloud_.NotifyOnComponentTreeChanged(); + + EXPECT_JSON_EQ("{'components': {'test': {}}, 'fingerprint': '1'}", + HandleRequest("/privet/v3/components", "{}")); + + // State change will also change the components fingerprint. + cloud_.NotifyOnStateChanged(); + + EXPECT_JSON_EQ("{'components': {'test': {}}, 'fingerprint': '2'}", + HandleRequest("/privet/v3/components", "{}")); +} + TEST_F(PrivetHandlerSetupTest, CommandsExecute) { const char kInput[] = "{'name': 'test'}"; base::DictionaryValue command; @@ -698,10 +724,13 @@ .WillOnce(Return(base::TimeDelta::Max())); cloud_.NotifyOnTraitDefsChanged(); cloud_.NotifyOnComponentTreeChanged(); + cloud_.NotifyOnStateChanged(); const char kInput[] = "{}"; const char kExpected[] = R"({ 'commandsFingerprint': '1', - 'stateFingerprint': '1' + 'stateFingerprint': '1', + 'traitsFingerprint': '1', + 'componentsFingerprint': '2' })"; EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/checkForUpdates", kInput)); @@ -713,13 +742,18 @@ .WillOnce(Return(base::TimeDelta::Max())); cloud_.NotifyOnTraitDefsChanged(); cloud_.NotifyOnComponentTreeChanged(); + cloud_.NotifyOnStateChanged(); const char kInput[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; const char kExpected[] = R"({ 'commandsFingerprint': '1', - 'stateFingerprint': '1' + 'stateFingerprint': '1', + 'traitsFingerprint': '1', + 'componentsFingerprint': '2' })"; EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/checkForUpdates", kInput)); @@ -731,7 +765,9 @@ .WillOnce(Return(base::TimeDelta::Max())); const char kInput[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); @@ -739,7 +775,31 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '1', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '1', + 'componentsFingerprint': '0' + })"; + EXPECT_JSON_EQ(kExpected, GetResponse()); +} + +TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollTraits) { + EXPECT_CALL(device_, GetHttpRequestTimeout()) + .WillOnce(Return(base::TimeDelta::Max())); + const char kInput[] = R"({ + 'commandsFingerprint': '0', + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' + })"; + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_EQ(0, GetResponseCount()); + cloud_.NotifyOnTraitDefsChanged(); + EXPECT_EQ(1, GetResponseCount()); + const char kExpected[] = R"({ + 'commandsFingerprint': '1', + 'stateFingerprint': '0', + 'traitsFingerprint': '1', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } @@ -749,7 +809,31 @@ .WillOnce(Return(base::TimeDelta::Max())); const char kInput[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' + })"; + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_EQ(0, GetResponseCount()); + cloud_.NotifyOnStateChanged(); + EXPECT_EQ(1, GetResponseCount()); + const char kExpected[] = R"({ + 'commandsFingerprint': '0', + 'stateFingerprint': '1', + 'traitsFingerprint': '0', + 'componentsFingerprint': '1' + })"; + EXPECT_JSON_EQ(kExpected, GetResponse()); +} + +TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollComponents) { + EXPECT_CALL(device_, GetHttpRequestTimeout()) + .WillOnce(Return(base::TimeDelta::Max())); + const char kInput[] = R"({ + 'commandsFingerprint': '0', + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); @@ -757,16 +841,19 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '1' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '1' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } -TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollIgnoreCommands) { +TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollIgnoreTraits) { EXPECT_CALL(device_, GetHttpRequestTimeout()) .WillOnce(Return(base::TimeDelta::Max())); const char kInput[] = R"({ - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); @@ -776,7 +863,9 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '1', - 'stateFingerprint': '1' + 'stateFingerprint': '0', + 'traitsFingerprint': '1', + 'componentsFingerprint': '1' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } @@ -785,17 +874,22 @@ EXPECT_CALL(device_, GetHttpRequestTimeout()) .WillOnce(Return(base::TimeDelta::Max())); const char kInput[] = R"({ - 'commandsFingerprint': '0' + 'commandsFingerprint': '0', + 'traitsFingerprint': '0' })"; EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); + cloud_.NotifyOnStateChanged(); + EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnComponentTreeChanged(); EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnTraitDefsChanged(); EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '1', - 'stateFingerprint': '1' + 'stateFingerprint': '1', + 'traitsFingerprint': '1', + 'componentsFingerprint': '2' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } @@ -806,11 +900,15 @@ const char kInput[] = R"({ 'commandsFingerprint': '0', 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0', 'waitTimeout': 0 })"; const char kExpected[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/checkForUpdates", kInput)); @@ -822,6 +920,8 @@ const char kInput[] = R"({ 'commandsFingerprint': '0', 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0', 'waitTimeout': 3 })"; base::Closure callback; @@ -833,7 +933,9 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } @@ -843,7 +945,9 @@ .WillOnce(Return(base::TimeDelta::FromMinutes(1))); const char kInput[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; base::Closure callback; EXPECT_CALL(device_, PostDelayedTask(_, _, base::TimeDelta::FromSeconds(50))) @@ -854,7 +958,9 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } @@ -864,7 +970,9 @@ .WillOnce(Return(base::TimeDelta::FromSeconds(5))); const char kInput[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kInput, HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(1, GetResponseCount()); @@ -876,6 +984,8 @@ const char kInput[] = R"({ 'commandsFingerprint': '0', 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0', 'waitTimeout': 10 })"; base::Closure callback; @@ -887,7 +997,9 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '0', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); } @@ -898,6 +1010,8 @@ const char kInput[] = R"({ 'commandsFingerprint': '0', 'stateFingerprint': '0', + 'traitsFingerprint': '0', + 'componentsFingerprint': '0', 'waitTimeout': 10 })"; base::Closure callback; @@ -909,7 +1023,9 @@ EXPECT_EQ(1, GetResponseCount()); const char kExpected[] = R"({ 'commandsFingerprint': '1', - 'stateFingerprint': '0' + 'stateFingerprint': '0', + 'traitsFingerprint': '1', + 'componentsFingerprint': '0' })"; EXPECT_JSON_EQ(kExpected, GetResponse()); callback.Run();