1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef SYNC_TEST_ENGINE_MOCK_MODEL_TYPE_SYNC_PROXY_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define SYNC_TEST_ENGINE_MOCK_MODEL_TYPE_SYNC_PROXY_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/macros.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/engine/model_type_sync_proxy.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/non_blocking_sync_common.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace syncer {
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Mocks the ModelTypeSyncProxy.
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This mock is made simpler by not using any threads.  It does still have the
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ability to defer execution if we need to test race conditions, though.
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// It maintains some state to try to make its behavior more realistic.  It
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// updates this state as it creates commit requests or receives update and
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// commit responses.
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// It keeps a log of all received messages so tests can make assertions based
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// on their value.
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MockModelTypeSyncProxy : public ModelTypeSyncProxy {
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockModelTypeSyncProxy();
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~MockModelTypeSyncProxy();
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Implementation of ModelTypeSyncProxy.
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnCommitCompleted(
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const DataTypeState& type_state,
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const CommitResponseDataList& response_list) OVERRIDE;
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnUpdateReceived(
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const DataTypeState& type_state,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const UpdateResponseDataList& response_list,
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const UpdateResponseDataList& pending_updates) OVERRIDE;
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // By default, this object behaves as if all messages are processed
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // immediately.  Sometimes it is useful to defer work until later, as might
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // happen in the real world if the model thread's task queue gets backed up.
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetSynchronousExecution(bool is_synchronous);
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Runs any work that was deferred while this class was in asynchronous mode.
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This function is not useful unless this object is set to synchronous
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // execution mode, which is the default.
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RunQueuedTasks();
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Generate commit or deletion requests to be sent to the server.
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // These functions update local state to keep sequence numbers consistent.
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // A real ModelTypeSyncProxy would forward these kinds of messages
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // directly to its attached ModelTypeSyncWorker.  These methods
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // return the value to the caller so the test framework can handle them as it
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // sees fit.
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommitRequestData CommitRequest(const std::string& tag_hash,
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  const sync_pb::EntitySpecifics& specifics);
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommitRequestData DeleteRequest(const std::string& tag_hash);
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getters to access the log of received update responses.
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Does not includes repsonses that are in pending tasks.
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  size_t GetNumUpdateResponses() const;
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateResponseDataList GetNthUpdateResponse(size_t n) const;
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UpdateResponseDataList GetNthPendingUpdates(size_t n) const;
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DataTypeState GetNthTypeStateReceivedInUpdateResponse(size_t n) const;
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getters to access the log of received commit responses.
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Does not includes repsonses that are in pending tasks.
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  size_t GetNumCommitResponses() const;
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommitResponseDataList GetNthCommitResponse(size_t n) const;
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DataTypeState GetNthTypeStateReceivedInCommitResponse(size_t n) const;
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getters to access the lastest update response for a given tag_hash.
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool HasUpdateResponse(const std::string& tag_hash) const;
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateResponseData GetUpdateResponse(const std::string& tag_hash) const;
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getters to access the lastest commit response for a given tag_hash.
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool HasCommitResponse(const std::string& tag_hash) const;
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CommitResponseData GetCommitResponse(const std::string& tag_hash) const;
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Process a received commit response.
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Implemented as an Impl method so we can defer its execution in some cases.
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnCommitCompletedImpl(const DataTypeState& type_state,
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             const CommitResponseDataList& response_list);
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Process a received update response.
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Implemented as an Impl method so we can defer its execution in some cases.
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnUpdateReceivedImpl(const DataTypeState& type_state,
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            const UpdateResponseDataList& response_list,
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            const UpdateResponseDataList& pending_updates);
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getter and setter for per-item sequence number tracking.
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int64 GetCurrentSequenceNumber(const std::string& tag_hash) const;
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int64 GetNextSequenceNumber(const std::string& tag_hash);
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getter and setter for per-item base version tracking.
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int64 GetBaseVersion(const std::string& tag_hash) const;
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetBaseVersion(const std::string& tag_hash, int64 version);
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Getters and setter for server-assigned ID values.
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool HasServerAssignedId(const std::string& tag_hash) const;
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const std::string& GetServerAssignedId(const std::string& tag_hash) const;
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetServerAssignedId(const std::string& tag_hash, const std::string& id);
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // State related to the implementation of deferred work.
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // See SetSynchronousExecution() for details.
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool is_synchronous_;
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<base::Closure> pending_tasks_;
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // A log of messages received by this object.
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<CommitResponseDataList> received_commit_responses_;
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<UpdateResponseDataList> received_update_responses_;
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<UpdateResponseDataList> received_pending_updates_;
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<DataTypeState> type_states_received_on_update_;
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<DataTypeState> type_states_received_on_commit_;
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Latest responses received, indexed by tag_hash.
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::map<const std::string, CommitResponseData> commit_response_items_;
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::map<const std::string, UpdateResponseData> update_response_items_;
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The per-item state maps.
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::map<const std::string, int64> sequence_numbers_;
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::map<const std::string, int64> base_versions_;
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::map<const std::string, std::string> assigned_ids_;
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(MockModelTypeSyncProxy);
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace syncer
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // SYNC_TEST_ENGINE_MOCK_MODEL_TYPE_SYNC_PROXY_H_
141