diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job |
Publish
Diffstat (limited to 'searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job')
5 files changed, 147 insertions, 0 deletions
diff --git a/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/.gitignore b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/.gitignore new file mode 100644 index 00000000000..1e657f33c1a --- /dev/null +++ b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/.gitignore @@ -0,0 +1 @@ +searchcore_job_tracked_maintenance_job_test_app diff --git a/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/CMakeLists.txt b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/CMakeLists.txt new file mode 100644 index 00000000000..3b81994e7da --- /dev/null +++ b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchcore_job_tracked_maintenance_job_test_app + SOURCES + job_tracked_maintenance_job_test.cpp + DEPENDS + searchcore_server + searchcore_proton_metrics +) +vespa_add_test(NAME searchcore_job_tracked_maintenance_job_test_app COMMAND searchcore_job_tracked_maintenance_job_test_app) diff --git a/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/DESC b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/DESC new file mode 100644 index 00000000000..4ba7520eab8 --- /dev/null +++ b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/DESC @@ -0,0 +1,2 @@ +job tracked maintenance job test. Take a look at job_tracked_maintenance_job_test.cpp for details. + diff --git a/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/FILES b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/FILES new file mode 100644 index 00000000000..a871a1fa8aa --- /dev/null +++ b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/FILES @@ -0,0 +1 @@ +job_tracked_maintenance_job_test.cpp diff --git a/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/job_tracked_maintenance_job_test.cpp b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/job_tracked_maintenance_job_test.cpp new file mode 100644 index 00000000000..e483bc35b96 --- /dev/null +++ b/searchcore/src/tests/proton/documentdb/job_tracked_maintenance_job/job_tracked_maintenance_job_test.cpp @@ -0,0 +1,134 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/fastos/fastos.h> +#include <vespa/log/log.h> +LOG_SETUP("job_tracked_maintenance_test"); + +#include <vespa/searchcore/proton/server/job_tracked_maintenance_job.h> +#include <vespa/searchcore/proton/test/simple_job_tracker.h> +#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/util/closuretask.h> +#include <vespa/vespalib/util/threadstackexecutor.h> +#include <vespa/vespalib/util/sync.h> + +using namespace proton; +using namespace vespalib; +using test::SimpleJobTracker; +typedef std::unique_ptr<Gate> GateUP; +typedef std::vector<GateUP> GateVector; + +GateVector +getGateVector(size_t size) +{ + GateVector retval; + for (size_t i = 0; i < size; ++i) { + retval.push_back(std::move(GateUP(new Gate()))); + } + return retval; +} + +struct MyMaintenanceJob : public IMaintenanceJob +{ + GateVector _runGates; + size_t _runIdx; + MyMaintenanceJob(size_t numRuns) + : IMaintenanceJob("myjob", 10, 20), + _runGates(getGateVector(numRuns)), + _runIdx(0) + {} + void block() { + setBlocked(true); + } + virtual bool run() { + _runGates[_runIdx++]->await(5000); + return _runIdx == _runGates.size(); + } +}; + +struct Fixture +{ + SimpleJobTracker::SP _tracker; + IMaintenanceJob::UP _job; + MyMaintenanceJob *_myJob; + IMaintenanceJob::UP _trackedJob; + bool _runRetval; + GateVector _runGates; + size_t _runIdx; + ThreadStackExecutor _exec; + Fixture(size_t numRuns = 1) + : _tracker(new SimpleJobTracker(1)), + _job(new MyMaintenanceJob(numRuns)), + _myJob(static_cast<MyMaintenanceJob *>(_job.get())), + _trackedJob(new JobTrackedMaintenanceJob(_tracker, std::move(_job))), + _runRetval(false), + _runGates(getGateVector(numRuns)), + _runIdx(0), + _exec(1, 64000) + { + } + void runJob() { + _runRetval = _trackedJob->run(); + _runGates[_runIdx++]->countDown(); + } + void assertTracker(size_t startedGateCount, size_t endedGateCount) { + EXPECT_EQUAL(startedGateCount, _tracker->_started.getCount()); + EXPECT_EQUAL(endedGateCount, _tracker->_ended.getCount()); + } + void runJobAndWait(size_t runIdx, size_t startedGateCount, size_t endedGateCount) { + _exec.execute(makeTask(makeClosure(this, &Fixture::runJob))); + _tracker->_started.await(5000); + assertTracker(startedGateCount, endedGateCount); + _myJob->_runGates[runIdx]->countDown(); + _runGates[runIdx]->await(5000); + } +}; + +TEST_F("require that maintenance job name, delay and interval are preserved", Fixture) +{ + EXPECT_EQUAL("myjob", f._trackedJob->getName()); + EXPECT_EQUAL(10, f._trackedJob->getDelay()); + EXPECT_EQUAL(20, f._trackedJob->getInterval()); +} + +TEST_F("require that maintenance job that needs 1 run is tracked", Fixture) +{ + f.assertTracker(1, 1); + f.runJobAndWait(0, 0, 1); + f.assertTracker(0, 0); + EXPECT_TRUE(f._runRetval); +} + +TEST_F("require that maintenance job that needs several runs is tracked", Fixture(2)) +{ + f.assertTracker(1, 1); + f.runJobAndWait(0, 0, 1); + f.assertTracker(0, 1); + EXPECT_FALSE(f._runRetval); + + f.runJobAndWait(1, 0, 1); + f.assertTracker(0, 0); + EXPECT_TRUE(f._runRetval); +} + +TEST_F("require that maintenance job that is destroyed is tracked", Fixture(2)) +{ + f.assertTracker(1, 1); + f.runJobAndWait(0, 0, 1); + f.assertTracker(0, 1); + EXPECT_FALSE(f._runRetval); + + f._trackedJob.reset(); + f.assertTracker(0, 0); +} + +TEST_F("require that block calls are sent to underlying job", Fixture) +{ + EXPECT_FALSE(f._trackedJob->isBlocked()); + f._myJob->block(); + EXPECT_TRUE(f._myJob->isBlocked()); + EXPECT_TRUE(f._trackedJob->isBlocked()); + f._trackedJob->unBlock(); + EXPECT_FALSE(f._myJob->isBlocked()); + EXPECT_FALSE(f._trackedJob->isBlocked()); +} + +TEST_MAIN() { TEST_RUN_ALL(); } |