1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/test/fake_server/fake_server_entity.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <limits>
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string>
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector>
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/basictypes.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/guid.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string_util.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/stringprintf.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/net_errors.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/http/http_status_code.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using std::string;
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using std::vector;
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using syncer::ModelType;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The separator used when formatting IDs.
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// We chose the underscore character because it doesn't conflict with the
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// special characters used by base/base64.h's encoding, which is also used in
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the construction of some IDs.
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kIdSeparator[] = "_";
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace fake_server {
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)FakeServerEntity::~FakeServerEntity() { }
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const std::string& FakeServerEntity::GetId() const {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return id_;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ModelType FakeServerEntity::GetModelType() const {
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return model_type_;
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int64 FakeServerEntity::GetVersion() const {
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return version_;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeServerEntity::SetVersion(int64 version) {
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  version_ = version;
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const std::string& FakeServerEntity::GetName() const {
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return name_;
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)string FakeServerEntity::CreateId(const ModelType& model_type,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  const string& inner_id) {
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int field_number = GetSpecificsFieldNumberFromModelType(model_type);
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return base::StringPrintf("%d%s%s",
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            field_number,
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            kIdSeparator,
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            inner_id.c_str());
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string FakeServerEntity::GetTopLevelId(const ModelType& model_type) {
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return FakeServerEntity::CreateId(
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      model_type,
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      syncer::ModelTypeToRootTag(model_type));
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ModelType FakeServerEntity::GetModelTypeFromId(const string& id) {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  vector<string> tokens;
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t token_count = Tokenize(id, kIdSeparator, &tokens);
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int field_number;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (token_count != 2 || !base::StringToInt(tokens[0], &field_number)) {
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return syncer::UNSPECIFIED;
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return syncer::GetModelTypeFromSpecificsFieldNumber(field_number);
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)FakeServerEntity::FakeServerEntity(const string& id,
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   const ModelType& model_type,
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   int64 version,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   const string& name)
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : model_type_(model_type),
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        id_(id),
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        version_(version),
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        name_(name) {}
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeServerEntity::SerializeBaseProtoFields(
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sync_pb::SyncEntity* sync_entity) {
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // FakeServerEntity fields
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  sync_entity->set_id_string(id_);
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  sync_entity->set_version(version_);
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  sync_entity->set_name(name_);
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Data via accessors
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  sync_entity->set_deleted(IsDeleted());
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  sync_entity->set_folder(IsFolder());
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace fake_server
112