////////////////////////////////////////////////////////////////////////////// /// DISCLAIMER /// /// Copyright 2017 EMC Corporation /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is EMC Corporation /// /// @author Andrey Abramov /// @author Vasiliy Nabatchikov //////////////////////////////////////////////////////////////////////////////// #ifndef ARANGODB_TESTS_MOCKS_STORAGE_ENGINE_MOCK_H #define ARANGODB_TESTS_MOCKS_STORAGE_ENGINE_MOCK_H 1 #include #include "Basics/Result.h" #include "Indexes/IndexIterator.h" #include "StorageEngine/PhysicalCollection.h" #include "StorageEngine/StorageEngine.h" #include "StorageEngine/TransactionCollection.h" #include "StorageEngine/TransactionState.h" #include "Transaction/ContextData.h" #include "VocBase/LocalDocumentId.h" #include namespace arangodb { struct KeyLockInfo; class TransactionManager; class WalAccess; namespace aql { class OptimizerRulesFeature; } } // namespace arangodb class PhysicalCollectionMock : public arangodb::PhysicalCollection { public: struct DocElement { DocElement(std::shared_ptr> data, uint64_t docId); arangodb::velocypack::Slice data() const; std::shared_ptr> rawData() const; arangodb::LocalDocumentId docId() const; uint8_t const* vptr() const; void swapBuffer(std::shared_ptr>& newData); private: std::shared_ptr> _data; uint64_t const _docId; }; static std::function before; std::string physicalPath; PhysicalCollectionMock(arangodb::LogicalCollection& collection, arangodb::velocypack::Slice const& info); virtual PhysicalCollection* clone(arangodb::LogicalCollection& collection) const override; virtual int close() override; virtual std::shared_ptr createIndex(arangodb::velocypack::Slice const& info, bool restore, bool& created) override; virtual void deferDropCollection(std::function const& callback) override; virtual bool dropIndex(TRI_idx_iid_t iid) override; virtual void figuresSpecific(arangodb::velocypack::Builder&) override; virtual std::unique_ptr getAllIterator( arangodb::transaction::Methods* trx) const override; virtual std::unique_ptr getAnyIterator( arangodb::transaction::Methods* trx) const override; virtual void getPropertiesVPack(arangodb::velocypack::Builder&) const override; virtual arangodb::Result insert(arangodb::transaction::Methods* trx, arangodb::velocypack::Slice const newSlice, arangodb::ManagedDocumentResult& result, arangodb::OperationOptions& options, bool lock, arangodb::KeyLockInfo* /*keyLockInfo*/, std::function const& callbackDuringLock) override; virtual arangodb::LocalDocumentId lookupKey(arangodb::transaction::Methods*, arangodb::velocypack::Slice const&) const override; virtual size_t memory() const override; virtual uint64_t numberDocuments(arangodb::transaction::Methods* trx) const override; virtual void open(bool ignoreErrors) override; virtual std::string const& path() const override; virtual arangodb::Result persistProperties() override; virtual void prepareIndexes(arangodb::velocypack::Slice indexesSlice) override; virtual arangodb::Result read(arangodb::transaction::Methods*, arangodb::velocypack::StringRef const& key, arangodb::ManagedDocumentResult& result, bool) override; virtual arangodb::Result read(arangodb::transaction::Methods*, arangodb::velocypack::Slice const& key, arangodb::ManagedDocumentResult& result, bool) override; virtual bool readDocument(arangodb::transaction::Methods* trx, arangodb::LocalDocumentId const& token, arangodb::ManagedDocumentResult& result) const override; virtual bool readDocumentWithCallback(arangodb::transaction::Methods* trx, arangodb::LocalDocumentId const& token, arangodb::IndexIterator::DocumentCallback const& cb) const override; virtual arangodb::Result remove(arangodb::transaction::Methods& trx, arangodb::velocypack::Slice slice, arangodb::ManagedDocumentResult& previous, arangodb::OperationOptions& options, bool lock, arangodb::KeyLockInfo* /*keyLockInfo*/, std::function const& callbackDuringLock) override; virtual arangodb::Result replace(arangodb::transaction::Methods* trx, arangodb::velocypack::Slice const newSlice, arangodb::ManagedDocumentResult& result, arangodb::OperationOptions& options, bool lock, arangodb::ManagedDocumentResult& previous) override; virtual TRI_voc_rid_t revision(arangodb::transaction::Methods* trx) const override; virtual void setPath(std::string const&) override; virtual arangodb::Result truncate(arangodb::transaction::Methods& trx, arangodb::OperationOptions& options) override; virtual arangodb::Result compact() override; virtual arangodb::Result update(arangodb::transaction::Methods* trx, arangodb::velocypack::Slice const newSlice, arangodb::ManagedDocumentResult& result, arangodb::OperationOptions& options, bool lock, arangodb::ManagedDocumentResult& previous) override; virtual void load() override {} virtual void unload() override {} virtual arangodb::Result updateProperties(arangodb::velocypack::Slice const& slice, bool doSync) override; private: bool addIndex(std::shared_ptr idx); arangodb::Result updateInternal(arangodb::transaction::Methods* trx, arangodb::velocypack::Slice const newSlice, arangodb::ManagedDocumentResult& result, arangodb::OperationOptions& options, bool lock, arangodb::ManagedDocumentResult& previous, bool isUpdate); uint64_t _lastDocumentId; // keep old documents memory, unclear if needed. std::vector>> _graveyard; // map _key => data. Keyslice references memory in the value std::unordered_map _documents; }; class TransactionCollectionMock : public arangodb::TransactionCollection { public: TransactionCollectionMock(arangodb::TransactionState* state, TRI_voc_cid_t cid, arangodb::AccessMode::Type accessType); virtual bool canAccess(arangodb::AccessMode::Type accessType) const override; virtual void freeOperations(arangodb::transaction::Methods* activeTrx, bool mustRollback) override; virtual bool hasOperations() const override; virtual void release() override; virtual void unuse(int nestingLevel) override; virtual int use(int nestingLevel) override; private: int doLock(arangodb::AccessMode::Type type, int nestingLevel) override; int doUnlock(arangodb::AccessMode::Type type, int nestingLevel) override; }; class TransactionStateMock : public arangodb::TransactionState { public: static size_t abortTransactionCount; static size_t beginTransactionCount; static size_t commitTransactionCount; TransactionStateMock(TRI_vocbase_t& vocbase, TRI_voc_tid_t tid, arangodb::transaction::Options const& options); virtual arangodb::Result abortTransaction(arangodb::transaction::Methods* trx) override; virtual arangodb::Result beginTransaction(arangodb::transaction::Hints hints) override; virtual arangodb::Result commitTransaction(arangodb::transaction::Methods* trx) override; virtual bool hasFailedOperations() const override; }; class StorageEngineMock : public arangodb::StorageEngine { public: static std::function before; static arangodb::Result flushSubscriptionResult; static arangodb::RecoveryState recoveryStateResult; static TRI_voc_tick_t recoveryTickResult; static std::string versionFilenameResult; static std::function recoveryTickCallback; std::map, arangodb::velocypack::Builder> views; std::atomic vocbaseCount; explicit StorageEngineMock(arangodb::application_features::ApplicationServer& server); virtual void addOptimizerRules(arangodb::aql::OptimizerRulesFeature& feature) override; virtual void addRestHandlers(arangodb::rest::RestHandlerFactory& handlerFactory) override; virtual void addV8Functions() override; virtual void changeCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection const& collection, bool doSync) override; virtual arangodb::Result changeView(TRI_vocbase_t& vocbase, arangodb::LogicalView const& view, bool doSync) override; virtual std::string collectionPath(TRI_vocbase_t const& vocbase, TRI_voc_cid_t id) const override; virtual std::string createCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection const& collection) override; virtual std::unique_ptr createDatabase(arangodb::CreateDatabaseInfo&&, int& status) override; virtual arangodb::Result createLoggerState(TRI_vocbase_t*, VPackBuilder&) override; virtual std::unique_ptr createPhysicalCollection( arangodb::LogicalCollection& collection, arangodb::velocypack::Slice const& info) override; virtual arangodb::Result createTickRanges(VPackBuilder&) override; virtual std::unique_ptr createTransactionCollection( arangodb::TransactionState& state, TRI_voc_cid_t cid, arangodb::AccessMode::Type, int nestingLevel) override; virtual std::unique_ptr createTransactionContextData() override; virtual std::unique_ptr createTransactionManager( arangodb::transaction::ManagerFeature&) override; virtual std::unique_ptr createTransactionState( TRI_vocbase_t& vocbase, TRI_voc_tid_t tid, arangodb::transaction::Options const& options) override; virtual arangodb::Result createView(TRI_vocbase_t& vocbase, TRI_voc_cid_t id, arangodb::LogicalView const& view) override; virtual void getViewProperties(TRI_vocbase_t& vocbase, arangodb::LogicalView const& view, VPackBuilder& builder) override; virtual TRI_voc_tick_t currentTick() const override; virtual std::string dataPath() const override; virtual std::string databasePath(TRI_vocbase_t const* vocbase) const override; virtual void destroyCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection& collection) override; virtual void destroyView(TRI_vocbase_t const& vocbase, arangodb::LogicalView const& view) noexcept override; virtual arangodb::Result dropCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection& collection) override; virtual arangodb::Result dropDatabase(TRI_vocbase_t& vocbase) override; virtual arangodb::Result dropView(TRI_vocbase_t const& vocbase, arangodb::LogicalView const& view) override; virtual arangodb::Result firstTick(uint64_t&) override; virtual std::vector currentWalFiles() const override; virtual arangodb::Result flushWal(bool waitForSync, bool waitForCollector, bool writeShutdownFile) override; virtual void getCollectionInfo(TRI_vocbase_t& vocbase, TRI_voc_cid_t cid, arangodb::velocypack::Builder& result, bool includeIndexes, TRI_voc_tick_t maxTick) override; virtual int getCollectionsAndIndexes(TRI_vocbase_t& vocbase, arangodb::velocypack::Builder& result, bool wasCleanShutdown, bool isUpgrade) override; virtual void getDatabases(arangodb::velocypack::Builder& result) override; virtual void cleanupReplicationContexts() override; virtual arangodb::velocypack::Builder getReplicationApplierConfiguration(TRI_vocbase_t& vocbase, int& result) override; virtual arangodb::velocypack::Builder getReplicationApplierConfiguration(int& result) override; virtual int getViews(TRI_vocbase_t& vocbase, arangodb::velocypack::Builder& result) override; virtual arangodb::Result handleSyncKeys(arangodb::DatabaseInitialSyncer& syncer, arangodb::LogicalCollection& col, std::string const& keysId) override; virtual arangodb::RecoveryState recoveryState() override; virtual TRI_voc_tick_t recoveryTick() override; virtual arangodb::Result lastLogger(TRI_vocbase_t& vocbase, std::shared_ptr transactionContext, uint64_t tickStart, uint64_t tickEnd, std::shared_ptr& builderSPtr) override; virtual std::unique_ptr openDatabase(arangodb::CreateDatabaseInfo&&, bool isUpgrade) override; virtual arangodb::Result persistCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection const& collection) override; virtual void prepareDropDatabase(TRI_vocbase_t& vocbase, bool useWriteMarker, int& status) override; using StorageEngine::registerCollection; using StorageEngine::registerView; virtual TRI_voc_tick_t releasedTick() const override; virtual void releaseTick(TRI_voc_tick_t) override; virtual int removeReplicationApplierConfiguration(TRI_vocbase_t& vocbase) override; virtual int removeReplicationApplierConfiguration() override; virtual arangodb::Result renameCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection const& collection, std::string const& oldName) override; virtual int saveReplicationApplierConfiguration(TRI_vocbase_t& vocbase, arangodb::velocypack::Slice slice, bool doSync) override; virtual int saveReplicationApplierConfiguration(arangodb::velocypack::Slice, bool) override; virtual int shutdownDatabase(TRI_vocbase_t& vocbase) override; virtual void signalCleanup(TRI_vocbase_t& vocbase) override; virtual bool supportsDfdb() const override; virtual void unloadCollection(TRI_vocbase_t& vocbase, arangodb::LogicalCollection& collection) override; virtual bool useRawDocumentPointers() override { return false; } virtual std::string versionFilename(TRI_voc_tick_t) const override; virtual void waitForEstimatorSync(std::chrono::milliseconds maxWaitTime) override; virtual void waitForSyncTick(TRI_voc_tick_t tick) override; virtual void waitUntilDeletion(TRI_voc_tick_t id, bool force, int& status) override; virtual arangodb::WalAccess const* walAccess() const override; virtual int writeCreateDatabaseMarker(TRI_voc_tick_t id, VPackSlice const& slice) override; private: TRI_voc_tick_t _releasedTick; }; #endif