Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(594)

Unified Diff: components/safe_browsing_db/v4_update_protocol_manager_unittest.cc

Issue 1727033003: v4_update_protocol_manager: Basic implementation with TODOs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix comment. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/safe_browsing_db/v4_update_protocol_manager_unittest.cc
diff --git a/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc b/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ba691c667444c6af71d357cad3bd65734b4f163f
--- /dev/null
+++ b/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc
@@ -0,0 +1,212 @@
+// Copyright 2016 The Chromium 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 <vector>
+
+#include "base/base64.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "components/safe_browsing_db/safebrowsing.pb.h"
+#include "components/safe_browsing_db/util.h"
+#include "components/safe_browsing_db/v4_update_protocol_manager.h"
+#include "net/base/escape.h"
+#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::Time;
+using base::TimeDelta;
+
+namespace {
+
+const char kClient[] = "unittest";
+const char kAppVer[] = "1.0";
+const char kKeyParam[] = "test_key_param";
+
+} // namespace
+
+namespace safe_browsing {
+
+typedef V4UpdateProtocolManager::ListUpdateRequest ListUpdateRequest;
+typedef V4UpdateProtocolManager::ListUpdateResponse ListUpdateResponse;
+
+class SafeBrowsingV4UpdateProtocolManagerTest : public testing::Test {
+ protected:
+ scoped_ptr<V4UpdateProtocolManager> CreateProtocolManager() {
+ V4ProtocolConfig config;
+ config.client_name = kClient;
+ config.version = kAppVer;
+ config.key_param = kKeyParam;
+ return scoped_ptr<V4UpdateProtocolManager>(
+ V4UpdateProtocolManager::Create(NULL, config));
+ }
+
+ void SetupListsToUpdate(
+ base::hash_set<const UpdateListIdentifier*>* lists_to_update) {
+ UpdateListIdentifier* list_identifier = new UpdateListIdentifier();
+ list_identifier->platform_type = WINDOWS_PLATFORM;
+ list_identifier->threat_entry_type = URL_EXPRESSION;
+ list_identifier->threat_type = MALWARE_THREAT;
+ lists_to_update->insert(list_identifier);
+
+ list_identifier = new UpdateListIdentifier();
+ list_identifier->platform_type = WINDOWS_PLATFORM;
+ list_identifier->threat_entry_type = URL_EXPRESSION;
+ list_identifier->threat_type = UNWANTED_SOFTWARE;
+ lists_to_update->insert(list_identifier);
+
+ list_identifier = new UpdateListIdentifier();
+ list_identifier->platform_type = WINDOWS_PLATFORM;
+ list_identifier->threat_entry_type = BINARY_DIGEST;
+ list_identifier->threat_type = MALWARE_THREAT;
+ lists_to_update->insert(list_identifier);
+ }
+
+ void ClearListsToUpdate(
+ base::hash_set<const UpdateListIdentifier*>* lists_to_update) {
+ for (const UpdateListIdentifier* id : *lists_to_update) {
+ delete id;
+ }
+ lists_to_update->clear();
+ }
+
+ void SetupCurrentListStates(
+ const base::hash_set<const UpdateListIdentifier*>& lists_to_update,
+ base::hash_map<const UpdateListIdentifier*, const std::string&>*
+ current_list_states) {
+ // TODO(vakh): Implement this to test the cases when we have an existing
+ // state for some of the lists.
+ }
+
+ std::string GetStockV4UpdateResponse() {
+ FetchThreatListUpdatesResponse response;
+
+ ListUpdateResponse* lur = response.add_list_update_responses();
+ lur->set_platform_type(WINDOWS_PLATFORM);
+ lur->set_response_type(ListUpdateResponse::PARTIAL_UPDATE);
+ lur->set_threat_entry_type(URL_EXPRESSION);
+ lur->set_threat_type(MALWARE_THREAT);
+
+ lur = response.add_list_update_responses();
+ lur->set_platform_type(WINDOWS_PLATFORM);
+ lur->set_response_type(ListUpdateResponse::PARTIAL_UPDATE);
+ lur->set_threat_entry_type(URL_EXPRESSION);
+ lur->set_threat_type(UNWANTED_SOFTWARE);
+
+ lur = response.add_list_update_responses();
+ lur->set_platform_type(WINDOWS_PLATFORM);
+ lur->set_response_type(ListUpdateResponse::FULL_UPDATE);
+ lur->set_threat_entry_type(BINARY_DIGEST);
+ lur->set_threat_type(MALWARE_THREAT);
+
+ // Serialize.
+ std::string res_data;
+ response.SerializeToString(&res_data);
+
+ return res_data;
+ }
+};
+
+void ValidateGetUpdatesResults(
+ const std::vector<ListUpdateResponse>& expected_lurs,
+ const std::vector<ListUpdateResponse>& list_update_responses) {
+ ASSERT_EQ(expected_lurs.size(), list_update_responses.size());
+
+ for (unsigned int i = 0; i < list_update_responses.size(); ++i) {
+ const ListUpdateResponse& expected = expected_lurs[i];
+ const ListUpdateResponse& actual = list_update_responses[i];
+
+ EXPECT_EQ(expected.platform_type(), actual.platform_type());
+ EXPECT_EQ(expected.response_type(), actual.response_type());
+ EXPECT_EQ(expected.threat_entry_type(), actual.threat_entry_type());
+ EXPECT_EQ(expected.threat_type(), actual.threat_type());
+
+ // TODO(vakh): Test more fields from the proto.
+ }
+}
+
+// TODO(vakh): Add many more tests.
+
+TEST_F(SafeBrowsingV4UpdateProtocolManagerTest,
+ TestGetUpdatesErrorHandlingNetwork) {
+ net::TestURLFetcherFactory factory;
+ scoped_ptr<V4UpdateProtocolManager> pm(CreateProtocolManager());
+
+ const std::vector<ListUpdateResponse> expected_lurs;
+ const base::hash_set<const UpdateListIdentifier*> lists_to_update;
+ const base::hash_map<const UpdateListIdentifier*, const std::string&>
+ current_list_states;
+ pm->GetUpdates(lists_to_update, current_list_states,
+ base::Bind(&ValidateGetUpdatesResults, expected_lurs));
+
+ net::TestURLFetcher* fetcher = factory.GetFetcherByID(0);
+ DCHECK(fetcher);
+ // Failed request status should result in error.
+ fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+ net::ERR_CONNECTION_RESET));
+ fetcher->set_response_code(200);
Nathan Parker 2016/03/22 23:57:55 Does it need a response code and string if it has
vakh (use Gerrit instead) 2016/03/24 22:34:24 Done.
+ fetcher->SetResponseString(GetStockV4UpdateResponse());
+ fetcher->delegate()->OnURLFetchComplete(fetcher);
+
+ // Should have recorded one error, but back off multiplier is unchanged.
+ EXPECT_EQ(1ul, pm->update_error_count_);
+ EXPECT_EQ(1ul, pm->update_back_off_mult_);
+}
+
+TEST_F(SafeBrowsingV4UpdateProtocolManagerTest,
+ TestGetUpdatesErrorHandlingResponseCode) {
+ net::TestURLFetcherFactory factory;
+ scoped_ptr<V4UpdateProtocolManager> pm(CreateProtocolManager());
+
+ const std::vector<ListUpdateResponse> expected_lurs;
+ const base::hash_set<const UpdateListIdentifier*> lists_to_update;
+ const base::hash_map<const UpdateListIdentifier*, const std::string&>
+ current_list_states;
+ pm->GetUpdates(lists_to_update, current_list_states,
+ base::Bind(&ValidateGetUpdatesResults, expected_lurs));
+
+
+ net::TestURLFetcher* fetcher = factory.GetFetcherByID(0);
+ DCHECK(fetcher);
+ fetcher->set_status(net::URLRequestStatus());
+ // Response code of anything other than 200 should result in error.
+ fetcher->set_response_code(204);
+ fetcher->SetResponseString(GetStockV4UpdateResponse());
+ fetcher->delegate()->OnURLFetchComplete(fetcher);
+
+ // Should have recorded one error, but back off multiplier is unchanged.
+ EXPECT_EQ(1ul, pm->update_error_count_);
+ EXPECT_EQ(1ul, pm->update_back_off_mult_);
+}
+
+TEST_F(SafeBrowsingV4UpdateProtocolManagerTest, TestGetUpdatesNoError) {
+ net::TestURLFetcherFactory factory;
+ scoped_ptr<V4UpdateProtocolManager> pm(CreateProtocolManager());
+
+
+ const std::vector<ListUpdateResponse> expected_lurs;
+ base::hash_set<const UpdateListIdentifier*> lists_to_update;
+ SetupListsToUpdate(&lists_to_update);
+ base::hash_map<const UpdateListIdentifier*, const std::string&>
+ current_list_states;
+ SetupCurrentListStates(lists_to_update, &current_list_states);
+ pm->GetUpdates(lists_to_update, current_list_states,
+ base::Bind(&ValidateGetUpdatesResults, expected_lurs));
+ ClearListsToUpdate(&lists_to_update);
+
+ net::TestURLFetcher* fetcher = factory.GetFetcherByID(0);
+ DCHECK(fetcher);
+ fetcher->set_status(net::URLRequestStatus());
+ fetcher->set_response_code(200);
+ fetcher->SetResponseString(GetStockV4UpdateResponse());
+ fetcher->delegate()->OnURLFetchComplete(fetcher);
+
+ // No error, back off multiplier is unchanged.
+ EXPECT_EQ(0ul, pm->update_error_count_);
+ EXPECT_EQ(1ul, pm->update_back_off_mult_);
+}
+
+} // namespace safe_browsing

Powered by Google App Engine
This is Rietveld 408576698