summaryrefslogtreecommitdiffstats
path: root/searchcore/src/tests/proton/metrics
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /searchcore/src/tests/proton/metrics
Publish
Diffstat (limited to 'searchcore/src/tests/proton/metrics')
-rw-r--r--searchcore/src/tests/proton/metrics/documentdb_job_trackers/.gitignore1
-rw-r--r--searchcore/src/tests/proton/metrics/documentdb_job_trackers/CMakeLists.txt8
-rw-r--r--searchcore/src/tests/proton/metrics/documentdb_job_trackers/DESC1
-rw-r--r--searchcore/src/tests/proton/metrics/documentdb_job_trackers/FILES1
-rw-r--r--searchcore/src/tests/proton/metrics/documentdb_job_trackers/documentdb_job_trackers_test.cpp116
-rw-r--r--searchcore/src/tests/proton/metrics/job_load_sampler/.gitignore1
-rw-r--r--searchcore/src/tests/proton/metrics/job_load_sampler/CMakeLists.txt8
-rw-r--r--searchcore/src/tests/proton/metrics/job_load_sampler/DESC1
-rw-r--r--searchcore/src/tests/proton/metrics/job_load_sampler/FILES1
-rw-r--r--searchcore/src/tests/proton/metrics/job_load_sampler/job_load_sampler_test.cpp95
-rw-r--r--searchcore/src/tests/proton/metrics/job_tracked_flush/.gitignore1
-rw-r--r--searchcore/src/tests/proton/metrics/job_tracked_flush/CMakeLists.txt8
-rw-r--r--searchcore/src/tests/proton/metrics/job_tracked_flush/DESC2
-rw-r--r--searchcore/src/tests/proton/metrics/job_tracked_flush/FILES1
-rw-r--r--searchcore/src/tests/proton/metrics/job_tracked_flush/job_tracked_flush_test.cpp139
-rw-r--r--searchcore/src/tests/proton/metrics/metrics_engine/.gitignore1
-rw-r--r--searchcore/src/tests/proton/metrics/metrics_engine/CMakeLists.txt9
-rw-r--r--searchcore/src/tests/proton/metrics/metrics_engine/DESC1
-rw-r--r--searchcore/src/tests/proton/metrics/metrics_engine/FILES1
-rw-r--r--searchcore/src/tests/proton/metrics/metrics_engine/metrics_engine_test.cpp32
20 files changed, 428 insertions, 0 deletions
diff --git a/searchcore/src/tests/proton/metrics/documentdb_job_trackers/.gitignore b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/.gitignore
new file mode 100644
index 00000000000..84c97c63aca
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/.gitignore
@@ -0,0 +1 @@
+searchcore_documentdb_job_trackers_test_app
diff --git a/searchcore/src/tests/proton/metrics/documentdb_job_trackers/CMakeLists.txt b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/CMakeLists.txt
new file mode 100644
index 00000000000..bf77c583468
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchcore_documentdb_job_trackers_test_app
+ SOURCES
+ documentdb_job_trackers_test.cpp
+ DEPENDS
+ searchcore_proton_metrics
+)
+vespa_add_test(NAME searchcore_documentdb_job_trackers_test_app COMMAND searchcore_documentdb_job_trackers_test_app)
diff --git a/searchcore/src/tests/proton/metrics/documentdb_job_trackers/DESC b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/DESC
new file mode 100644
index 00000000000..ccd322886ea
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/DESC
@@ -0,0 +1 @@
+documentdb job trackers test. Take a look at documentdb_job_trackers_test.cpp for details.
diff --git a/searchcore/src/tests/proton/metrics/documentdb_job_trackers/FILES b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/FILES
new file mode 100644
index 00000000000..a63504feca2
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/FILES
@@ -0,0 +1 @@
+documentdb_job_trackers_test.cpp
diff --git a/searchcore/src/tests/proton/metrics/documentdb_job_trackers/documentdb_job_trackers_test.cpp b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/documentdb_job_trackers_test.cpp
new file mode 100644
index 00000000000..3269fe84dcd
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/documentdb_job_trackers/documentdb_job_trackers_test.cpp
@@ -0,0 +1,116 @@
+// 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("documentdb_job_trackers_test");
+
+#include <vespa/searchcore/proton/metrics/documentdb_job_trackers.h>
+#include <vespa/searchcore/proton/metrics/job_tracked_flush_target.h>
+#include <vespa/searchcore/proton/test/dummy_flush_target.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using namespace proton;
+using namespace searchcorespi;
+
+constexpr double EPS = 0.000001;
+
+typedef IFlushTarget::Type FTT;
+typedef IFlushTarget::Component FTC;
+
+struct MFT : public test::DummyFlushTarget
+{
+ MFT(FTT type, FTC component) : test::DummyFlushTarget("", type, component) {}
+};
+
+struct AttributeFlush : public MFT { AttributeFlush() : MFT(FTT::SYNC, FTC::ATTRIBUTE) {} };
+struct MemoryIndexFlush : public MFT { MemoryIndexFlush() : MFT(FTT::FLUSH, FTC::INDEX) {} };
+struct DiskIndexFusion : public MFT { DiskIndexFusion() : MFT(FTT::GC, FTC::INDEX) {} };
+struct DocStoreFlush : public MFT { DocStoreFlush() : MFT(FTT::SYNC, FTC::DOCUMENT_STORE) {} };
+struct DocStoreCompaction : public MFT { DocStoreCompaction() : MFT(FTT::GC, FTC::DOCUMENT_STORE) {} };
+struct OtherFlush : public MFT { OtherFlush() : MFT(FTT::FLUSH, FTC::OTHER) {} };
+
+struct Fixture
+{
+ DocumentDBJobTrackers _trackers;
+ DocumentDBTaggedMetrics::JobMetrics _metrics;
+ Fixture()
+ : _trackers(),
+ _metrics(nullptr)
+ {
+ }
+};
+
+void
+startJobs(IJobTracker &tracker, uint32_t numJobs)
+{
+ for (uint32_t i = 0; i < numJobs; ++i) {
+ tracker.start();
+ }
+}
+
+TEST_F("require that job metrics are updated", Fixture)
+{
+ startJobs(f._trackers.getAttributeFlush(), 1);
+ startJobs(f._trackers.getMemoryIndexFlush(), 2);
+ startJobs(f._trackers.getDiskIndexFusion(), 3);
+ startJobs(f._trackers.getDocumentStoreFlush(), 4);
+ startJobs(f._trackers.getDocumentStoreCompact(), 5);
+ startJobs(*f._trackers.getBucketMove(), 6);
+ startJobs(*f._trackers.getLidSpaceCompact(), 7);
+ startJobs(*f._trackers.getRemovedDocumentsPrune(), 8);
+
+ // Update metrics 2 times to ensure that all jobs are running
+ // in the last interval we actually care about.
+ f._trackers.updateMetrics(f._metrics);
+ FastOS_Thread::Sleep(100);
+ f._trackers.updateMetrics(f._metrics);
+
+ EXPECT_APPROX(1.0, f._metrics.attributeFlush.getLast(), EPS);
+ EXPECT_APPROX(2.0, f._metrics.memoryIndexFlush.getLast(), EPS);
+ EXPECT_APPROX(3.0, f._metrics.diskIndexFusion.getLast(), EPS);
+ EXPECT_APPROX(4.0, f._metrics.documentStoreFlush.getLast(), EPS);
+ EXPECT_APPROX(5.0, f._metrics.documentStoreCompact.getLast(), EPS);
+ EXPECT_APPROX(6.0, f._metrics.bucketMove.getLast(), EPS);
+ EXPECT_APPROX(7.0, f._metrics.lidSpaceCompact.getLast(), EPS);
+ EXPECT_APPROX(8.0, f._metrics.removedDocumentsPrune.getLast(), EPS);
+ EXPECT_APPROX(36.0, f._metrics.total.getLast(), EPS);
+}
+
+bool
+assertFlushTarget(const IJobTracker &tracker, const IFlushTarget &target)
+{
+ const JobTrackedFlushTarget *tracked =
+ dynamic_cast<const JobTrackedFlushTarget *>(&target);
+ if (!EXPECT_TRUE(tracked != nullptr)) return false;
+ if (!EXPECT_EQUAL(&tracker, &tracked->getTracker())) return false;
+ return true;
+}
+
+TEST_F("require that known flush targets are tracked", Fixture)
+{
+ IFlushTarget::List input;
+ input.push_back(IFlushTarget::SP(new AttributeFlush()));
+ input.push_back(IFlushTarget::SP(new MemoryIndexFlush()));
+ input.push_back(IFlushTarget::SP(new DiskIndexFusion()));
+ input.push_back(IFlushTarget::SP(new DocStoreFlush()));
+ input.push_back(IFlushTarget::SP(new DocStoreCompaction()));
+
+ IFlushTarget::List output = f._trackers.trackFlushTargets(input);
+ EXPECT_EQUAL(5u, output.size());
+ EXPECT_TRUE(assertFlushTarget(f._trackers.getAttributeFlush(), *output[0]));
+ EXPECT_TRUE(assertFlushTarget(f._trackers.getMemoryIndexFlush(), *output[1]));
+ EXPECT_TRUE(assertFlushTarget(f._trackers.getDiskIndexFusion(), *output[2]));
+ EXPECT_TRUE(assertFlushTarget(f._trackers.getDocumentStoreFlush(), *output[3]));
+ EXPECT_TRUE(assertFlushTarget(f._trackers.getDocumentStoreCompact(), *output[4]));
+}
+
+TEST_F("require that un-known flush targets are not tracked", Fixture)
+{
+ IFlushTarget::List input;
+ input.push_back(IFlushTarget::SP(new OtherFlush()));
+
+ IFlushTarget::List output = f._trackers.trackFlushTargets(input);
+ EXPECT_EQUAL(1u, output.size());
+ EXPECT_EQUAL(&*output[0].get(), &*input[0]);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchcore/src/tests/proton/metrics/job_load_sampler/.gitignore b/searchcore/src/tests/proton/metrics/job_load_sampler/.gitignore
new file mode 100644
index 00000000000..2e02ec8191b
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_load_sampler/.gitignore
@@ -0,0 +1 @@
+searchcore_job_load_sampler_test_app
diff --git a/searchcore/src/tests/proton/metrics/job_load_sampler/CMakeLists.txt b/searchcore/src/tests/proton/metrics/job_load_sampler/CMakeLists.txt
new file mode 100644
index 00000000000..478a7201228
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_load_sampler/CMakeLists.txt
@@ -0,0 +1,8 @@
+# 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_load_sampler_test_app
+ SOURCES
+ job_load_sampler_test.cpp
+ DEPENDS
+ searchcore_proton_metrics
+)
+vespa_add_test(NAME searchcore_job_load_sampler_test_app COMMAND searchcore_job_load_sampler_test_app)
diff --git a/searchcore/src/tests/proton/metrics/job_load_sampler/DESC b/searchcore/src/tests/proton/metrics/job_load_sampler/DESC
new file mode 100644
index 00000000000..966bcdf83f6
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_load_sampler/DESC
@@ -0,0 +1 @@
+job load sampler test. Take a look at job_load_sampler_test.cpp for details.
diff --git a/searchcore/src/tests/proton/metrics/job_load_sampler/FILES b/searchcore/src/tests/proton/metrics/job_load_sampler/FILES
new file mode 100644
index 00000000000..1112ae6c5da
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_load_sampler/FILES
@@ -0,0 +1 @@
+job_load_sampler_test.cpp
diff --git a/searchcore/src/tests/proton/metrics/job_load_sampler/job_load_sampler_test.cpp b/searchcore/src/tests/proton/metrics/job_load_sampler/job_load_sampler_test.cpp
new file mode 100644
index 00000000000..b8fa728927f
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_load_sampler/job_load_sampler_test.cpp
@@ -0,0 +1,95 @@
+// 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_load_sampler_test");
+
+#include <vespa/searchcore/proton/metrics/job_load_sampler.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using namespace proton;
+
+constexpr double EPS = 0.000001;
+
+struct Fixture
+{
+ JobLoadSampler _sampler;
+ Fixture()
+ : _sampler(10)
+ {
+ }
+ Fixture &start(double now) {
+ _sampler.startJob(now);
+ return *this;
+ }
+ Fixture &end(double now) {
+ _sampler.endJob(now);
+ return *this;
+ }
+ double sample(double now) {
+ return _sampler.sampleLoad(now);
+ }
+};
+
+TEST_F("require that empty sampler gives 0 load", Fixture)
+{
+ EXPECT_APPROX(0.0, f.sample(11), EPS);
+}
+
+TEST_F("require that empty time interval gives 0 load", Fixture)
+{
+ EXPECT_APPROX(0.0, f.sample(10), EPS);
+}
+
+TEST_F("require that job that starts and ends in interval gets correct load", Fixture)
+{
+ f.start(12).end(17);
+ EXPECT_APPROX(0.5, f.sample(20), EPS);
+ EXPECT_APPROX(0.0, f.sample(21), EPS);
+}
+
+TEST_F("require that job that starts in interval gets correct load", Fixture)
+{
+ f.start(12);
+ EXPECT_APPROX(0.8, f.sample(20), EPS);
+ EXPECT_APPROX(1.0, f.sample(21), EPS);
+}
+
+TEST_F("require that job that ends in interval gets correct load", Fixture)
+{
+ f.start(12).sample(20);
+ f.end(27);
+ EXPECT_APPROX(0.7, f.sample(30), EPS);
+ EXPECT_APPROX(0.0, f.sample(31), EPS);
+}
+
+TEST_F("require that job that runs in complete interval gets correct load", Fixture)
+{
+ f.start(12).sample(20);
+ EXPECT_APPROX(1.0, f.sample(30), EPS);
+ EXPECT_APPROX(1.0, f.sample(31), EPS);
+}
+
+TEST_F("require that multiple jobs that starts and ends in interval gets correct load", Fixture)
+{
+ // job1: 12->17: 0.5
+ // job2: 14->16: 0.2
+ f.start(12).start(14).end(16).end(17);
+ EXPECT_APPROX(0.7, f.sample(20), EPS);
+}
+
+TEST_F("require that multiple jobs that starts and ends in several intervals gets correct load", Fixture)
+{
+ // job1: 12->22
+ // job2: 14->34
+ // job3: 25->45
+ f.start(12).start(14);
+ EXPECT_APPROX(1.4, f.sample(20), EPS);
+ f.end(22).start(25);
+ EXPECT_APPROX(1.7, f.sample(30), EPS);
+ f.end(34);
+ EXPECT_APPROX(1.4, f.sample(40), EPS);
+ f.end(45);
+ EXPECT_APPROX(0.5, f.sample(50), EPS);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchcore/src/tests/proton/metrics/job_tracked_flush/.gitignore b/searchcore/src/tests/proton/metrics/job_tracked_flush/.gitignore
new file mode 100644
index 00000000000..85e6097878b
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_tracked_flush/.gitignore
@@ -0,0 +1 @@
+searchcore_job_tracked_flush_test_app
diff --git a/searchcore/src/tests/proton/metrics/job_tracked_flush/CMakeLists.txt b/searchcore/src/tests/proton/metrics/job_tracked_flush/CMakeLists.txt
new file mode 100644
index 00000000000..f4544740f8e
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_tracked_flush/CMakeLists.txt
@@ -0,0 +1,8 @@
+# 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_flush_test_app
+ SOURCES
+ job_tracked_flush_test.cpp
+ DEPENDS
+ searchcore_proton_metrics
+)
+vespa_add_test(NAME searchcore_job_tracked_flush_test_app COMMAND searchcore_job_tracked_flush_test_app)
diff --git a/searchcore/src/tests/proton/metrics/job_tracked_flush/DESC b/searchcore/src/tests/proton/metrics/job_tracked_flush/DESC
new file mode 100644
index 00000000000..b62528ff8b4
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_tracked_flush/DESC
@@ -0,0 +1,2 @@
+job tracked flush target/task test. Take a look at job_tracked_flush_test.cpp for details.
+
diff --git a/searchcore/src/tests/proton/metrics/job_tracked_flush/FILES b/searchcore/src/tests/proton/metrics/job_tracked_flush/FILES
new file mode 100644
index 00000000000..09f32789c94
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_tracked_flush/FILES
@@ -0,0 +1 @@
+job_tracked_flush_test.cpp
diff --git a/searchcore/src/tests/proton/metrics/job_tracked_flush/job_tracked_flush_test.cpp b/searchcore/src/tests/proton/metrics/job_tracked_flush/job_tracked_flush_test.cpp
new file mode 100644
index 00000000000..cf35ba0b505
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/job_tracked_flush/job_tracked_flush_test.cpp
@@ -0,0 +1,139 @@
+// 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_flush_test");
+
+#include <vespa/searchcore/proton/metrics/job_tracked_flush_target.h>
+#include <vespa/searchcore/proton/metrics/job_tracked_flush_task.h>
+#include <vespa/searchcore/proton/test/dummy_flush_target.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 searchcorespi;
+using search::SerialNum;
+using test::SimpleJobTracker;
+using vespalib::makeTask;
+using vespalib::makeClosure;
+using vespalib::CountDownLatch;
+using vespalib::Gate;
+using vespalib::ThreadStackExecutor;
+
+struct MyFlushTask : public searchcorespi::FlushTask
+{
+ Gate &_execGate;
+ MyFlushTask(Gate &execGate) : _execGate(execGate) {}
+
+ // Implements searchcorespi::FlushTask
+ virtual void run() {
+ _execGate.await(5000);
+ }
+ virtual search::SerialNum getFlushSerial() const { return 5; }
+};
+
+struct MyFlushTarget : public test::DummyFlushTarget
+{
+ typedef std::shared_ptr<MyFlushTarget> SP;
+ SerialNum _initFlushSerial;
+ Gate _execGate;
+ Gate _initGate;
+ MyFlushTarget()
+ : test::DummyFlushTarget("mytarget", Type::FLUSH, Component::OTHER),
+ _initFlushSerial(0),
+ _execGate(),
+ _initGate()
+ {}
+
+ // Implements searchcorespi::IFlushTarget
+ virtual FlushTask::UP initFlush(SerialNum currentSerial) {
+ if (currentSerial > 0) {
+ _initFlushSerial = currentSerial;
+ _initGate.await(5000);
+ return FlushTask::UP(new MyFlushTask(_execGate));
+ }
+ return FlushTask::UP();
+ }
+};
+
+struct Fixture
+{
+ SimpleJobTracker::SP _tracker;
+ MyFlushTarget::SP _target;
+ JobTrackedFlushTarget _trackedFlush;
+ FlushTask::UP _task;
+ Gate _taskGate;
+ ThreadStackExecutor _exec;
+ Fixture(uint32_t numJobTrackings = 1)
+ : _tracker(new SimpleJobTracker(numJobTrackings)),
+ _target(new MyFlushTarget()),
+ _trackedFlush(_tracker, _target),
+ _task(),
+ _taskGate(),
+ _exec(1, 64000)
+ {
+ }
+ void initFlush(SerialNum currentSerial) {
+ _task = _trackedFlush.initFlush(currentSerial);
+ _taskGate.countDown();
+ }
+};
+
+constexpr SerialNum FLUSH_SERIAL = 10;
+
+TEST_F("require that flush target name, type and component is preserved", Fixture)
+{
+ EXPECT_EQUAL("mytarget", f._trackedFlush.getName());
+ EXPECT_TRUE(IFlushTarget::Type::FLUSH == f._trackedFlush.getType());
+ EXPECT_TRUE(IFlushTarget::Component::OTHER == f._trackedFlush.getComponent());
+}
+
+TEST_F("require that flush task init is tracked", Fixture)
+{
+ EXPECT_EQUAL(1u, f._tracker->_started.getCount());
+ EXPECT_EQUAL(1u, f._tracker->_ended.getCount());
+
+ f._exec.execute(makeTask(makeClosure(&f, &Fixture::initFlush, FLUSH_SERIAL)));
+ f._tracker->_started.await(5000);
+ EXPECT_EQUAL(0u, f._tracker->_started.getCount());
+ EXPECT_EQUAL(1u, f._tracker->_ended.getCount());
+
+ f._target->_initGate.countDown();
+ f._taskGate.await(5000);
+ EXPECT_EQUAL(0u, f._tracker->_ended.getCount());
+ {
+ JobTrackedFlushTask *trackedTask = dynamic_cast<JobTrackedFlushTask *>(f._task.get());
+ EXPECT_TRUE(trackedTask != nullptr);
+ EXPECT_EQUAL(5u, trackedTask->getFlushSerial());
+ }
+ EXPECT_EQUAL(FLUSH_SERIAL, f._target->_initFlushSerial);
+}
+
+TEST_F("require that flush task execution is tracked", Fixture(2))
+{
+ f._exec.execute(makeTask(makeClosure(&f, &Fixture::initFlush, FLUSH_SERIAL)));
+ f._target->_initGate.countDown();
+ f._taskGate.await(5000);
+
+ EXPECT_EQUAL(1u, f._tracker->_started.getCount());
+ EXPECT_EQUAL(1u, f._tracker->_ended.getCount());
+
+ f._exec.execute(std::move(f._task));
+ f._tracker->_started.await(5000);
+ EXPECT_EQUAL(0u, f._tracker->_started.getCount());
+ EXPECT_EQUAL(1u, f._tracker->_ended.getCount());
+
+ f._target->_execGate.countDown();
+ f._tracker->_ended.await(5000);
+ EXPECT_EQUAL(0u, f._tracker->_ended.getCount());
+}
+
+TEST_F("require that nullptr flush task is not tracked", Fixture)
+{
+ FlushTask::UP task = f._trackedFlush.initFlush(0);
+ EXPECT_TRUE(task.get() == nullptr);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchcore/src/tests/proton/metrics/metrics_engine/.gitignore b/searchcore/src/tests/proton/metrics/metrics_engine/.gitignore
new file mode 100644
index 00000000000..98ae77cb458
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/metrics_engine/.gitignore
@@ -0,0 +1 @@
+searchcore_metrics_engine_test_app
diff --git a/searchcore/src/tests/proton/metrics/metrics_engine/CMakeLists.txt b/searchcore/src/tests/proton/metrics/metrics_engine/CMakeLists.txt
new file mode 100644
index 00000000000..e50e584e578
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/metrics_engine/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_metrics_engine_test_app
+ SOURCES
+ metrics_engine_test.cpp
+ DEPENDS
+ searchcore_flushengine
+ searchcore_proton_metrics
+)
+vespa_add_test(NAME searchcore_metrics_engine_test_app COMMAND searchcore_metrics_engine_test_app)
diff --git a/searchcore/src/tests/proton/metrics/metrics_engine/DESC b/searchcore/src/tests/proton/metrics/metrics_engine/DESC
new file mode 100644
index 00000000000..2efe31d45d3
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/metrics_engine/DESC
@@ -0,0 +1 @@
+metrics engine test. Take a look at metrics_engine_test.cpp for details.
diff --git a/searchcore/src/tests/proton/metrics/metrics_engine/FILES b/searchcore/src/tests/proton/metrics/metrics_engine/FILES
new file mode 100644
index 00000000000..ac033a53070
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/metrics_engine/FILES
@@ -0,0 +1 @@
+metrics_engine_test.cpp
diff --git a/searchcore/src/tests/proton/metrics/metrics_engine/metrics_engine_test.cpp b/searchcore/src/tests/proton/metrics/metrics_engine/metrics_engine_test.cpp
new file mode 100644
index 00000000000..a70ce5a5333
--- /dev/null
+++ b/searchcore/src/tests/proton/metrics/metrics_engine/metrics_engine_test.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for metrics_engine.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("metrics_engine_test");
+
+#include <vespa/searchcore/proton/metrics/metrics_engine.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using namespace proton;
+
+namespace {
+
+TEST("require that the metric proton.diskusage is the sum of the documentDB "
+ "diskusage metrics.") {
+ MetricsEngine metrics_engine;
+
+ DocumentDBMetricsCollection metrics1("type1", 1);
+ DocumentDBMetricsCollection metrics2("type2", 1);
+ metrics1.getMetrics().index.diskUsage.addValue(100);
+ metrics2.getMetrics().index.diskUsage.addValue(1000);
+
+ metrics_engine.addDocumentDBMetrics(metrics1);
+ metrics_engine.addDocumentDBMetrics(metrics2);
+
+ EXPECT_EQUAL(1100, metrics_engine.legacyRoot().diskUsage.getLongValue("value"));
+}
+
+} // namespace
+
+TEST_MAIN() { TEST_RUN_ALL(); }