diff --git a/persistent-data/buffer.h b/persistent-data/buffer.h
index 720b4cf..dfa2ab7 100644
--- a/persistent-data/buffer.h
+++ b/persistent-data/buffer.h
@@ -88,7 +88,6 @@ namespace persistent_data {
if (index >= Size)
throw std::runtime_error("buffer index out of bounds");
}
-
};
}
diff --git a/unit-tests/buffer_t.cc b/unit-tests/buffer_t.cc
new file mode 100644
index 0000000..9386761
--- /dev/null
+++ b/unit-tests/buffer_t.cc
@@ -0,0 +1,333 @@
+// Copyright (C) 2013 Red Hat, Inc. All rights reserved.
+//
+// This file is part of the thin-provisioning-tools source.
+//
+// thin-provisioning-tools is free software: you can redistribute it
+// and/or modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation, either version 3 of
+// the License, or (at your option) any later version.
+//
+// thin-provisioning-tools is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with thin-provisioning-tools. If not, see
+// .
+
+#include "persistent-data/buffer.h"
+
+#define BOOST_TEST_MODULE BufferTests
+#include
+
+using namespace persistent_data;
+
+// - Allocate several on the heap, check they have the requested
+// alignment. Try for various Alignments. If memalign has
+// restrictions could you document (eg, power of 2).
+// - you can use the [] to set a value in a non-const instance
+// - you can't use the [] to set a value in a const instance - not
+// sure how to do this, since it'll be a compile time error.
+// - you can use [] to read back a value that you've set.
+// - [] to read works in a const instance.
+// - you can use raw() to get and set values.
+// - an exception is thrown if you put too large an index in []
+// - check you can't copy a buffer via a copy constructor or ==
+// - (again a compile time error, just experiment so you understand
+// - boost::noncopyable).
+
+//----------------------------------------------------------------
+
+namespace {
+ template
+ typename buffer::ptr
+ create_buffer(void) {
+ return typename buffer::ptr(new buffer());
+ }
+}
+
+//----------------------------------------------------------------
+
+BOOST_AUTO_TEST_CASE(buffer_copy)
+{
+ uint32_t const sz = 8, align = 8;
+ buffer::ptr b1 = create_buffer();
+ buffer::ptr b2 = b1;
+
+ BOOST_CHECK(b1);
+ BOOST_CHECK(b2);
+ BOOST_CHECK(b1 == b2);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_8_a_8_raw_access)
+{
+ uint32_t const sz = 8, align = 8;
+ buffer::ptr b = create_buffer();
+ unsigned char *p = b->raw();
+ // unsigned char const *pc = b->raw();
+
+ p[0] = 0;
+ BOOST_CHECK(p[0] == 0);
+ p[0] = 4;
+ BOOST_CHECK(p[0] == 4);
+
+ // pc[0] = 5; // Compile time error accessing read-only location
+}
+
+BOOST_AUTO_TEST_CASE(buffer_8_a_8_access)
+{
+ uint32_t const sz = 8, align = 8;
+ buffer::ptr b = create_buffer();
+
+ // b[0] = 0; // no match for operator [] !
+ // BOOST_CHECK_EQUAL(b[0], '\0');
+}
+
+BOOST_AUTO_TEST_CASE(buffer_8_a_8_const_access)
+{
+ uint32_t const sz = 8, align = 8;
+ buffer::ptr const b = create_buffer();
+
+ // b[0] = 0; // no match for operator [] !
+ // BOOST_CHECK_EQUAL(b[0], '\0');
+}
+
+// 8 byte buffer size, varying alignment from 1 - 7
+BOOST_AUTO_TEST_CASE(buffer_128_a_1_fails)
+{
+ uint32_t const sz = 128, align = 1;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(!b);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_2_succeeds)
+{
+ uint32_t const sz = 128, align = 2;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(b);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_3_fails)
+{
+ uint32_t const sz = 128, align = 3;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(!b);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_4_succeeds)
+{
+ uint32_t const sz = 128, align = 4;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(b);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_5_fails)
+{
+ uint32_t const sz = 128, align = 5;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(!b);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_6_fails)
+{
+ uint32_t const sz = 128, align = 6;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(!b);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_7_fails)
+{
+ uint32_t const sz = 128, align = 7;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK(!b);
+}
+
+// Varying buffer size, alignment 8
+BOOST_AUTO_TEST_CASE(buffer_8_a_8)
+{
+ uint32_t const sz = 8, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_16_a_8)
+{
+ uint32_t const sz = 16, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_32_a_8)
+{
+ uint32_t const sz = 32, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_64_a_8)
+{
+ uint32_t const sz = 64, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_8)
+{
+ uint32_t const sz = 128, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_256_a_8)
+{
+ uint32_t const sz = 256, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_512_a_8)
+{
+ uint32_t const sz = 512, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_1024_a_8)
+{
+ uint32_t const sz = 1024, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_2048_a_8)
+{
+ uint32_t const sz = 2048, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_4096_a_8)
+{
+ uint32_t const sz = 4096, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_8192_a_8)
+{
+ uint32_t const sz = 8192, align = 8;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+
+// Varying buffer size, alignment 16
+BOOST_AUTO_TEST_CASE(buffer_8_a_16)
+{
+ uint32_t const sz = 8, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_16_a_16)
+{
+ uint32_t const sz = 16, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_32_a_16)
+{
+ uint32_t const sz = 32, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_64_a_16)
+{
+ uint32_t const sz = 64, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_128_a_16)
+{
+ uint32_t const sz = 128, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_256_a_16)
+{
+ uint32_t const sz = 256, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_512_a_16)
+{
+ uint32_t const sz = 512, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_1024_a_16)
+{
+ uint32_t const sz = 1024, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_2048_a_16)
+{
+ uint32_t const sz = 2048, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_4096_a_16)
+{
+ uint32_t const sz = 4096, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+BOOST_AUTO_TEST_CASE(buffer_8192_a_16)
+{
+ uint32_t const sz = 8192, align = 16;
+ buffer::ptr b = create_buffer();
+
+ BOOST_CHECK_EQUAL((unsigned long) b->raw() & (align - 1), 0);
+}
+
+
+//----------------------------------------------------------------