From b91516125b36b10f59447fa48149be052b155134 Mon Sep 17 00:00:00 2001 From: Adam Crume Date: Wed, 30 Jul 2014 18:48:46 -0700 Subject: [PATCH] rbd-replay: Add unit tests Signed-off-by: Adam Crume --- src/rbd_replay/Makefile.am | 15 ++++-- src/test/Makefile.am | 11 +++++ src/test/test_rbd_replay.cc | 95 +++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 src/test/test_rbd_replay.cc diff --git a/src/rbd_replay/Makefile.am b/src/rbd_replay/Makefile.am index aff2e9208c32a..aa9be69c52336 100644 --- a/src/rbd_replay/Makefile.am +++ b/src/rbd_replay/Makefile.am @@ -1,14 +1,15 @@ -rbd_replay_SOURCES = rbd_replay/rbd-replay.cc \ - rbd_replay/actions.cc \ +# librbd_replay_la exists only to help with unit tests +librbd_replay_la_SOURCES = rbd_replay/actions.cc \ rbd_replay/Deser.cc \ rbd_replay/ImageNameMap.cc \ rbd_replay/NameMap.cc \ rbd_replay/PendingIO.cc \ rbd_replay/Replayer.cc -rbd_replay_LDADD = $(LIBRBD) \ +librbd_replay_la_LIBADD = $(LIBRBD) \ $(LIBRADOS) \ $(CEPH_GLOBAL) \ -lboost_regex +noinst_LTLIBRARIES += librbd_replay.la noinst_HEADERS += rbd_replay/BoundedBuffer.hpp \ rbd_replay/actions.hpp \ rbd_replay/Deser.hpp \ @@ -17,6 +18,14 @@ noinst_HEADERS += rbd_replay/BoundedBuffer.hpp \ rbd_replay/PendingIO.hpp \ rbd_replay/rbd_replay_debug.hpp \ rbd_replay/Replayer.hpp + +rbd_replay_SOURCES = rbd_replay/rbd-replay.cc +rbd_replay_LDADD = $(LIBRBD) \ + $(LIBRADOS) \ + $(CEPH_GLOBAL) \ + -lboost_regex \ + librbd_replay.la + if LINUX bin_PROGRAMS += rbd-replay endif #LINUX diff --git a/src/test/Makefile.am b/src/test/Makefile.am index e58d556faf808..0a007f23daf8e 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -578,6 +578,17 @@ unittest_on_exit_SOURCES = test/on_exit.cc unittest_on_exit_LDADD = $(PTHREAD_LIBS) check_PROGRAMS += unittest_on_exit +unittest_rbd_replay_SOURCES = test/test_rbd_replay.cc +unittest_rbd_replay_LDADD = $(LIBRBD) \ + $(LIBRADOS) \ + $(CEPH_GLOBAL) \ + -lboost_regex \ + librbd_replay.la \ + $(UNITTEST_LDADD) +unittest_rbd_replay_CXXFLAGS = $(UNITTEST_CXXFLAGS) +check_PROGRAMS += unittest_rbd_replay + + check_SCRIPTS += test/pybind/test_ceph_argparse.py if WITH_RADOSGW diff --git a/src/test/test_rbd_replay.cc b/src/test/test_rbd_replay.cc new file mode 100644 index 0000000000000..fee950037b310 --- /dev/null +++ b/src/test/test_rbd_replay.cc @@ -0,0 +1,95 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2014 Adam Crume + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include "common/escape.h" +#include "gtest/gtest.h" +#include +#include +#include "rbd_replay/Deser.hpp" +#include "rbd_replay/ImageNameMap.hpp" + + +using rbd_replay::ImageNameMap; +using rbd_replay::NameMap; + +std::ostream& operator<<(std::ostream& o, const ImageNameMap::Name& name) { + return o << "('" << name.first << "', '" << name.second << "')"; +} + +static ImageNameMap::Name bad_mapping(ImageNameMap::Name input, std::string output) { + return ImageNameMap::Name("xxx", "xxx"); +} + +static void add_mapping(ImageNameMap *map, std::string mapping_string) { + ImageNameMap::Mapping mapping; + if (!map->parse_mapping(mapping_string, &mapping)) { + ASSERT_TRUE(false) << "Failed to parse mapping string '" << mapping_string << "'"; + } + map->add_mapping(mapping); +} + +static void add_mapping(NameMap *map, std::string mapping_string) { + NameMap::Mapping mapping; + if (!map->parse_mapping(mapping_string, &mapping)) { + ASSERT_TRUE(false) << "Failed to parse mapping string '" << mapping_string << "'"; + } + map->add_mapping(mapping); +} + +TEST(RBDReplay, Deser) { + const char data[] = {1, 2, 3, 4, 0, 0, 0, 5, 'h', 'e', 'l', 'l', 'o', 1, 0}; + const std::string s(data, sizeof(data)); + std::istringstream iss(s); + rbd_replay::Deser deser(iss); + EXPECT_EQ(false, deser.eof()); + EXPECT_EQ(0x01020304u, deser.read_uint32_t()); + EXPECT_EQ(false, deser.eof()); + EXPECT_EQ("hello", deser.read_string()); + EXPECT_EQ(false, deser.eof()); + EXPECT_EQ(true, deser.read_bool()); + EXPECT_EQ(false, deser.eof()); + EXPECT_EQ(false, deser.read_bool()); + EXPECT_EQ(false, deser.eof()); + deser.read_uint8_t(); + EXPECT_EQ(true, deser.eof()); +} + +TEST(RBDReplay, ImageNameMap) { + typedef ImageNameMap::Name Name; + ImageNameMap m; + m.set_bad_mapping_fallback(bad_mapping); + add_mapping(&m, "x/y=y/x"); + add_mapping(&m, "a\\=b/c=h/i"); + add_mapping(&m, "a/b\\=c=j/k"); + add_mapping(&m, "a\\\\/b/c=d/e"); + add_mapping(&m, "a/b\\\\/c=f/g"); + add_mapping(&m, "image/snap_(.*)=image_$1/"); + add_mapping(&m, "bad/=///"); + EXPECT_EQ(Name("y", "x"), m.map(Name("x", "y"))); + EXPECT_EQ(Name("h", "i"), m.map(Name("a=b", "c"))); + EXPECT_EQ(Name("j", "k"), m.map(Name("a", "b=c"))); + EXPECT_EQ(Name("d", "e"), m.map(Name("a/b", "c"))); + EXPECT_EQ(Name("f", "g"), m.map(Name("a", "b/c"))); + EXPECT_EQ(Name("image_1", ""), m.map(Name("image", "snap_1"))); + EXPECT_EQ(Name("xxx", "xxx"), m.map(Name("bad", ""))); +} + +TEST(RBDReplay, NameMap) { + NameMap m; + add_mapping(&m, "x=y"); + add_mapping(&m, "image_(.*)=$1_image"); + EXPECT_EQ("y", m.map("x")); + EXPECT_EQ("ab_image", m.map("image_ab")); + EXPECT_EQ("asdf", m.map("asdf")); +} -- 2.39.5