// Copyright 2013 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 COMPONENTS_SYNC_SESSIONS_SESSION_SYNC_TEST_HELPER_H_
#define COMPONENTS_SYNC_SESSIONS_SESSION_SYNC_TEST_HELPER_H_

#include <string>
#include <vector>

#include "base/macros.h"
#include "components/sessions/core/session_id.h"

namespace sync_pb {
class SessionSpecifics;
}

namespace sync_sessions {

struct SyncedSession;

class SessionSyncTestHelper {
 public:
  SessionSyncTestHelper() : max_tab_node_id_(0) {}

  static void BuildSessionSpecifics(const std::string& tag,
                                    sync_pb::SessionSpecifics* meta);

  static void AddWindowSpecifics(SessionID window_id,
                                 const std::vector<SessionID>& tab_list,
                                 sync_pb::SessionSpecifics* meta);

  static void VerifySyncedSession(
      const std::string& tag,
      const std::vector<std::vector<SessionID>>& windows,
      const SyncedSession& session);

  // Build a SessionSpecifics object with a tab and sample data. Uses a
  // monotonically increasing variable to generate tab_node_ids and avoid
  // conflicts.
  sync_pb::SessionSpecifics BuildTabSpecifics(const std::string& tag,
                                              SessionID window_id,
                                              SessionID tab_id);

  // Overload of BuildTabSpecifics to allow forcing a specific tab_node_id.
  // Typically only useful to test reusing tab_node_ids.
  sync_pb::SessionSpecifics BuildTabSpecifics(const std::string& tag,
                                              SessionID window_id,
                                              SessionID tab_id,
                                              int tab_node_id);

  sync_pb::SessionSpecifics BuildForeignSession(
      const std::string& tag,
      const std::vector<SessionID>& tab_list,
      std::vector<sync_pb::SessionSpecifics>* tabs);

  void Reset();

 private:
  int max_tab_node_id_;

  DISALLOW_COPY_AND_ASSIGN(SessionSyncTestHelper);
};

}  // namespace sync_sessions

#endif  // COMPONENTS_SYNC_SESSIONS_SESSION_SYNC_TEST_HELPER_H_
