mirror of https://gitee.com/bigwinds/arangodb
227 lines
14 KiB
C++
227 lines
14 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
/// 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 <deque>
|
|
|
|
#include "Basics/Result.h"
|
|
#include "Indexes/IndexIterator.h"
|
|
#include "StorageEngine/StorageEngine.h"
|
|
#include "StorageEngine/TransactionCollection.h"
|
|
#include "StorageEngine/TransactionState.h"
|
|
#include "StorageEngine/PhysicalCollection.h"
|
|
#include "Transaction/ContextData.h"
|
|
#include "VocBase/LocalDocumentId.h"
|
|
|
|
#include <velocypack/StringRef.h>
|
|
|
|
namespace arangodb {
|
|
|
|
struct KeyLockInfo;
|
|
class TransactionManager;
|
|
class WalAccess;
|
|
|
|
} // arangodb
|
|
|
|
class PhysicalCollectionMock: public arangodb::PhysicalCollection {
|
|
public:
|
|
static std::function<void()> before;
|
|
std::string physicalPath;
|
|
std::deque<std::pair<arangodb::velocypack::Builder, bool>> documents; // std::pair<jSON, valid>, deque -> pointers remain valid
|
|
|
|
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<arangodb::Index> createIndex(arangodb::velocypack::Slice const& info, bool restore, bool& created) override;
|
|
virtual void deferDropCollection(std::function<bool(arangodb::LogicalCollection&)> const& callback) override;
|
|
virtual bool dropIndex(TRI_idx_iid_t iid) override;
|
|
virtual void figuresSpecific(std::shared_ptr<arangodb::velocypack::Builder>&) override;
|
|
virtual std::unique_ptr<arangodb::IndexIterator> getAllIterator(arangodb::transaction::Methods* trx) const override;
|
|
virtual std::unique_ptr<arangodb::IndexIterator> 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<void()> const& callbackDuringLock) override;
|
|
virtual void invokeOnAllElements(arangodb::transaction::Methods* trx, std::function<bool(arangodb::LocalDocumentId const&)> callback) 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<void()> 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<arangodb::Index> idx);
|
|
};
|
|
|
|
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<void()> before;
|
|
static arangodb::Result flushSubscriptionResult;
|
|
static arangodb::RecoveryState recoveryStateResult;
|
|
static TRI_voc_tick_t recoveryTickResult;
|
|
static std::string versionFilenameResult;
|
|
static std::function<void()> recoveryTickCallback;
|
|
std::map<std::pair<TRI_voc_tick_t, TRI_voc_cid_t>, arangodb::velocypack::Builder> views;
|
|
std::atomic<size_t> vocbaseCount;
|
|
|
|
explicit StorageEngineMock(arangodb::application_features::ApplicationServer& server);
|
|
virtual void addOptimizerRules() 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<TRI_vocbase_t> createDatabase(TRI_voc_tick_t id, arangodb::velocypack::Slice const& args, int& status) override;
|
|
virtual arangodb::Result createLoggerState(TRI_vocbase_t*, VPackBuilder&) override;
|
|
virtual std::unique_ptr<arangodb::PhysicalCollection> createPhysicalCollection(arangodb::LogicalCollection& collection, arangodb::velocypack::Slice const& info) override;
|
|
virtual arangodb::Result createTickRanges(VPackBuilder&) override;
|
|
virtual std::unique_ptr<arangodb::TransactionCollection> createTransactionCollection(arangodb::TransactionState& state, TRI_voc_cid_t cid, arangodb::AccessMode::Type, int nestingLevel) override;
|
|
virtual std::unique_ptr<arangodb::transaction::ContextData> createTransactionContextData() override;
|
|
virtual std::unique_ptr<arangodb::transaction::Manager> createTransactionManager() override;
|
|
virtual std::unique_ptr<arangodb::TransactionState> 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 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<std::string> 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<arangodb::transaction::Context> transactionContext, uint64_t tickStart, uint64_t tickEnd, std::shared_ptr<VPackBuilder>& builderSPtr) override;
|
|
virtual std::unique_ptr<TRI_vocbase_t> openDatabase(arangodb::velocypack::Slice const& args, bool isUpgrade, bool isVersionCheck, int& status) 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
|