// Copyright 2014 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 SYNC_SYNCABLE_DIRECTORY_UNITTEST_H_ #define SYNC_SYNCABLE_DIRECTORY_UNITTEST_H_ #include <string> #include "base/basictypes.h" #include "base/message_loop/message_loop.h" #include "sync/syncable/in_memory_directory_backing_store.h" #include "sync/syncable/mutable_entry.h" #include "sync/syncable/syncable_read_transaction.h" #include "sync/syncable/syncable_write_transaction.h" #include "sync/test/engine/test_id_factory.h" #include "sync/test/fake_encryptor.h" #include "sync/test/null_directory_change_delegate.h" #include "sync/test/null_transaction_observer.h" #include "sync/util/test_unrecoverable_error_handler.h" #include "testing/gtest/include/gtest/gtest.h" namespace syncer { namespace syncable { class BaseTransaction; // A test fixture for syncable::Directory. Uses an in-memory database to keep // the unit tests fast. // // Serves as base class for several other test fixtures. class SyncableDirectoryTest : public testing::Test { protected: static const char kDirectoryName[]; SyncableDirectoryTest(); virtual ~SyncableDirectoryTest(); virtual void SetUp(); virtual void TearDown(); // Destroys any currently opened directory, creates and opens a new one. // // Returns result of the Open call. DirOpenResult ReopenDirectory(); // Creates an empty entry and sets the ID field to a default one. void CreateEntry(const ModelType& model_type, const std::string& entryname); // Creates an empty entry and sets the ID field to id. void CreateEntry(const ModelType& model_type, const std::string& entryname, const int id); void CreateEntry(const ModelType& model_type, const std::string& entryname, const Id& id); void CreateEntryWithAttachmentMetadata( const ModelType& model_type, const std::string& entryname, const Id& id, const sync_pb::AttachmentMetadata& attachment_metadata); void DeleteEntry(const Id& id); // When a directory is saved then loaded from disk, it will pass through // DropDeletedEntries(). This will remove some entries from the directory. // This function is intended to simulate that process. // // WARNING: The directory will be deleted by this operation. You should // not have any pointers to the directory (open transactions included) // when you call this. DirOpenResult SimulateSaveAndReloadDir(); // This function will close and re-open the directory without saving any // pending changes. This is intended to simulate the recovery from a crash // scenario. The same warnings for SimulateSaveAndReloadDir apply here. DirOpenResult SimulateCrashAndReloadDir(); void GetAllMetaHandles(BaseTransaction* trans, MetahandleSet* result); void CheckPurgeEntriesWithTypeInSucceeded(ModelTypeSet types_to_purge, bool before_reload); bool IsInDirtyMetahandles(int64 metahandle); bool IsInMetahandlesToPurge(int64 metahandle); scoped_ptr<Directory>& dir(); DirectoryChangeDelegate* directory_change_delegate(); Encryptor* encryptor(); UnrecoverableErrorHandler* unrecoverable_error_handler(); private: void ValidateEntry(BaseTransaction* trans, int64 id, bool check_name, const std::string& name, int64 base_version, int64 server_version, bool is_del); base::MessageLoop message_loop_; scoped_ptr<Directory> dir_; NullDirectoryChangeDelegate delegate_; FakeEncryptor encryptor_; TestUnrecoverableErrorHandler handler_; sql::Connection connection_; }; } // namespace syncable } // namespace syncer #endif // SYNC_SYNCABLE_DIRECTORY_UNITTEST_H_