]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-replay: Add unit tests
authorAdam Crume <adamcrume@gmail.com>
Thu, 31 Jul 2014 01:48:46 +0000 (18:48 -0700)
committerSage Weil <sage@redhat.com>
Thu, 21 Aug 2014 17:57:31 +0000 (10:57 -0700)
Signed-off-by: Adam Crume <adamcrume@gmail.com>
src/rbd_replay/Makefile.am
src/test/Makefile.am
src/test/test_rbd_replay.cc [new file with mode: 0644]

index aff2e9208c32a9fcad0539fb9eb18b4672b8f525..aa9be69c523362d629a092dc56a47890dda113d0 100644 (file)
@@ -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
index 58d3a42669de9d6a9557f4a594d0731a3c324942..e534936d91179fe4ec88f143e62743a2c573f4de 100644 (file)
@@ -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 (file)
index 0000000..fee9500
--- /dev/null
@@ -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 <adamcrume@gmail.com>
+ *
+ * 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 <stdint.h>
+#include <boost/foreach.hpp>
+#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"));
+}