// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include #include #include #include #include #include #include using document::test::makeBucketSpace; namespace storage::distributor { class MockMaintenancePriorityGenerator : public MaintenancePriorityGenerator { MaintenancePriorityAndType prioritize( const document::Bucket&, NodeMaintenanceStatsTracker& stats) const override { stats.incMovingOut(1, makeBucketSpace()); stats.incCopyingIn(2, makeBucketSpace()); return MaintenancePriorityAndType( MaintenancePriority(MaintenancePriority::VERY_HIGH), MaintenanceOperation::MERGE_BUCKET); } }; class MockOperation : public MaintenanceOperation { document::Bucket _bucket; std::string _reason; bool _shouldBlock; public: MockOperation(const document::Bucket &bucket) : _bucket(bucket), _shouldBlock(false) {} std::string toString() const override { return _bucket.toString(); } void onClose(DistributorMessageSender&) override {} const char* getName() const override { return "MockOperation"; } const std::string& getDetailedReason() const override { return _reason; } void onStart(DistributorMessageSender&) override {} void onReceive(DistributorMessageSender&, const std::shared_ptr&) override {} bool isBlocked(const PendingMessageTracker&) const override { return _shouldBlock; } void setShouldBlock(bool shouldBlock) { _shouldBlock = shouldBlock; } }; class MockMaintenanceOperationGenerator : public MaintenanceOperationGenerator { public: MaintenanceOperation::SP generate(const document::Bucket&bucket) const override { return MaintenanceOperation::SP(new MockOperation(bucket)); } std::vector generateAll( const document::Bucket &bucket, NodeMaintenanceStatsTracker& tracker) const override { (void) tracker; std::vector ret; ret.push_back(MaintenanceOperation::SP(new MockOperation(bucket))); return ret; } }; class MockOperationStarter : public OperationStarter { std::ostringstream _started; std::vector _operations; bool _shouldStart; public: MockOperationStarter() : _shouldStart(true) {} bool start(const std::shared_ptr& operation, Priority priority) override { if (_shouldStart) { _started << operation->toString() << ", pri " << static_cast(priority) << "\n"; _operations.push_back(operation); } return _shouldStart; } void setShouldStartOperations(bool shouldStart) { _shouldStart = shouldStart; } std::vector& getOperations() { return _operations; } std::string toString() const { return _started.str(); } }; }