1// Copyright 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Utilities to verify the state of items in unit tests. 6 7#include "sync/test/engine/test_syncable_utils.h" 8 9#include "sync/syncable/directory.h" 10#include "sync/syncable/entry.h" 11#include "sync/syncable/mutable_entry.h" 12#include "sync/syncable/syncable_base_transaction.h" 13#include "sync/syncable/syncable_write_transaction.h" 14#include "sync/test/engine/test_id_factory.h" 15 16using std::string; 17 18namespace syncer { 19namespace syncable { 20 21int CountEntriesWithName(BaseTransaction* rtrans, 22 const syncable::Id& parent_id, 23 const string& name) { 24 Directory::Metahandles child_handles; 25 rtrans->directory()->GetChildHandlesById(rtrans, parent_id, &child_handles); 26 if (child_handles.size() <= 0) { 27 return 0; 28 } 29 30 int number_of_entries_with_name = 0; 31 for (Directory::Metahandles::iterator i = child_handles.begin(); 32 i != child_handles.end(); ++i) { 33 Entry e(rtrans, GET_BY_HANDLE, *i); 34 CHECK(e.good()); 35 if (e.GetNonUniqueName()== name) { 36 ++number_of_entries_with_name; 37 } 38 } 39 return number_of_entries_with_name; 40} 41 42Id GetFirstEntryWithName(BaseTransaction* rtrans, 43 const syncable::Id& parent_id, 44 const string& name) { 45 Directory::Metahandles child_handles; 46 rtrans->directory()->GetChildHandlesById(rtrans, parent_id, &child_handles); 47 48 for (Directory::Metahandles::iterator i = child_handles.begin(); 49 i != child_handles.end(); ++i) { 50 Entry e(rtrans, GET_BY_HANDLE, *i); 51 CHECK(e.good()); 52 if (e.GetNonUniqueName()== name) { 53 return e.GetId(); 54 } 55 } 56 57 CHECK(false); 58 return Id(); 59} 60 61Id GetOnlyEntryWithName(BaseTransaction* rtrans, 62 const syncable::Id& parent_id, 63 const string& name) { 64 CHECK(1 == CountEntriesWithName(rtrans, parent_id, name)); 65 return GetFirstEntryWithName(rtrans, parent_id, name); 66} 67 68void CreateTypeRoot(WriteTransaction* trans, 69 syncable::Directory *dir, 70 ModelType type) { 71 std::string tag_name = syncer::ModelTypeToRootTag(type); 72 syncable::MutableEntry node(trans, 73 syncable::CREATE, 74 type, 75 TestIdFactory::root(), 76 tag_name); 77 DCHECK(node.good()); 78 node.PutUniqueServerTag(tag_name); 79 node.PutIsDir(true); 80 node.PutServerIsDir(false); 81 node.PutIsUnsynced(false); 82 node.PutIsUnappliedUpdate(false); 83 node.PutServerVersion(20); 84 node.PutBaseVersion(20); 85 node.PutIsDel(false); 86 node.PutId(syncer::TestIdFactory::MakeServer(tag_name)); 87 sync_pb::EntitySpecifics specifics; 88 syncer::AddDefaultFieldValue(type, &specifics); 89 node.PutServerSpecifics(specifics); 90 node.PutSpecifics(specifics); 91} 92 93} // namespace syncable 94} // namespace syncer 95