]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/denc: Add check for compat
authorAdam Kupczyk <akupczyk@ibm.com>
Tue, 21 May 2024 09:02:25 +0000 (09:02 +0000)
committerAdam Kupczyk <akupczyk@ibm.com>
Tue, 21 May 2024 09:02:25 +0000 (09:02 +0000)
Add unittest that checks if code throws exception if decoder is outside compat range.

Signed-off-by: Adam Kupczyk <akupczyk@ibm.com>
src/test/test_denc.cc

index 0aae8dbbcc418b3b151c43b8433226feb2c5822d..46dfe67e9eeef968441d96080e6480127e56e2f2 100644 (file)
@@ -352,23 +352,37 @@ struct foo_t {
 };
 WRITE_CLASS_DENC_BOUNDED(foo_t)
 
-struct foo2_t {
-  int32_t c = 0;
-  uint64_t d = 123;
+struct foo2_accept1_t {
+  int32_t a = 0;
+  uint64_t b = 123;
+  int32_t c = -1; // uninitialized for v1
 
-  DENC(foo2_t, v, p) {
-    DENC_START(1, 1, p);
-    ::denc(v.c, p);
-    ::denc(v.d, p);
+  DENC(foo2_accept1_t, v, p) {
+    DENC_START(2, 1, p);
+    ::denc(v.a, p);
+    ::denc(v.b, p);
+    if (struct_v >= 2) {
+      ::denc(v.c, p);
+    }
     DENC_FINISH(p);
   }
+};
+WRITE_CLASS_DENC_BOUNDED(foo2_accept1_t)
 
-  friend bool operator==(const foo2_t& l, const foo2_t& r) {
-    return l.c == r.c && l.d == r.d;
+struct foo2_only2_t {
+  int32_t a = 0;
+  uint64_t b = 123;
+  uint32_t c = 55;
+
+  DENC(foo2_only2_t, v, p) {
+    DENC_START(2, 2, p);
+    ::denc(v.a, p);
+    ::denc(v.b, p);
+    ::denc(v.c, p);
+    DENC_FINISH(p);
   }
 };
-WRITE_CLASS_DENC_BOUNDED(foo2_t)
-
+WRITE_CLASS_DENC_BOUNDED(foo2_only2_t)
 
 struct bar_t {
   int32_t a = 0;
@@ -741,3 +755,42 @@ TEST(denc, no_copy_if_segmented_and_lengthy)
     ASSERT_EQ(CEPH_PAGE_SIZE * 2, Legacy::n_decode);
   }
 }
+
+TEST(denc, compat_allows)
+{
+  foo_t v1;
+  v1.a = 5001; v1.b = 6002;
+  size_t s = 0;
+  denc(v1, s);
+  bufferlist bl;
+  {
+    auto app = bl.get_contiguous_appender(s);
+    denc(v1, app);
+  }
+
+  foo2_accept1_t v2;
+  v2.a = 111; v2.b = 111; v2.c = 111;
+  auto bpi = bl.front().begin();
+  denc(v2, bpi);
+  ASSERT_EQ(v1.a, v2.a);
+  ASSERT_EQ(v1.b, v2.b);
+  ASSERT_EQ(111, v2.c);
+}
+
+TEST(denc, compat_disallows)
+{
+  foo2_only2_t v2;
+  v2.a = 5001; v2.b = 6002; v2.c = 7003;
+  size_t s = 0;
+  denc(v2, s);
+  bufferlist bl;
+  {
+    auto app = bl.get_contiguous_appender(s);
+    denc(v2, app);
+  }
+
+  foo_t v1;
+  v1.a = 111; v1.b = 111;
+  auto bpi = bl.front().begin();
+  ASSERT_ANY_THROW(denc(v1,bpi));
+}