Replace IsEqualJson gtest predicate with EXPECT_JSON_EQ EXPECT_JSON_EQ has better debugging capabilities that the old EXPECT_PRED2(IsEqualJson,... since it shows the correct line numbers and both expected and actual JSON objects. Change-Id: Iaed2a07230f2bade5c8a036fb5a8daff05613896 Reviewed-on: https://weave-review.googlesource.com/1792 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/privet/privet_handler_unittest.cc b/src/privet/privet_handler_unittest.cc index 517dda8..df4555c 100644 --- a/src/privet/privet_handler_unittest.cc +++ b/src/privet/privet_handler_unittest.cc
@@ -15,6 +15,7 @@ #include <base/values.h> #include <gmock/gmock.h> #include <gtest/gtest.h> +#include <weave/test/unittest_utils.h> #include "src/privet/constants.h" #include "src/privet/mock_delegates.h" @@ -48,10 +49,6 @@ dictionary->MergeDictionary(dictionary_ptr); } -bool IsEqualValue(const base::Value& val1, const base::Value& val2) { - return val1.Equals(&val2); -} - struct CodeWithReason { CodeWithReason(int code_in, const std::string& reason_in) : code(code_in), reason(reason_in) {} @@ -72,49 +69,19 @@ reason == expected.reason; } -bool IsEqualDictionary(const base::DictionaryValue& dictionary1, - const base::DictionaryValue& dictionary2) { - base::DictionaryValue::Iterator it1(dictionary1); - base::DictionaryValue::Iterator it2(dictionary2); - for (; !it1.IsAtEnd() && !it2.IsAtEnd(); it1.Advance(), it2.Advance()) { - // Output mismatched keys. - EXPECT_EQ(it1.key(), it2.key()); - if (it1.key() != it2.key()) - return false; - - if (it1.key() == "error") { - std::string code1; - std::string code2; - const char kCodeKey[] = "error.code"; - if (!dictionary1.GetString(kCodeKey, &code1) || - !dictionary2.GetString(kCodeKey, &code2) || code1 != code2) { - return false; - } - continue; - } - - const base::DictionaryValue* d1{nullptr}; - const base::DictionaryValue* d2{nullptr}; - if (it1.value().GetAsDictionary(&d1) && it2.value().GetAsDictionary(&d2)) { - if (!IsEqualDictionary(*d1, *d2)) - return false; - continue; - } - - // Output mismatched values. - EXPECT_PRED2(IsEqualValue, it1.value(), it2.value()); - if (!IsEqualValue(it1.value(), it2.value())) - return false; - } - - return it1.IsAtEnd() && it2.IsAtEnd(); -} - -bool IsEqualJson(const std::string& test_json, - const base::DictionaryValue& dictionary) { - base::DictionaryValue dictionary2; - LoadTestJson(test_json, &dictionary2); - return IsEqualDictionary(dictionary2, dictionary); +// Some error sections in response JSON objects contained debugging information +// which is of no interest for this test. So, remove the debug info from the JSON +// before running validation logic on it. +std::unique_ptr<base::DictionaryValue> StripDebugErrorDetails( + const std::string& path_to_error_object, + const base::DictionaryValue& value) { + std::unique_ptr<base::DictionaryValue> result{value.DeepCopy()}; + base::DictionaryValue* error_dict = nullptr; + EXPECT_TRUE(result->GetDictionary(path_to_error_object, &error_dict)); + scoped_ptr<base::Value> dummy; + error_dict->RemovePath("error.debugInfo", &dummy); + error_dict->RemovePath("error.message", &dummy); + return result; } } // namespace @@ -275,7 +242,7 @@ }, 'uptime': 3600 })"; - EXPECT_PRED2(IsEqualJson, kExpected, HandleRequest("/privet/info", "{}")); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/info", "{}")); } TEST_F(PrivetHandlerTest, Info) { @@ -336,7 +303,7 @@ }, 'uptime': 3600 })"; - EXPECT_PRED2(IsEqualJson, kExpected, HandleRequest("/privet/info", "{}")); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/info", "{}")); } TEST_F(PrivetHandlerTest, PairingStartInvalidParams) { @@ -350,16 +317,14 @@ } TEST_F(PrivetHandlerTest, PairingStart) { - EXPECT_PRED2( - IsEqualJson, + EXPECT_JSON_EQ( "{'deviceCommitment': 'testCommitment', 'sessionId': 'testSession'}", HandleRequest("/privet/v3/pairing/start", "{'pairing': 'embeddedCode', 'crypto': 'p224_spake2'}")); } TEST_F(PrivetHandlerTest, PairingConfirm) { - EXPECT_PRED2( - IsEqualJson, + EXPECT_JSON_EQ( "{'certFingerprint':'testFingerprint','certSignature':'testSignature'}", HandleRequest( "/privet/v3/pairing/confirm", @@ -367,9 +332,9 @@ } TEST_F(PrivetHandlerTest, PairingCancel) { - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/pairing/cancel", - "{'sessionId': 'testSession'}")); + EXPECT_JSON_EQ("{}", + HandleRequest("/privet/v3/pairing/cancel", + "{'sessionId': 'testSession'}")); } TEST_F(PrivetHandlerTest, AuthErrorNoType) { @@ -419,9 +384,9 @@ 'scope': 'user', 'tokenType': 'Privet' })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/auth", - "{'mode':'anonymous','requestedScope':'auto'}")); + EXPECT_JSON_EQ(kExpected, + HandleRequest("/privet/v3/auth", + "{'mode':'anonymous','requestedScope':'auto'}")); } TEST_F(PrivetHandlerTest, AuthPairing) { @@ -440,8 +405,7 @@ 'scope': 'owner', 'tokenType': 'Privet' })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/auth", kInput)); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/auth", kInput)); } class PrivetHandlerSetupTest : public PrivetHandlerTest { @@ -457,8 +421,7 @@ TEST_F(PrivetHandlerSetupTest, StatusEmpty) { SetNoWifiAndGcd(); - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/setup/status", "{}")); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/setup/status", "{}")); } TEST_F(PrivetHandlerSetupTest, StatusWifi) { @@ -470,8 +433,7 @@ 'status': 'success' } })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/setup/status", "{}")); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/setup/status", "{}")); } TEST_F(PrivetHandlerSetupTest, StatusWifiError) { @@ -487,8 +449,10 @@ } } })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/setup/status", "{}")); + EXPECT_JSON_EQ(kExpected, + *StripDebugErrorDetails("wifi", + HandleRequest( + "/privet/v3/setup/status", "{}"))); } TEST_F(PrivetHandlerSetupTest, StatusGcd) { @@ -500,8 +464,7 @@ 'status': 'success' } })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/setup/status", "{}")); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/setup/status", "{}")); } TEST_F(PrivetHandlerSetupTest, StatusGcdError) { @@ -517,8 +480,10 @@ } } })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/setup/status", "{}")); + EXPECT_JSON_EQ(kExpected, + *StripDebugErrorDetails("gcd", + HandleRequest( + "/privet/v3/setup/status", "{}"))); } TEST_F(PrivetHandlerSetupTest, SetupNameDescriptionLocation) { @@ -530,8 +495,7 @@ 'description': 'testDescription', 'location': 'testLocation' })"; - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/setup/start", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/setup/start", kInput)); } TEST_F(PrivetHandlerSetupTest, InvalidParams) { @@ -581,8 +545,7 @@ wifi_.setup_state_ = SetupState{SetupState::kInProgress}; EXPECT_CALL(wifi_, ConfigureCredentials("testSsid", "testPass", _)) .WillOnce(Return(true)); - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/setup/start", kInput)); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/setup/start", kInput)); } TEST_F(PrivetHandlerSetupTest, GcdSetupUnavailable) { @@ -622,28 +585,27 @@ cloud_.setup_state_ = SetupState{SetupState::kInProgress}; EXPECT_CALL(cloud_, Setup("testTicket", "testUser", _)) .WillOnce(Return(true)); - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/setup/start", kInput)); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/setup/start", kInput)); } TEST_F(PrivetHandlerSetupTest, State) { - EXPECT_PRED2(IsEqualJson, "{'state': {'test': {}}, 'fingerprint': '0'}", - HandleRequest("/privet/v3/state", "{}")); + EXPECT_JSON_EQ("{'state': {'test': {}}, 'fingerprint': '0'}", + HandleRequest("/privet/v3/state", "{}")); cloud_.NotifyOnComponentTreeChanged(); - EXPECT_PRED2(IsEqualJson, "{'state': {'test': {}}, 'fingerprint': '1'}", - HandleRequest("/privet/v3/state", "{}")); + EXPECT_JSON_EQ("{'state': {'test': {}}, 'fingerprint': '1'}", + HandleRequest("/privet/v3/state", "{}")); } TEST_F(PrivetHandlerSetupTest, CommandsDefs) { - EXPECT_PRED2(IsEqualJson, "{'commands': {'test':{}}, 'fingerprint': '0'}", - HandleRequest("/privet/v3/commandDefs", "{}")); + EXPECT_JSON_EQ("{'commands': {'test':{}}, 'fingerprint': '0'}", + HandleRequest("/privet/v3/commandDefs", "{}")); cloud_.NotifyOnTraitDefsChanged(); - EXPECT_PRED2(IsEqualJson, "{'commands': {'test':{}}, 'fingerprint': '1'}", - HandleRequest("/privet/v3/commandDefs", "{}")); + EXPECT_JSON_EQ("{'commands': {'test':{}}, 'fingerprint': '1'}", + HandleRequest("/privet/v3/commandDefs", "{}")); } TEST_F(PrivetHandlerSetupTest, CommandsExecute) { @@ -657,8 +619,8 @@ callback.Run(command, nullptr); }))); - EXPECT_PRED2(IsEqualJson, "{'name':'test', 'id':'5'}", - HandleRequest("/privet/v3/commands/execute", kInput)); + EXPECT_JSON_EQ("{'name':'test', 'id':'5'}", + HandleRequest("/privet/v3/commands/execute", kInput)); } TEST_F(PrivetHandlerSetupTest, CommandsStatus) { @@ -672,8 +634,8 @@ callback.Run(command, nullptr); }))); - EXPECT_PRED2(IsEqualJson, "{'name':'test', 'id':'5'}", - HandleRequest("/privet/v3/commands/status", kInput)); + EXPECT_JSON_EQ("{'name':'test', 'id':'5'}", + HandleRequest("/privet/v3/commands/status", kInput)); ErrorPtr error; Error::AddTo(&error, FROM_HERE, errors::kDomain, "notFound", ""); @@ -697,8 +659,8 @@ callback.Run(command, nullptr); }))); - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/commands/cancel", "{'id': '8'}")); + EXPECT_JSON_EQ(kExpected, + HandleRequest("/privet/v3/commands/cancel", "{'id': '8'}")); ErrorPtr error; Error::AddTo(&error, FROM_HERE, errors::kDomain, "notFound", ""); @@ -728,8 +690,7 @@ callback.Run(commands, nullptr); }))); - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/commands/list", "{}")); + EXPECT_JSON_EQ(kExpected, HandleRequest("/privet/v3/commands/list", "{}")); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_NoInput) { @@ -742,8 +703,8 @@ 'commandsFingerprint': '1', 'stateFingerprint': '1' })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ(kExpected, + HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(1, GetResponseCount()); } @@ -760,8 +721,8 @@ 'commandsFingerprint': '1', 'stateFingerprint': '1' })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ(kExpected, + HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(1, GetResponseCount()); } @@ -772,8 +733,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnTraitDefsChanged(); EXPECT_EQ(1, GetResponseCount()); @@ -781,7 +741,7 @@ 'commandsFingerprint': '1', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollState) { @@ -791,8 +751,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnComponentTreeChanged(); EXPECT_EQ(1, GetResponseCount()); @@ -800,7 +759,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '1' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollIgnoreCommands) { @@ -809,8 +768,7 @@ const char kInput[] = R"({ 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnTraitDefsChanged(); EXPECT_EQ(0, GetResponseCount()); @@ -820,7 +778,7 @@ 'commandsFingerprint': '1', 'stateFingerprint': '1' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_LongPollIgnoreState) { @@ -829,8 +787,7 @@ const char kInput[] = R"({ 'commandsFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnComponentTreeChanged(); EXPECT_EQ(0, GetResponseCount()); @@ -840,7 +797,7 @@ 'commandsFingerprint': '1', 'stateFingerprint': '1' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_InstantTimeout) { @@ -855,8 +812,8 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kExpected, - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ(kExpected, + HandleRequest("/privet/v3/checkForUpdates", kInput)); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_UserTimeout) { @@ -870,8 +827,7 @@ base::Closure callback; EXPECT_CALL(device_, PostDelayedTask(_, _, base::TimeDelta::FromSeconds(3))) .WillOnce(SaveArg<1>(&callback)); - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); callback.Run(); EXPECT_EQ(1, GetResponseCount()); @@ -879,7 +835,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_ServerTimeout) { @@ -892,8 +848,7 @@ base::Closure callback; EXPECT_CALL(device_, PostDelayedTask(_, _, base::TimeDelta::FromSeconds(50))) .WillOnce(SaveArg<1>(&callback)); - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); callback.Run(); EXPECT_EQ(1, GetResponseCount()); @@ -901,7 +856,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_VeryShortServerTimeout) { @@ -911,8 +866,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kInput, - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ(kInput, HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(1, GetResponseCount()); } @@ -927,8 +881,7 @@ base::Closure callback; EXPECT_CALL(device_, PostDelayedTask(_, _, base::TimeDelta::FromSeconds(10))) .WillOnce(SaveArg<1>(&callback)); - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); callback.Run(); EXPECT_EQ(1, GetResponseCount()); @@ -936,7 +889,7 @@ 'commandsFingerprint': '0', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); } TEST_F(PrivetHandlerSetupTest, CheckForUpdates_ChangeBeforeTimeout) { @@ -950,8 +903,7 @@ base::Closure callback; EXPECT_CALL(device_, PostDelayedTask(_, _, base::TimeDelta::FromSeconds(10))) .WillOnce(SaveArg<1>(&callback)); - EXPECT_PRED2(IsEqualJson, "{}", - HandleRequest("/privet/v3/checkForUpdates", kInput)); + EXPECT_JSON_EQ("{}", HandleRequest("/privet/v3/checkForUpdates", kInput)); EXPECT_EQ(0, GetResponseCount()); cloud_.NotifyOnTraitDefsChanged(); EXPECT_EQ(1, GetResponseCount()); @@ -959,11 +911,10 @@ 'commandsFingerprint': '1', 'stateFingerprint': '0' })"; - EXPECT_PRED2(IsEqualJson, kExpected, GetResponse()); + EXPECT_JSON_EQ(kExpected, GetResponse()); callback.Run(); EXPECT_EQ(1, GetResponseCount()); } - } // namespace privet } // namespace weave