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 /storage/src/tests/bucketmover |
Publish
Diffstat (limited to 'storage/src/tests/bucketmover')
-rw-r--r-- | storage/src/tests/bucketmover/CMakeLists.txt | 9 | ||||
-rw-r--r-- | storage/src/tests/bucketmover/bucketmovertest.cpp | 190 | ||||
-rw-r--r-- | storage/src/tests/bucketmover/htmltabletest.cpp | 100 |
3 files changed, 299 insertions, 0 deletions
diff --git a/storage/src/tests/bucketmover/CMakeLists.txt b/storage/src/tests/bucketmover/CMakeLists.txt new file mode 100644 index 00000000000..2d02cdc4942 --- /dev/null +++ b/storage/src/tests/bucketmover/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_library(storage_testbucketmover + SOURCES + bucketmovertest.cpp + htmltabletest.cpp + DEPENDS + AFTER + storage_storageconfig +) diff --git a/storage/src/tests/bucketmover/bucketmovertest.cpp b/storage/src/tests/bucketmover/bucketmovertest.cpp new file mode 100644 index 00000000000..2720e6bac2a --- /dev/null +++ b/storage/src/tests/bucketmover/bucketmovertest.cpp @@ -0,0 +1,190 @@ +// 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/storage/bucketdb/storbucketdb.h> +#include <vespa/storage/common/bucketmessages.h> +#include <vespa/storage/bucketmover/bucketmover.h> +#include <tests/common/dummystoragelink.h> +#include <tests/common/testhelper.h> +#include <tests/common/teststorageapp.h> +#include <vespa/storage/bucketdb/storbucketdb.h> + +bool debug = false; + +namespace storage { +namespace bucketmover { + +struct BucketMoverTest : public CppUnit::TestFixture { +public: + void setUp(); + void tearDown(); + + void testNormalUsage(); + void testMaxPending(); + void testErrorHandling(); + + CPPUNIT_TEST_SUITE(BucketMoverTest); + CPPUNIT_TEST(testNormalUsage); + CPPUNIT_TEST(testMaxPending); + CPPUNIT_TEST(testErrorHandling); + CPPUNIT_TEST_SUITE_END(); + + std::unique_ptr<TestServiceLayerApp> _node; + std::unique_ptr<ServiceLayerComponent> _component; + std::unique_ptr<BucketMover> _bucketMover; + DummyStorageLink* after; + +private: + void addBucket(const document::BucketId& id, uint16_t idealDiff); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(BucketMoverTest); + +void +BucketMoverTest::tearDown() +{ + _node.reset(0); +} + +void +BucketMoverTest::setUp() +{ + try { + _node.reset(new TestServiceLayerApp(DiskCount(4))); + _node->setupDummyPersistence(); + } catch (config::InvalidConfigException& e) { + fprintf(stderr, "%s\n", e.what()); + } + + _component.reset(new ServiceLayerComponent(_node->getComponentRegister(), "foo")); + _bucketMover.reset(new BucketMover("raw:", _node->getComponentRegister())); + after = new DummyStorageLink(); + _bucketMover->push_back(StorageLink::UP(after)); +} + +void +BucketMoverTest::addBucket(const document::BucketId& id, + uint16_t idealDiff) +{ + StorBucketDatabase::WrappedEntry entry( + _component->getBucketDatabase().get( + id, + "", + StorBucketDatabase::CREATE_IF_NONEXISTING)); + + entry->setBucketInfo(api::BucketInfo(1,1,1)); + + uint16_t idealDisk = _component->getIdealPartition(id); + entry->disk = (idealDisk + idealDiff) % _component->getDiskCount(); + entry.write(); +} + +void +BucketMoverTest::testNormalUsage() +{ + for (uint32_t i = 1; i < 4; ++i) { + addBucket(document::BucketId(16, i), 1); + } + for (uint32_t i = 4; i < 6; ++i) { + addBucket(document::BucketId(16, i), 0); + } + + _bucketMover->open(); + _bucketMover->tick(); + + std::vector<api::StorageMessage::SP> msgs = after->getCommandsOnce(); + CPPUNIT_ASSERT_EQUAL( + std::string("BucketDiskMoveCommand(" + "BucketId(0x4000000000000002), source 3, target 2)"), + msgs[0]->toString()); + CPPUNIT_ASSERT_EQUAL( + std::string("BucketDiskMoveCommand(" + "BucketId(0x4000000000000001), source 2, target 1)"), + msgs[1]->toString()); + CPPUNIT_ASSERT_EQUAL( + std::string("BucketDiskMoveCommand(" + "BucketId(0x4000000000000003), source 1, target 0)"), + msgs[2]->toString()); + + for (uint32_t i = 0; i < 2; ++i) { + after->sendUp(std::shared_ptr<api::StorageMessage>( + ((api::StorageCommand*)msgs[i].get())-> + makeReply().release())); + } + + _bucketMover->tick(); + CPPUNIT_ASSERT_EQUAL(0, (int)after->getNumCommands()); + + _bucketMover->finishCurrentRun(); +} + +void +BucketMoverTest::testMaxPending() +{ + for (uint32_t i = 1; i < 100; ++i) { + addBucket(document::BucketId(16, i), 1); + } + for (uint32_t i = 101; i < 200; ++i) { + addBucket(document::BucketId(16, i), 0); + } + + _bucketMover->open(); + _bucketMover->tick(); + + std::vector<api::StorageMessage::SP> msgs = after->getCommandsOnce(); + // 5 is the max pending default config. + CPPUNIT_ASSERT_EQUAL(5, (int)msgs.size()); + + after->sendUp(std::shared_ptr<api::StorageMessage>( + ((api::StorageCommand*)msgs[3].get())-> + makeReply().release())); + + _bucketMover->tick(); + + std::vector<api::StorageMessage::SP> msgs2 = after->getCommandsOnce(); + CPPUNIT_ASSERT_EQUAL(1, (int)msgs2.size()); +} + +void +BucketMoverTest::testErrorHandling() +{ + for (uint32_t i = 1; i < 100; ++i) { + addBucket(document::BucketId(16, i), 1); + } + for (uint32_t i = 101; i < 200; ++i) { + addBucket(document::BucketId(16, i), 0); + } + + _bucketMover->open(); + _bucketMover->tick(); + + std::vector<api::StorageMessage::SP> msgs = after->getCommandsOnce(); + // 5 is the max pending default config. + CPPUNIT_ASSERT_EQUAL(5, (int)msgs.size()); + + BucketDiskMoveCommand& cmd = static_cast<BucketDiskMoveCommand&>(*msgs[0]); + uint32_t targetDisk = cmd.getDstDisk(); + + std::unique_ptr<api::StorageReply> reply(cmd.makeReply().release()); + reply->setResult(api::ReturnCode(api::ReturnCode::INTERNAL_FAILURE, "foobar")); + after->sendUp(std::shared_ptr<api::StorageMessage>(reply.release())); + + for (uint32_t i = 1; i < msgs.size(); ++i) { + after->sendUp(std::shared_ptr<api::StorageMessage>( + ((api::StorageCommand*)msgs[i].get())-> + makeReply().release())); + } + + _bucketMover->tick(); + + std::vector<api::StorageMessage::SP> msgs2 = after->getCommandsOnce(); + CPPUNIT_ASSERT_EQUAL(5, (int)msgs2.size()); + + for (uint32_t i = 0; i < msgs2.size(); ++i) { + BucketDiskMoveCommand& bdm = static_cast<BucketDiskMoveCommand&>(*msgs2[i]); + CPPUNIT_ASSERT(bdm.getDstDisk() != targetDisk); + } +} + +} // bucketmover +} // storage diff --git a/storage/src/tests/bucketmover/htmltabletest.cpp b/storage/src/tests/bucketmover/htmltabletest.cpp new file mode 100644 index 00000000000..98cf68d489a --- /dev/null +++ b/storage/src/tests/bucketmover/htmltabletest.cpp @@ -0,0 +1,100 @@ +// 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/storage/bucketmover/htmltable.h> +#include <tests/common/testhelper.h> + +namespace storage { + +struct HtmlTableTest : public CppUnit::TestFixture { + + void testPercentageColumn(); + void testByteSizeColumn(); + + CPPUNIT_TEST_SUITE(HtmlTableTest); + CPPUNIT_TEST(testPercentageColumn); + CPPUNIT_TEST(testByteSizeColumn); + CPPUNIT_TEST_SUITE_END(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(HtmlTableTest); + +void HtmlTableTest::testPercentageColumn() +{ + // With total hardcoded to 100 + { + HtmlTable table("disk"); + PercentageColumn perc("fillrate", 100); + perc.addColorLimit(70, Column::LIGHT_GREEN); + perc.addColorLimit(85, Column::LIGHT_YELLOW); + perc.addColorLimit(100, Column::LIGHT_RED); + table.addColumn(perc); + table.addRow(0); + table.addRow(1); + table.addRow(2); + perc[0] = 30; + perc[1] = 80; + perc[2] = 100; + std::ostringstream ost; + table.print(ost); + std::string expected( +"<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n" +"<tr><th>disk</th><th>fillrate</th></tr>\n" +"<tr><td>0</td><td bgcolor=\"#a0ffa0\" align=\"right\">30.00 %</td></tr>\n" +"<tr><td>1</td><td bgcolor=\"#ffffa0\" align=\"right\">80.00 %</td></tr>\n" +"<tr><td>2</td><td bgcolor=\"#ffa0a0\" align=\"right\">100.00 %</td></tr>\n" +"</table>\n"); + CPPUNIT_ASSERT_EQUAL(expected, ost.str()); + } + // With automatically gathered total + { + HtmlTable table("disk"); + PercentageColumn perc("fillrate"); + table.addColumn(perc); + table.addRow(0); + table.addRow(1); + table.addRow(2); + perc[0] = 30; + perc[1] = 80; + perc[2] = 100; + std::ostringstream ost; + table.print(ost); + std::string expected( + "<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n" + "<tr><th>disk</th><th>fillrate</th></tr>\n" + "<tr><td>0</td><td align=\"right\">14.29 %</td></tr>\n" + "<tr><td>1</td><td align=\"right\">38.10 %</td></tr>\n" + "<tr><td>2</td><td align=\"right\">47.62 %</td></tr>\n" + "</table>\n"); + CPPUNIT_ASSERT_EQUAL(expected, ost.str()); + } +} + +void HtmlTableTest::testByteSizeColumn() +{ + { + HtmlTable table("disk"); + ByteSizeColumn size("size"); + table.addColumn(size); + table.addRow(0); + table.addRow(1); + table.addRow(2); + // Biggest value enforce the denomination + size[0] = 42123; + size[1] = 124123151; + size[2] = 6131231; + std::ostringstream ost; + table.print(ost); + std::string expected( + "<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n" + "<tr><th>disk</th><th>size</th></tr>\n" + "<tr><td>0</td><td align=\"right\">0 MB</td></tr>\n" + "<tr><td>1</td><td align=\"right\">118 MB</td></tr>\n" + "<tr><td>2</td><td align=\"right\">5 MB</td></tr>\n" + "</table>\n"); + CPPUNIT_ASSERT_EQUAL(expected, ost.str()); + } + +} + +} // storage |