diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-05-10 07:02:17 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-05-10 07:42:04 +0000 |
commit | c5afd33b2308a267b617a0a88bab13d5a43103c6 (patch) | |
tree | 8c1d652151dcccc23f0a6b30ddb13eab6bffe419 /metrics/src/tests | |
parent | 1e98247ac92f391bf8af18627354f2374255f32b (diff) |
Rewrite remaining metrics tests from cppunit to gtest.
Diffstat (limited to 'metrics/src/tests')
-rw-r--r-- | metrics/src/tests/CMakeLists.txt | 19 | ||||
-rw-r--r-- | metrics/src/tests/metricmanagertest.cpp | 453 | ||||
-rw-r--r-- | metrics/src/tests/stresstest.cpp | 88 | ||||
-rw-r--r-- | metrics/src/tests/testrunner.cpp | 13 |
4 files changed, 243 insertions, 330 deletions
diff --git a/metrics/src/tests/CMakeLists.txt b/metrics/src/tests/CMakeLists.txt index cb6b5212e28..c7ca296e7b5 100644 --- a/metrics/src/tests/CMakeLists.txt +++ b/metrics/src/tests/CMakeLists.txt @@ -1,15 +1,16 @@ # Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. # Runner for unit tests written in gtest. -# NOTE: All new test classes should be added here. vespa_add_executable(metrics_gtest_runner_app TEST SOURCES countmetrictest.cpp loadmetrictest.cpp metric_timer_test.cpp + metricmanagertest.cpp metricsettest.cpp metrictest.cpp snapshottest.cpp + stresstest.cpp summetrictest.cpp valuemetrictest.cpp gtest_runner.cpp @@ -24,19 +25,3 @@ vespa_add_test( COMMAND metrics_gtest_runner_app ) -# Runner for unit tests written in CppUnit (DEPRECATED). -vespa_add_executable(metrics_testrunner_app TEST - SOURCES - testrunner.cpp - metricmanagertest.cpp - stresstest.cpp - DEPENDS - metrics - vdstestlib -) - -# TODO: Test with a larger chunk size to parallelize test suite runs -vespa_add_test( - NAME metrics_testrunner_app - COMMAND metrics_testrunner_app -) diff --git a/metrics/src/tests/metricmanagertest.cpp b/metrics/src/tests/metricmanagertest.cpp index b89dbad738b..f260089ec84 100644 --- a/metrics/src/tests/metricmanagertest.cpp +++ b/metrics/src/tests/metricmanagertest.cpp @@ -1,14 +1,14 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/metrics/metrics.h> -#include <vespa/metrics/xmlwriter.h> #include <vespa/metrics/jsonwriter.h> -#include <vespa/metrics/textwriter.h> +#include <vespa/metrics/metrics.h> #include <vespa/metrics/printutils.h> #include <vespa/metrics/state_api_adapter.h> -#include <vespa/vdstestlib/cppunit/macros.h> -#include <vespa/vespalib/stllike/asciistream.h> +#include <vespa/metrics/textwriter.h> +#include <vespa/metrics/xmlwriter.h> #include <vespa/vespalib/data/slime/slime.h> +#include <vespa/vespalib/gtest/gtest.h> +#include <vespa/vespalib/stllike/asciistream.h> #include <vespa/vespalib/util/xmlstream.h> #include <vespa/log/log.h> @@ -16,34 +16,8 @@ LOG_SETUP(".test.metricmanager"); namespace metrics { -struct MetricManagerTest : public CppUnit::TestFixture { - void testConsumerVisitor(); - void testSnapshots(); - void testPrintUtils(); - void testXmlOutput(); - void testJsonOutput(); - void jsonOutputSupportsMultipleDimensions(); - void jsonOutputCanNestDimensionsFromMultipleMetricSets(); - void jsonOutputCanHaveMultipleSetsWithSameName(); - void testTextOutput(); - void textOutputSupportsDimensions(); - void testUpdateHooks(); - - CPPUNIT_TEST_SUITE(MetricManagerTest); - CPPUNIT_TEST(testConsumerVisitor); - CPPUNIT_TEST(testSnapshots); - CPPUNIT_TEST(testPrintUtils); - CPPUNIT_TEST(testXmlOutput); - CPPUNIT_TEST(testJsonOutput); - CPPUNIT_TEST(jsonOutputSupportsMultipleDimensions); - CPPUNIT_TEST(jsonOutputCanNestDimensionsFromMultipleMetricSets); - CPPUNIT_TEST(jsonOutputCanHaveMultipleSetsWithSameName); - CPPUNIT_TEST(testTextOutput); - CPPUNIT_TEST(textOutputSupportsDimensions); - CPPUNIT_TEST(testUpdateHooks); - CPPUNIT_TEST_SUITE_END(); +struct MetricManagerTest : public ::testing::Test { -public: // Ugly indirection hack caused by some tests using friended internals of // MetricManager that aren't accessible to "freestanding" fixtures. So we // get the test to do the necessary poking and prodding for us instead. @@ -52,8 +26,6 @@ public: } }; -CPPUNIT_TEST_SUITE_REGISTRATION(MetricManagerTest); - namespace { struct SubMetricSet : public MetricSet @@ -167,45 +139,46 @@ struct MetricNameVisitor : public MetricVisitor { } namespace { - std::pair<std::string, std::string> getMatchedMetrics( - const vespalib::string& config) - { - FastOS_ThreadPool pool(256 * 1024); - TestMetricSet mySet; - MetricManager mm; - mm.registerMetric(mm.getMetricLock(), mySet.set); - mm.init(config, pool); - MetricNameVisitor visitor; - - /** Take a copy to verify clone works. - std::list<Metric::SP> ownerList; - MetricSet::UP copy(dynamic_cast<MetricSet*>( - mm.getMetrics().clone(ownerList))); - mm.visit(*copy, visitor, "consumer"); - */ - - MetricLockGuard g(mm.getMetricLock()); - mm.visit(g, mm.getActiveMetrics(g), visitor, "consumer"); - MetricManager::ConsumerSpec::SP consumerSpec( - mm.getConsumerSpec(g, "consumer")); - return std::pair<std::string, std::string>( - visitor.toString(), - consumerSpec.get() ? consumerSpec->toString() - : "Non-existing consumer"); - } + +std::pair<std::string, std::string> +getMatchedMetrics(const vespalib::string& config) +{ + FastOS_ThreadPool pool(256 * 1024); + TestMetricSet mySet; + MetricManager mm; + mm.registerMetric(mm.getMetricLock(), mySet.set); + mm.init(config, pool); + MetricNameVisitor visitor; + + /** Take a copy to verify clone works. + std::list<Metric::SP> ownerList; + MetricSet::UP copy(dynamic_cast<MetricSet*>( + mm.getMetrics().clone(ownerList))); + mm.visit(*copy, visitor, "consumer"); + */ + + MetricLockGuard g(mm.getMetricLock()); + mm.visit(g, mm.getActiveMetrics(g), visitor, "consumer"); + MetricManager::ConsumerSpec::SP consumerSpec( + mm.getConsumerSpec(g, "consumer")); + return std::pair<std::string, std::string>( + visitor.toString(), + consumerSpec.get() ? consumerSpec->toString() + : "Non-existing consumer"); +} + } #define ASSERT_CONSUMER_MATCH(name, expected, config) \ { \ std::pair<std::string, std::string> consumerMatch( \ getMatchedMetrics(config)); \ - CPPUNIT_ASSERT_EQUAL_MSG(name + std::string(": ") + consumerMatch.second, \ - "\n" + expected, "\n" + consumerMatch.first); \ + EXPECT_EQ("\n" + expected, "\n" + consumerMatch.first) << (name + std::string(": ") + consumerMatch.second); \ } -void MetricManagerTest::testConsumerVisitor() +TEST_F(MetricManagerTest, test_consumer_visitor) { - // Add one tag and a name, check that we get all three. + // Add one tag and a name, check that we get all three. ASSERT_CONSUMER_MATCH("testAddTagAndName", std::string( "temp.val1\n" "temp.val2\n" @@ -221,7 +194,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].addedmetrics[0] temp.val4\n" "consumer[0].addedmetrics[1] temp.multisub.sum.val1\n" ); - // Add two tags, remove one + // Add two tags, remove one ASSERT_CONSUMER_MATCH("testAddAndRemoveTag", std::string( "temp.val1\n" "temp.val4\n" @@ -235,7 +208,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].removedtags[1]\n" "consumer[0].removedtags[0] tag2\n" ); - // Test simple wildcards + // Test simple wildcards ASSERT_CONSUMER_MATCH("testWildCards", std::string( "temp.val1\n" "temp.val2\n" @@ -255,7 +228,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].removedmetrics[0] temp.sub.*\n" "consumer[0].removedmetrics[1] temp.multisub.*\n" ); - // Test more wildcards + // Test more wildcards ASSERT_CONSUMER_MATCH("testWildCards2", std::string( "temp.sub.val1\n" ), @@ -265,7 +238,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].addedmetrics[1]\n" "consumer[0].addedmetrics[0] temp.*.val1\n" ); - // test adding all + // test adding all ASSERT_CONSUMER_MATCH("testAddAll", std::string( "metricmanager.periodichooklatency\n" "metricmanager.snapshothooklatency\n" @@ -300,7 +273,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].addedmetrics[1]\n" "consumer[0].addedmetrics[0] *\n" ); - // test adding all using tags + // test adding all using tags ASSERT_CONSUMER_MATCH("testAddAll2", std::string( "temp.val1\n" "temp.val2\n" @@ -330,7 +303,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].tags[1]\n" "consumer[0].tags[0] *\n" ); - // Test that all metrics are added when a metricsset is added by name + // Test that all metrics are added when a metricsset is added by name ASSERT_CONSUMER_MATCH("testSpecifiedSetName", std::string( "temp.sub.val1\n" "temp.sub.val2\n" @@ -342,7 +315,7 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].addedmetrics[1]\n" "consumer[0].addedmetrics[0] temp.sub\n" ); - // Test that all metrics are added when a metricsset is added by tag + // Test that all metrics are added when a metricsset is added by tag ASSERT_CONSUMER_MATCH("testSpecifiedSetTag", std::string( "temp.sub.val1\n" "temp.sub.val2\n" @@ -360,8 +333,8 @@ void MetricManagerTest::testConsumerVisitor() "consumer[0].tags[1]\n" "consumer[0].tags[0] sub\n" ); - // Test that all metrics are added from the set except those with a - // certain tag. + // Test that all metrics are added from the set except those with a + // certain tag. ASSERT_CONSUMER_MATCH("testSpecifiedSetTagWithExceptionTags", std::string( "temp.val1\n" "temp.val4\n" @@ -385,79 +358,80 @@ void MetricManagerTest::testConsumerVisitor() }; namespace { - struct FakeTimer : public MetricManager::Timer { - time_t _time; - FakeTimer(time_t startTime = 0) : _time(startTime) {} - time_t getTime() const override { return _time; } - }; - struct BriefValuePrinter : public MetricVisitor { - uint32_t count; - std::ostringstream ost; +struct FakeTimer : public MetricManager::Timer { + time_t _time; + FakeTimer(time_t startTime = 0) : _time(startTime) {} + time_t getTime() const override { return _time; } +}; - BriefValuePrinter() : count(0), ost() {} +struct BriefValuePrinter : public MetricVisitor { + uint32_t count; + std::ostringstream ost; - bool visitMetric(const Metric& metric, bool) override { - if (++count > 1) ost << ","; - //ost << metric.getPath() << ":"; - ost << metric.getDoubleValue("value"); - return true; - } - }; + BriefValuePrinter() : count(0), ost() {} - bool waitForTimeProcessed(const MetricManager& mm, - time_t processtime, uint32_t timeout = 120) - { - uint32_t lastchance = time(0) + timeout; - while (time(0) < lastchance) { - if (mm.getLastProcessedTime() >= processtime) return true; - mm.timeChangedNotification(); - FastOS_Thread::Sleep(10); - } - return false; + bool visitMetric(const Metric& metric, bool) override { + if (++count > 1) ost << ","; + //ost << metric.getPath() << ":"; + ost << metric.getDoubleValue("value"); + return true; + } +}; + +bool waitForTimeProcessed(const MetricManager& mm, + time_t processtime, uint32_t timeout = 120) +{ + uint32_t lastchance = time(0) + timeout; + while (time(0) < lastchance) { + if (mm.getLastProcessedTime() >= processtime) return true; + mm.timeChangedNotification(); + FastOS_Thread::Sleep(10); } + return false; +} - std::string dumpAllSnapshots(const MetricManager& mm, - const std::string& consumer) +std::string dumpAllSnapshots(const MetricManager& mm, + const std::string& consumer) +{ + std::ostringstream ost; + ost << "\n"; { - std::ostringstream ost; - ost << "\n"; - { - MetricLockGuard metricLock(mm.getMetricLock()); - BriefValuePrinter briefValuePrinter; - mm.visit(metricLock, mm.getActiveMetrics(metricLock), - briefValuePrinter, consumer); - ost << "Current: " << briefValuePrinter.ost.str() << "\n"; - } - { - MetricLockGuard metricLock(mm.getMetricLock()); + MetricLockGuard metricLock(mm.getMetricLock()); + BriefValuePrinter briefValuePrinter; + mm.visit(metricLock, mm.getActiveMetrics(metricLock), + briefValuePrinter, consumer); + ost << "Current: " << briefValuePrinter.ost.str() << "\n"; + } + { + MetricLockGuard metricLock(mm.getMetricLock()); + BriefValuePrinter briefValuePrinter; + mm.visit(metricLock, mm.getTotalMetricSnapshot(metricLock), + briefValuePrinter, consumer); + ost << "Total: " << briefValuePrinter.ost.str() << "\n"; + } + std::vector<uint32_t> periods; + { + MetricLockGuard metricLock(mm.getMetricLock()); + periods = mm.getSnapshotPeriods(metricLock); + } + for (uint32_t i=0; i<periods.size(); ++i) { + MetricLockGuard metricLock(mm.getMetricLock()); + const MetricSnapshotSet& set(mm.getMetricSnapshotSet( + metricLock, periods[i])); + ost << set.getName() << "\n"; + uint32_t count = 0; + for (uint32_t j=0; j<2; ++j) { + if (set.getCount() == 1 && j == 1) continue; + const MetricSnapshot& snap(set.getSnapshot(j == 1)); BriefValuePrinter briefValuePrinter; - mm.visit(metricLock, mm.getTotalMetricSnapshot(metricLock), - briefValuePrinter, consumer); - ost << "Total: " << briefValuePrinter.ost.str() << "\n"; - } - std::vector<uint32_t> periods; - { - MetricLockGuard metricLock(mm.getMetricLock()); - periods = mm.getSnapshotPeriods(metricLock); - } - for (uint32_t i=0; i<periods.size(); ++i) { - MetricLockGuard metricLock(mm.getMetricLock()); - const MetricSnapshotSet& set(mm.getMetricSnapshotSet( - metricLock, periods[i])); - ost << set.getName() << "\n"; - uint32_t count = 0; - for (uint32_t j=0; j<2; ++j) { - if (set.getCount() == 1 && j == 1) continue; - const MetricSnapshot& snap(set.getSnapshot(j == 1)); - BriefValuePrinter briefValuePrinter; - mm.visit(metricLock, snap, briefValuePrinter, consumer); - ost << " " << count++ << " " << &snap.getMetrics() << ": " + mm.visit(metricLock, snap, briefValuePrinter, consumer); + ost << " " << count++ << " " << &snap.getMetrics() << ": " << briefValuePrinter.ost.str() << "\n"; - } } - return ost.str(); } + return ost.str(); +} } @@ -475,8 +449,7 @@ namespace { mm.visit(lockGuard, mm.getMetricSnapshot(lockGuard, period), \ briefValuePrinter, "snapper"); \ } \ - CPPUNIT_ASSERT_EQUAL_MSG(dumpAllSnapshots(mm, "snapper"), \ - std::string(expected), briefValuePrinter.ost.str()); \ + EXPECT_EQ(std::string(expected), briefValuePrinter.ost.str()) << dumpAllSnapshots(mm, "snapper"); \ } #define ASSERT_PROCESS_TIME(mm, time) \ @@ -484,10 +457,10 @@ namespace { LOG(info, "Waiting for processed time %u.", time); \ bool gotToCorrectProgress = waitForTimeProcessed(mm, time); \ if (!gotToCorrectProgress) \ - CPPUNIT_FAIL("Failed to get to processed time within timeout"); \ + FAIL() << "Failed to get to processed time within timeout"; \ } -void MetricManagerTest::testSnapshots() +TEST_F(MetricManagerTest, test_snapshots) { FastOS_ThreadPool pool(256 * 1024); FakeTimer* timer = new FakeTimer(1000); @@ -512,29 +485,27 @@ void MetricManagerTest::testSnapshots() MetricLockGuard lockGuard(mm.getMetricLock()); mm.visit(lockGuard, mm.getActiveMetrics(lockGuard), visitor, "snapper"); MetricManager::ConsumerSpec::SP consumerSpec( - mm.getConsumerSpec(lockGuard, "snapper")); - CPPUNIT_ASSERT_EQUAL_MSG(consumerSpec.get() ? consumerSpec->toString() - : "Non-existing consumer", - std::string("\n" - "temp.val6\n" - "temp.sub.val1\n" - "*temp.sub.valsum\n" - "temp.multisub.count\n" - "temp.multisub.a.val1\n" - "*temp.multisub.a.valsum\n" - "temp.multisub.b.val1\n" - "*temp.multisub.b.valsum\n" - "*temp.multisub.sum.val1\n" - "*temp.multisub.sum.val2\n" - "*temp.multisub.sum.valsum\n" - ), - "\n" + visitor.toString()); + mm.getConsumerSpec(lockGuard, "snapper")); + EXPECT_EQ(std::string("\n" + "temp.val6\n" + "temp.sub.val1\n" + "*temp.sub.valsum\n" + "temp.multisub.count\n" + "temp.multisub.a.val1\n" + "*temp.multisub.a.valsum\n" + "temp.multisub.b.val1\n" + "*temp.multisub.b.valsum\n" + "*temp.multisub.sum.val1\n" + "*temp.multisub.sum.val2\n" + "*temp.multisub.sum.valsum\n"), + "\n" + visitor.toString()) << (consumerSpec.get() ? consumerSpec->toString() + : "Non-existing consumer"); } - // Initially, there should be no metrics logged + // Initially, there should be no metrics logged ASSERT_PROCESS_TIME(mm, 1000); ASSERT_VALUES(mm, 5 * 60, ""); - // Adding metrics done in first five minutes. + // Adding metrics done in first five minutes. mySet.val6.addValue(2); mySet.val9.val1.addValue(4); mySet.val10.count.inc(); @@ -547,8 +518,8 @@ void MetricManagerTest::testSnapshots() ASSERT_VALUES(mm, 60 * 60, ""); ASSERT_VALUES(mm, 0 * 60, "2,4,4,1,7,9,1,1,8,2,10"); - // Adding metrics done in second five minute period. Total should - // be updated to account for both + // Adding metrics done in second five minute period. Total should + // be updated to account for both mySet.val6.addValue(4); mySet.val9.val1.addValue(5); mySet.val10.count.inc(); @@ -563,16 +534,16 @@ void MetricManagerTest::testSnapshots() //std::cerr << dumpAllSnapshots(mm, "snapper") << "\n"; - // Adding another five minute period where nothing have happened. - // Metric for last 5 minutes should be 0. + // Adding another five minute period where nothing have happened. + // Metric for last 5 minutes should be 0. timer->_time += 5 * 60; ASSERT_PROCESS_TIME(mm, 1000 + 5 * 60 * 3); ASSERT_VALUES(mm, 5 * 60, "0,0,0,0,0,0,0,0,0,0,0"); ASSERT_VALUES(mm, 60 * 60, ""); ASSERT_VALUES(mm, 0 * 60, "4,5,5,2,8,11,2,2,10,3,13"); - // Advancing time to 60 minute period, we should create a proper - // 60 minute period timer. + // Advancing time to 60 minute period, we should create a proper + // 60 minute period timer. mySet.val6.addValue(6); for (uint32_t i=0; i<9; ++i) { // 9 x 5 minutes. Avoid snapshot bumping // due to taking snapshots in the past @@ -583,7 +554,7 @@ void MetricManagerTest::testSnapshots() ASSERT_VALUES(mm, 60 * 60, "6,5,5,2,8,11,2,2,10,3,13"); ASSERT_VALUES(mm, 0 * 60, "6,5,5,2,8,11,2,2,10,3,13"); - // Test that reset works + // Test that reset works mm.reset(1000); ASSERT_VALUES(mm, -1, "0,0,0,0,0,0,0,0,0,0,0"); ASSERT_VALUES(mm, 5 * 60, "0,0,0,0,0,0,0,0,0,0,0"); @@ -591,7 +562,7 @@ void MetricManagerTest::testSnapshots() ASSERT_VALUES(mm, 0 * 60, "0,0,0,0,0,0,0,0,0,0,0"); } -void MetricManagerTest::testPrintUtils() +TEST_F(MetricManagerTest, test_print_utils) { FastOS_ThreadPool pool(256 * 1024); FakeTimer* timer = new FakeTimer(1000); @@ -623,11 +594,11 @@ void MetricManagerTest::testPrintUtils() MetricLockGuard lockGuard(mm.getMetricLock()); MetricSource source(mm.getActiveMetrics(lockGuard), "temp.multisub"); - CPPUNIT_ASSERT(source.getMetric("count") != 0); - CPPUNIT_ASSERT(source.getMetric("a.val1") != 0); - CPPUNIT_ASSERT(source.getMetric("a.valsum") != 0); - CPPUNIT_ASSERT(source.getMetric("sum.val1") != 0); - CPPUNIT_ASSERT(source.getMetric("sum.valsum") != 0); + ASSERT_TRUE(source.getMetric("count") != nullptr); + ASSERT_TRUE(source.getMetric("a.val1") != nullptr); + ASSERT_TRUE(source.getMetric("a.valsum") != nullptr); + ASSERT_TRUE(source.getMetric("sum.val1") != nullptr); + ASSERT_TRUE(source.getMetric("sum.valsum") != nullptr); std::vector<Metric::String> metrics( source.getPathsMatchingPrefix("a.val")); @@ -635,7 +606,7 @@ void MetricManagerTest::testPrintUtils() expected.push_back("val1"); expected.push_back("val2"); expected.push_back("valsum"); - CPPUNIT_ASSERT_EQUAL(expected, metrics); + EXPECT_EQ(expected, metrics); HttpTable table("mytable", "stuff"); table.colNames.push_back("values"); @@ -645,16 +616,16 @@ void MetricManagerTest::testPrintUtils() + getLongMetric("a.val2.value", source)); std::ostringstream ost; table.print(ost); - CPPUNIT_ASSERT_EQUAL(std::string( - "<h3>mytable</h3>\n" - "<table border=\"1\">\n" - "<tr><th>stuff</th><th>values</th></tr>\n" - "<tr><td>valsum</td><td align=\"right\">9</td></tr>\n" - "</table>\n" - ), ost.str()); + EXPECT_EQ(std::string( + "<h3>mytable</h3>\n" + "<table border=\"1\">\n" + "<tr><th>stuff</th><th>values</th></tr>\n" + "<tr><td>valsum</td><td align=\"right\">9</td></tr>\n" + "</table>\n" + ), ost.str()); } -void MetricManagerTest::testXmlOutput() +TEST_F(MetricManagerTest, test_xml_output) { FastOS_ThreadPool pool(256 * 1024); FakeTimer* timer = new FakeTimer(1000); @@ -677,7 +648,7 @@ void MetricManagerTest::testXmlOutput() "consumer[1].tags[0] snaptest\n", pool); - mm.takeSnapshots(mm.getMetricLock(), 1000); + takeSnapshots(mm, 1000); // Adding metrics to have some values in them mySet.val6.addValue(2); @@ -688,7 +659,7 @@ void MetricManagerTest::testXmlOutput() mySet.val10.b.val1.addValue(1); timer->_time = 1300; - mm.takeSnapshots(mm.getMetricLock(), 1300); + takeSnapshots(mm, 1300); std::string expected( "'<snapshot name=\"5 minute\" from=\"1000\" to=\"1300\" period=\"300\">\n" @@ -729,10 +700,10 @@ void MetricManagerTest::testXmlOutput() // Not bothering to match all the nitty gritty details as it will test // more than it needs to. Just be here in order to check on XML output // easily if needed. - CPPUNIT_ASSERT_EQUAL(expected, "'" + actual + "'"); + EXPECT_EQ(expected, "'" + actual + "'"); } -void MetricManagerTest::testJsonOutput() +TEST_F(MetricManagerTest, test_json_output) { FastOS_ThreadPool pool(256 * 1024); FakeTimer* timer = new FakeTimer(1000); @@ -752,7 +723,7 @@ void MetricManagerTest::testJsonOutput() "consumer[0].tags[0] snaptest\n", pool); - mm.takeSnapshots(mm.getMetricLock(), 1000); + takeSnapshots(mm, 1000); // Adding metrics to have some values in them mySet.val6.addValue(2); @@ -763,9 +734,9 @@ void MetricManagerTest::testJsonOutput() mySet.val10.b.val1.addValue(1); timer->_time = 1300; - mm.takeSnapshots(mm.getMetricLock(), 1300); + takeSnapshots(mm, 1300); - // Create json output + // Create json output vespalib::asciistream as; vespalib::JsonStream jsonStream(as); JsonWriter writer(jsonStream); @@ -776,7 +747,7 @@ void MetricManagerTest::testJsonOutput() } jsonStream.finalize(); std::string jsonData = as.str(); - // Parse it back + // Parse it back using namespace vespalib::slime; vespalib::Slime slime; size_t parsed = JsonFormat::decode(vespalib::Memory(jsonData), slime); @@ -786,51 +757,37 @@ void MetricManagerTest::testJsonOutput() std::ostringstream ost; ost << "Failed to parse JSON: '\n" << jsonData << "'\n:" << buffer.get().make_string() << "\n"; - CPPUNIT_ASSERT_EQUAL_MSG(ost.str(), jsonData.size(), parsed); + EXPECT_EQ(jsonData.size(), parsed) << ost.str(); } - // Verify some content - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 1000.0, - slime.get()["snapshot"]["from"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 1300.0, - slime.get()["snapshot"]["to"].asDouble()); - - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, vespalib::string("temp.val6"), - slime.get()["values"][0]["name"].asString().make_string()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, vespalib::string("val6 desc"), - slime.get()["values"][0]["description"].asString().make_string()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 2.0, - slime.get()["values"][0]["values"]["average"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 1.0, - slime.get()["values"][0]["values"]["count"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 2.0, - slime.get()["values"][0]["values"]["min"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 2.0, - slime.get()["values"][0]["values"]["max"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 2.0, - slime.get()["values"][0]["values"]["last"].asDouble()); - - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, vespalib::string("temp.multisub.sum.valsum"), - slime.get()["values"][10]["name"].asString().make_string()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, vespalib::string("valsum desc"), - slime.get()["values"][10]["description"].asString().make_string()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 10.0, - slime.get()["values"][10]["values"]["average"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 3.0, - slime.get()["values"][10]["values"]["count"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 1.0, - slime.get()["values"][10]["values"]["min"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 7.0, - slime.get()["values"][10]["values"]["max"].asDouble()); - CPPUNIT_ASSERT_EQUAL_MSG(jsonData, 10.0, - slime.get()["values"][10]["values"]["last"].asDouble()); - + // Verify some content + EXPECT_EQ(1000.0, slime.get()["snapshot"]["from"].asDouble()) << jsonData; + EXPECT_EQ(1300.0, slime.get()["snapshot"]["to"].asDouble()) << jsonData; + EXPECT_EQ(vespalib::string("temp.val6"), + slime.get()["values"][0]["name"].asString().make_string()) << jsonData; + EXPECT_EQ(vespalib::string("val6 desc"), + slime.get()["values"][0]["description"].asString().make_string()) << jsonData; + EXPECT_EQ(2.0, slime.get()["values"][0]["values"]["average"].asDouble()) << jsonData; + EXPECT_EQ(1.0, slime.get()["values"][0]["values"]["count"].asDouble()) << jsonData; + EXPECT_EQ(2.0, slime.get()["values"][0]["values"]["min"].asDouble()) << jsonData; + EXPECT_EQ(2.0, slime.get()["values"][0]["values"]["max"].asDouble()) << jsonData; + EXPECT_EQ(2.0, slime.get()["values"][0]["values"]["last"].asDouble()) << jsonData; + + EXPECT_EQ(vespalib::string("temp.multisub.sum.valsum"), + slime.get()["values"][10]["name"].asString().make_string()) << jsonData; + EXPECT_EQ(vespalib::string("valsum desc"), + slime.get()["values"][10]["description"].asString().make_string()) << jsonData; + EXPECT_EQ(10.0, slime.get()["values"][10]["values"]["average"].asDouble()) << jsonData; + EXPECT_EQ(3.0, slime.get()["values"][10]["values"]["count"].asDouble()) << jsonData; + EXPECT_EQ(1.0, slime.get()["values"][10]["values"]["min"].asDouble()) << jsonData; + EXPECT_EQ(7.0, slime.get()["values"][10]["values"]["max"].asDouble()) << jsonData; + EXPECT_EQ(10.0, slime.get()["values"][10]["values"]["last"].asDouble()) << jsonData; metrics::StateApiAdapter adapter(mm); vespalib::string normal = adapter.getMetrics("snapper"); - CPPUNIT_ASSERT_EQUAL(vespalib::string(jsonData), normal); + EXPECT_EQ(vespalib::string(jsonData), normal); vespalib::string total = adapter.getTotalMetrics("snapper"); - CPPUNIT_ASSERT(total.size() > 0); - CPPUNIT_ASSERT(total != normal); + EXPECT_GT(total.size(), 0); + EXPECT_NE(total, normal); } namespace { @@ -940,12 +897,10 @@ public: const Metric::Tags& dimensions) { // Works to do this outside of main test body because cppunit uses // exceptions for its failures. - CPPUNIT_ASSERT_EQUAL_MSG(_jsonText, name, nthMetricName(metricIndex)); - CPPUNIT_ASSERT_EQUAL_MSG(_jsonText, dimensions.size(), - nthMetricDimensionCount(metricIndex)); + EXPECT_EQ(name, nthMetricName(metricIndex)) << _jsonText; + EXPECT_EQ(dimensions.size(), nthMetricDimensionCount(metricIndex)) << _jsonText; for (auto& dim : dimensions) { - CPPUNIT_ASSERT_EQUAL_MSG(_jsonText, std::string(dim.value()), - nthMetricDimension(metricIndex, dim.key())); + EXPECT_EQ(std::string(dim.value()), nthMetricDimension(metricIndex, dim.key())) << _jsonText; } } }; @@ -973,10 +928,9 @@ DimensionTestMetricSet::DimensionTestMetricSet(MetricSet* owner) { } DimensionTestMetricSet::~DimensionTestMetricSet() { } -} // anon ns +} -void -MetricManagerTest::jsonOutputSupportsMultipleDimensions() +TEST_F(MetricManagerTest, json_output_supports_multiple_dimensions) { DimensionTestMetricSet mset; MetricSnapshotTestFixture fixture(*this, mset); @@ -1008,10 +962,9 @@ struct NestedDimensionTestMetricSet : MetricSet } }; -} // anon ns +} -void -MetricManagerTest::jsonOutputCanNestDimensionsFromMultipleMetricSets() +TEST_F(MetricManagerTest, json_output_can_nest_dimensions_from_multiple_metric_sets) { NestedDimensionTestMetricSet mset; MetricSnapshotTestFixture fixture(*this, mset); @@ -1060,10 +1013,9 @@ SameNamesTestMetricSet::SameNamesTestMetricSet() { } SameNamesTestMetricSet::~SameNamesTestMetricSet() { } -} // anon ns +} -void -MetricManagerTest::jsonOutputCanHaveMultipleSetsWithSameName() +TEST_F(MetricManagerTest, json_output_can_have_multiple_sets_with_same_name) { SameNamesTestMetricSet mset; MetricSnapshotTestFixture fixture(*this, mset); @@ -1082,7 +1034,7 @@ MetricManagerTest::jsonOutputCanHaveMultipleSetsWithSameName() {{"foo", "baz"}, {"fancy", "stuff"}}); } -void MetricManagerTest::testTextOutput() +TEST_F(MetricManagerTest, test_text_output) { FastOS_ThreadPool pool(256 * 1024); FakeTimer* timer = new FakeTimer(1000); @@ -1133,11 +1085,10 @@ void MetricManagerTest::testTextOutput() // Not bothering to match all the nitty gritty details as it will test // more than it needs to. Just be here in order to check on XML output // easily if needed. - CPPUNIT_ASSERT_EQUAL(expected, actual); + EXPECT_EQ(expected, actual); } -void -MetricManagerTest::textOutputSupportsDimensions() +TEST_F(MetricManagerTest, text_output_supports_dimensions) { NestedDimensionTestMetricSet mset; MetricSnapshotTestFixture fixture(*this, mset); @@ -1153,7 +1104,7 @@ MetricManagerTest::textOutputSupportsDimensions() "average=2 last=2 min=2 max=2 count=1 total=2\n" "outer{fancy:stuff}.temp{bar:hyperbar,foo:megafoo}.val2" "{baz:superbaz} count=1"); - CPPUNIT_ASSERT_EQUAL(expected, actual); + EXPECT_EQ(expected, actual); } namespace { @@ -1171,7 +1122,7 @@ namespace { }; } -void MetricManagerTest::testUpdateHooks() +TEST_F(MetricManagerTest, test_update_hooks) { std::ostringstream output; FastOS_ThreadPool pool(256 * 1024); @@ -1194,7 +1145,7 @@ void MetricManagerTest::testUpdateHooks() // All hooks should get called during initialization - // Initialize metric manager to get snapshots created. + // Initialize metric manager to get snapshots created. output << "Running init\n"; mm.init("raw:" "consumer[2]\n" @@ -1290,7 +1241,7 @@ void MetricManagerTest::testUpdateHooks() "1450: AIL called\n" ); std::string actual(output.str()); - CPPUNIT_ASSERT_EQUAL(expected, actual); + EXPECT_EQ(expected, actual); } -} // metrics +} diff --git a/metrics/src/tests/stresstest.cpp b/metrics/src/tests/stresstest.cpp index e20045ad2d4..4a6d2f4a2ea 100644 --- a/metrics/src/tests/stresstest.cpp +++ b/metrics/src/tests/stresstest.cpp @@ -1,26 +1,16 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/metrics/metrics.h> #include <vespa/metrics/loadmetric.hpp> -#include <vespa/metrics/summetric.hpp> #include <vespa/metrics/metricmanager.h> -#include <vespa/vdstestlib/cppunit/macros.h> +#include <vespa/metrics/metrics.h> +#include <vespa/metrics/summetric.hpp> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/log/log.h> LOG_SETUP(".metrics.test.stress"); namespace metrics { -struct StressTest : public CppUnit::TestFixture { - void testStress(); - - CPPUNIT_TEST_SUITE(StressTest); - CPPUNIT_TEST(testStress); - CPPUNIT_TEST_SUITE_END(); -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(StressTest); - namespace { struct InnerMetricSet : public MetricSet { const LoadTypeSet& _loadTypes; @@ -88,49 +78,49 @@ OuterMetricSet::OuterMetricSet(const LoadTypeSet& lt, MetricSet* owner) OuterMetricSet::~OuterMetricSet() { } - struct Hammer : public document::Runnable { - using UP = std::unique_ptr<Hammer>; +struct Hammer : public document::Runnable { + using UP = std::unique_ptr<Hammer>; - OuterMetricSet& _metrics; - const LoadTypeSet& _loadTypes; - LoadType _nonexistingLoadType; + OuterMetricSet& _metrics; + const LoadTypeSet& _loadTypes; + LoadType _nonexistingLoadType; + + Hammer(OuterMetricSet& metrics, const LoadTypeSet& lt, + FastOS_ThreadPool& threadPool) + : _metrics(metrics), _loadTypes(lt), + _nonexistingLoadType(123, "nonexisting") + { + start(threadPool); + } + ~Hammer() { + stop(); + join(); + //std::cerr << "Loadgiver thread joined\n"; + } - Hammer(OuterMetricSet& metrics, const LoadTypeSet& lt, - FastOS_ThreadPool& threadPool) - : _metrics(metrics), _loadTypes(lt), - _nonexistingLoadType(123, "nonexisting") - { - start(threadPool); - } - ~Hammer() { - stop(); - join(); - //std::cerr << "Loadgiver thread joined\n"; + void run() override { + uint64_t i = 0; + while (running()) { + ++i; + setMetrics(i, _metrics._inner1); + setMetrics(i + 3, _metrics._inner2); + const LoadType& loadType(_loadTypes[i % _loadTypes.size()]); + setMetrics(i + 5, _metrics._load[loadType]); } + } - void run() override { - uint64_t i = 0; - while (running()) { - ++i; - setMetrics(i, _metrics._inner1); - setMetrics(i + 3, _metrics._inner2); - const LoadType& loadType(_loadTypes[i % _loadTypes.size()]); - setMetrics(i + 5, _metrics._load[loadType]); - } - } + void setMetrics(uint64_t val, InnerMetricSet& set) { + set._count.inc(val); + set._value1.addValue(val); + set._value2.addValue(val + 10); + set._load[_loadTypes[val % _loadTypes.size()]].addValue(val); + } +}; - void setMetrics(uint64_t val, InnerMetricSet& set) { - set._count.inc(val); - set._value1.addValue(val); - set._value2.addValue(val + 10); - set._load[_loadTypes[val % _loadTypes.size()]].addValue(val); - } - }; } -void -StressTest::testStress() +TEST(StressTest, test_stress) { LoadTypeSet loadTypes; loadTypes.push_back(LoadType(0, "default")); @@ -158,4 +148,4 @@ StressTest::testStress() // std::cerr << ost.str() << "\n"; } -} // metrics +} diff --git a/metrics/src/tests/testrunner.cpp b/metrics/src/tests/testrunner.cpp deleted file mode 100644 index 9f871997873..00000000000 --- a/metrics/src/tests/testrunner.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#include <vespa/vdstestlib/cppunit/cppunittestrunner.h> - -#include <vespa/log/log.h> -LOG_SETUP("storagecppunittests"); - -int -main(int argc, const char *argv[]) -{ - vdstestlib::CppUnitTestRunner testRunner; - return testRunner.run(argc, argv); -} |