12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/test/test_entry_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/directory.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/entry.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/mutable_entry.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/syncable_id.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_read_transaction.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_write_transaction.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/test_id_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::Id;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::MutableEntry;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::UNITTEST;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::WriteTransaction;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestEntryFactory::TestEntryFactory(syncable::Directory *dir)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : directory_(dir), next_revision_(1) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestEntryFactory::~TestEntryFactory() { }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 TestEntryFactory::CreateUnappliedNewItemWithParent(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& item_id,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::EntitySpecifics& specifics,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& parent_id) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MutableEntry entry(&trans, syncable::CREATE_NEW_UPDATE_ITEM,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Id::CreateFromServerId(item_id));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(entry.good());
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerVersion(GetNextRevision());
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(true);
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerNonUniqueName(item_id);
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerParentId(Id::CreateFromServerId(parent_id));
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerIsDir(true);
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerSpecifics(specifics);
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetMetahandle();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 TestEntryFactory::CreateUnappliedNewBookmarkItemWithParent(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string& item_id,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const sync_pb::EntitySpecifics& specifics,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string& parent_id) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MutableEntry entry(&trans, syncable::CREATE_NEW_UPDATE_ITEM,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Id::CreateFromServerId(item_id));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(entry.good());
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerVersion(GetNextRevision());
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(true);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerNonUniqueName(item_id);
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerParentId(Id::CreateFromServerId(parent_id));
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerIsDir(true);
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerSpecifics(specifics);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetMetahandle();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 TestEntryFactory::CreateUnappliedNewItem(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& item_id,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::EntitySpecifics& specifics,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_unique) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MutableEntry entry(&trans, syncable::CREATE_NEW_UPDATE_ITEM,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Id::CreateFromServerId(item_id));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(entry.good());
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerVersion(GetNextRevision());
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(true);
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerNonUniqueName(item_id);
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerParentId(syncable::GetNullId());
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerIsDir(is_unique);
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerSpecifics(specifics);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_unique) { // For top-level nodes.
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    entry.PutUniqueServerTag(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ModelTypeToRootTag(GetModelTypeFromSpecifics(specifics)));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetMetahandle();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestEntryFactory::CreateUnsyncedItem(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Id& item_id,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Id& parent_id,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& name,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_folder,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModelType model_type,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* metahandle_out) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_folder) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(model_type, BOOKMARKS);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MutableEntry entry(&trans, syncable::CREATE, model_type, parent_id, name);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(entry.good());
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutId(item_id);
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutBaseVersion(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item_id.ServerKnows() ? GetNextRevision() : 0);
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnsynced(true);
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsDir(is_folder);
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsDel(false);
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutParentId(parent_id);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics default_specifics;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDefaultFieldValue(model_type, &default_specifics);
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutSpecifics(default_specifics);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (item_id.ServerKnows()) {
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    entry.PutServerSpecifics(default_specifics);
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    entry.PutServerIsDir(false);
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    entry.PutServerParentId(parent_id);
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    entry.PutServerIsDel(false);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (metahandle_out)
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    *metahandle_out = entry.GetMetahandle();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 TestEntryFactory::CreateUnappliedAndUnsyncedBookmarkItem(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string& name) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 metahandle = 0;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateUnsyncedItem(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestIdFactory::MakeServer(name), TestIdFactory::root(),
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      name, false, BOOKMARKS, &metahandle);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MutableEntry entry(&trans, syncable::GET_BY_HANDLE, metahandle);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.good()) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return syncable::kInvalidMetaHandle;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(true);
140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerVersion(GetNextRevision());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return metahandle;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 TestEntryFactory::CreateSyncedItem(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& name, ModelType model_type, bool is_folder) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Id parent_id(TestIdFactory::root());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Id item_id(TestIdFactory::MakeServer(name));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 version = GetNextRevision();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MutableEntry entry(&trans, syncable::CREATE, model_type, parent_id, name);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.good()) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return syncable::kInvalidMetaHandle;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutId(item_id);
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutBaseVersion(version);
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnsynced(false);
162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutNonUniqueName(name);
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsDir(is_folder);
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsDel(false);
165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutParentId(parent_id);
166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerVersion(GetNextRevision());
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(false);
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerNonUniqueName(name);
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerParentId(parent_id);
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerIsDir(is_folder);
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerIsDel(false);
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerSpecifics(entry.GetSpecifics());
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetMetahandle();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 TestEntryFactory::CreateUnappliedRootNode(
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ModelType model_type) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncable::WriteTransaction trans(FROM_HERE, syncable::UNITTEST, directory_);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_pb::EntitySpecifics specifics;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddDefaultFieldValue(model_type, &specifics);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncable::Id node_id = TestIdFactory::MakeServer("xyz");
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncable::MutableEntry entry(&trans, syncable::CREATE_NEW_UPDATE_ITEM,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               node_id);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(entry.good());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make it look like sort of like a pending creation from the server.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The SERVER_PARENT_ID and UNIQUE_CLIENT_TAG aren't quite right, but
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it's good enough for our purposes.
190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerVersion(1);
191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(true);
192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerIsDir(false);
193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerParentId(TestIdFactory::root());
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerSpecifics(specifics);
195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutNonUniqueName("xyz");
196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetMetahandle();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestEntryFactory::SetServerSpecificsForItem(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 meta_handle,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::EntitySpecifics specifics) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MutableEntry entry(&trans, syncable::GET_BY_HANDLE, meta_handle);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.good()) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutServerSpecifics(specifics);
209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnappliedUpdate(true);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestEntryFactory::SetLocalSpecificsForItem(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 meta_handle,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::EntitySpecifics specifics) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransaction trans(FROM_HERE, UNITTEST, directory_);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MutableEntry entry(&trans, syncable::GET_BY_HANDLE, meta_handle);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.good()) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutSpecifics(specifics);
222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry.PutIsUnsynced(true);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const sync_pb::EntitySpecifics& TestEntryFactory::GetServerSpecificsForItem(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 meta_handle) const {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::ReadTransaction trans(FROM_HERE, directory_);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Entry entry(&trans, syncable::GET_BY_HANDLE, meta_handle);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(entry.good());
231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetServerSpecifics();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const sync_pb::EntitySpecifics& TestEntryFactory::GetLocalSpecificsForItem(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 meta_handle) const {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::ReadTransaction trans(FROM_HERE, directory_);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Entry entry(&trans, syncable::GET_BY_HANDLE, meta_handle);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(entry.good());
239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetSpecifics();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestEntryFactory::GetIsUnsyncedForItem(int64 meta_handle) const {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::ReadTransaction trans(FROM_HERE, directory_);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Entry entry(&trans, syncable::GET_BY_HANDLE, meta_handle);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.good()) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetIsUnsynced();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestEntryFactory::GetIsUnappliedForItem(int64 meta_handle) const {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::ReadTransaction trans(FROM_HERE, directory_);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Entry entry(&trans, syncable::GET_BY_HANDLE, meta_handle);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.good()) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return entry.GetIsUnappliedUpdate();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 TestEntryFactory::GetNextRevision() {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return next_revision_++;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
267