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

Unified Diff: sync/test/engine/mock_non_blocking_type_processor.h

Issue 330523002: sync: Refactor NonBlockingTypeProcessorCore tests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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: sync/test/engine/mock_non_blocking_type_processor.h
diff --git a/sync/test/engine/mock_non_blocking_type_processor.h b/sync/test/engine/mock_non_blocking_type_processor.h
new file mode 100644
index 0000000000000000000000000000000000000000..b4284db6c6f0ee7fd1293ea0c5360a153dd70e49
--- /dev/null
+++ b/sync/test/engine/mock_non_blocking_type_processor.h
@@ -0,0 +1,134 @@
+// Copyright 2014 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.
+
+#ifndef SYNC_TEST_ENGINE_MOCK_NON_BLOCKING_TYPE_PROCESSOR_H_
+#define SYNC_TEST_ENGINE_MOCK_NON_BLOCKING_TYPE_PROCESSOR_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "sync/engine/non_blocking_sync_common.h"
+#include "sync/engine/non_blocking_type_processor_interface.h"
+
+namespace syncer {
+
+// Mocks the NonBlockingTypeProcessor.
+//
+// This mock is made simpler by not using any threads. It does still have the
+// ability to defer execution if we need to test race conditions, though.
+//
+// It maintains some state to try to make its behavior more realistic. It
+// updates this state as it creates commit requests or receives update and
+// commit responses.
+//
+// It keeps a log of all received messages so tests can make assertions on
+// based on their value.
Nicolas Zea 2014/06/13 21:59:42 nit: "on based on" -> "based on"
rlarocque 2014/06/14 00:55:19 Done.
+class MockNonBlockingTypeProcessor : public NonBlockingTypeProcessorInterface {
+ public:
+ MockNonBlockingTypeProcessor();
+ virtual ~MockNonBlockingTypeProcessor();
+
+ // Implementation of NonBlockingTypeProcessorInterface.
+ virtual void ReceiveCommitResponse(
+ const DataTypeState& type_state,
+ const CommitResponseDataList& response_list) OVERRIDE;
+ virtual void ReceiveUpdateResponse(
+ const DataTypeState& type_state,
+ const UpdateResponseDataList& response_list) OVERRIDE;
+
+ // By default, this object behaves as if all messages are processed
+ // immediately. Sometimes it is useful to defer work until later, as might
+ // happen in the real world if the model thread's task queue gets backed up.
+ //
+ // These functions give us explicit control over deferred execution, allowing
+ // us to test unlikely race conditions.
+ void SetSynchronousExecution(bool is_synchronous);
+ void RunQueuedTasks();
Nicolas Zea 2014/06/13 21:59:42 Should this only be used if synchronous execution
rlarocque 2014/06/14 00:55:19 Done.
+
+ // Generate commit or deletion requests to be sent to the server.
+ // These functions update local state to keep sequence numbers consistent.
+ //
+ // A real NonBlockingTypeProcessor would forward these kinds of messages
+ // directly to its attached NonBlockingTypeProcessorCore. These methods
+ // return the value to the caller so the test framework can handle them as it
+ // sees fit.
+ CommitRequestData CommitRequest(const std::string& tag_hash,
+ const sync_pb::EntitySpecifics& specifics);
+ CommitRequestData DeleteRequest(const std::string& tag_hash);
+
+ // Getters to access the log of received update responses.
+ //
+ // Does not includes repsonses that are in pending tasks.
+ size_t GetNumUpdateResponses() const;
+ UpdateResponseDataList GetNthUpdateResponse(size_t n) const;
+ DataTypeState GetNthTypeStateReceivedInUpdateResponse(size_t n) const;
+
+ // Getters to access the log of received commit responses.
+ //
+ // Does not includes repsonses that are in pending tasks.
+ size_t GetNumCommitResponses() const;
+ CommitResponseDataList GetNthCommitResponse(size_t n) const;
+ DataTypeState GetNthTypeStateReceivedInCommitResponse(size_t n) const;
+
+ // Getters to access the lastest update response for a given tag_hash.
+ bool HasUpdateResponse(const std::string& tag_hash) const;
+ UpdateResponseData GetUpdateResponse(const std::string& tag_hash) const;
+
+ // Getters to access the lastest commit response for a given tag_hash.
+ bool HasCommitResponse(const std::string& tag_hash) const;
+ CommitResponseData GetCommitResponse(const std::string& tag_hash) const;
+
+ private:
+ // Process a received commit response.
+ //
+ // Implemented as an Impl method so we can defer its execution in some cases.
+ void ReceiveCommitResponseImpl(const DataTypeState& type_state,
+ const CommitResponseDataList& response_list);
+
+ // Process a received update response.
+ //
+ // Implemented as an Impl method so we can defer its execution in some cases.
+ void ReceiveUpdateResponseImpl(const DataTypeState& type_state,
+ const UpdateResponseDataList& response_list);
+
+ // Getter and setter for per-item sequence number tracking.
+ int64 GetCurrentSequenceNumber(const std::string& tag_hash) const;
+ int64 GetNextSequenceNumber(const std::string& tag_hash);
+
+ // Getter and setter for per-item base version tracking.
+ int64 GetBaseVersion(const std::string& tag_hash) const;
+ void SetBaseVersion(const std::string& tag_hash, int64 version);
+
+ // Getters and setter for server-assigned ID values.
+ bool HasServerAssignedId(const std::string& tag_hash) const;
+ const std::string& GetServerAssignedId(const std::string& tag_hash) const;
+ void SetServerAssignedId(const std::string& tag_hash, const std::string& id);
+
+ // State related to the implementation of deferred work.
+ // See SetSynchronousExecution() for details.
+ bool is_synchronous_;
+ std::vector<base::Closure> pending_tasks_;
+
+ // A log of messages received by this object.
+ std::vector<CommitResponseDataList> received_commit_responses_;
+ std::vector<UpdateResponseDataList> received_update_responses_;
+ std::vector<DataTypeState> type_states_received_on_update_;
+ std::vector<DataTypeState> type_states_received_on_commit_;
+
+ // Latest responses received, indexed by tag_hash.
+ std::map<const std::string, CommitResponseData> commit_response_items_;
+ std::map<const std::string, UpdateResponseData> update_response_items_;
+
+ // The per-item state maps.
+ std::map<const std::string, int64> sequence_numbers_;
+ std::map<const std::string, int64> base_versions_;
+ std::map<const std::string, std::string> assigned_ids_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockNonBlockingTypeProcessor);
+};
+
+} // namespace syncer
+
+#endif // SYNC_TEST_ENGINE_MOCK_NON_BLOCKING_TYPE_PROCESSOR_H_

Powered by Google App Engine
This is Rietveld 408576698