aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/memory
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /vespalib/src/tests/memory
Publish
Diffstat (limited to 'vespalib/src/tests/memory')
-rw-r--r--vespalib/src/tests/memory/.gitignore4
-rw-r--r--vespalib/src/tests/memory/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/memory/DESC1
-rw-r--r--vespalib/src/tests/memory/FILES1
-rw-r--r--vespalib/src/tests/memory/memory_test.cpp164
5 files changed, 178 insertions, 0 deletions
diff --git a/vespalib/src/tests/memory/.gitignore b/vespalib/src/tests/memory/.gitignore
new file mode 100644
index 00000000000..99f0954792a
--- /dev/null
+++ b/vespalib/src/tests/memory/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+memory_test
+vespalib_memory_test_app
diff --git a/vespalib/src/tests/memory/CMakeLists.txt b/vespalib/src/tests/memory/CMakeLists.txt
new file mode 100644
index 00000000000..f2521f000f0
--- /dev/null
+++ b/vespalib/src/tests/memory/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_memory_test_app
+ SOURCES
+ memory_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_memory_test_app COMMAND vespalib_memory_test_app)
diff --git a/vespalib/src/tests/memory/DESC b/vespalib/src/tests/memory/DESC
new file mode 100644
index 00000000000..1fc0b7c745d
--- /dev/null
+++ b/vespalib/src/tests/memory/DESC
@@ -0,0 +1 @@
+memory test. Take a look at memory.cpp for details.
diff --git a/vespalib/src/tests/memory/FILES b/vespalib/src/tests/memory/FILES
new file mode 100644
index 00000000000..16422d07c7b
--- /dev/null
+++ b/vespalib/src/tests/memory/FILES
@@ -0,0 +1 @@
+memory.cpp
diff --git a/vespalib/src/tests/memory/memory_test.cpp b/vespalib/src/tests/memory/memory_test.cpp
new file mode 100644
index 00000000000..c9b0634f3bc
--- /dev/null
+++ b/vespalib/src/tests/memory/memory_test.cpp
@@ -0,0 +1,164 @@
+// 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/log/log.h>
+LOG_SETUP("memory_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/memory.h>
+
+using namespace vespalib;
+
+class B
+{
+public:
+ virtual ~B() { }
+ virtual B * clone() const { return new B(*this); }
+};
+
+class A : public B
+{
+public:
+ virtual ~A() { }
+ virtual A * clone() const { return new A(*this); }
+};
+
+class Test : public TestApp
+{
+public:
+ int Main();
+};
+
+B* fn(auto_arr<B> param) { return param.get(); }
+auto_arr<B> fn(B *param) { auto_arr<B> bb(param); return bb; }
+
+int
+Test::Main()
+{
+ TEST_INIT("memory_test");
+ {
+ B* p = new B[5];
+ auto_arr<B> apb(p);
+ EXPECT_TRUE(apb.get() == p);
+ EXPECT_TRUE(fn(apb) == p);
+ EXPECT_TRUE(apb.get() == nullptr);
+ }
+ {
+ A* p = new A[5];
+ auto_arr<A> apa(p);
+ EXPECT_TRUE(apa.get() == p);
+ auto_arr<A> apb = apa;
+ EXPECT_TRUE(apa.get() == nullptr);
+ EXPECT_TRUE(apb.get() == p);
+ A& ref = apb[2];
+ EXPECT_TRUE(&ref == (p+2));
+ }
+ {
+ B* p = new B[5];
+ auto_arr<B> apb = fn(p);
+ EXPECT_TRUE(apb.get() == p);
+ }
+ {
+ MallocAutoPtr a(malloc(30));
+ EXPECT_TRUE(a.get() != nullptr);
+ void * tmp = a.get();
+ MallocAutoPtr b(a);
+ EXPECT_TRUE(tmp == b.get());
+ EXPECT_TRUE(a.get() == nullptr);
+ MallocAutoPtr c;
+ c = b;
+ EXPECT_TRUE(b.get() == nullptr);
+ EXPECT_TRUE(tmp == c.get());
+ MallocAutoPtr d(malloc(30));
+ EXPECT_TRUE(d.get() != nullptr);
+ tmp = c.get();
+ d = c;
+ EXPECT_TRUE(tmp == d.get());
+ EXPECT_TRUE(c.get() == nullptr);
+ }
+ {
+
+ MallocPtr a(100);
+ EXPECT_TRUE(a.size() == 100);
+ EXPECT_TRUE(a.get() != nullptr);
+ memset(a.get(), 17, a.size());
+ MallocPtr b(a);
+ EXPECT_TRUE(a.size() == 100);
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(b.size() == 100);
+ EXPECT_TRUE(b.get() != nullptr);
+ EXPECT_TRUE(a.get() != b.get());
+ EXPECT_TRUE(memcmp(a.get(), b.get(), a.size()) == 0);
+ void * tmp = a.get();
+ a = b;
+ EXPECT_TRUE(a.size() == 100);
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(a.get() != tmp);
+ EXPECT_TRUE(memcmp(a.get(), b.get(), a.size()) == 0);
+ MallocPtr d = std::move(b);
+ EXPECT_TRUE(d.size() == 100);
+ EXPECT_TRUE(d.get() != nullptr);
+ EXPECT_TRUE(b.size() == 0);
+ EXPECT_TRUE(b.get() == nullptr);
+ MallocPtr c;
+ c.realloc(89);
+ EXPECT_EQUAL(c.size(), 89u);
+ c.realloc(0);
+ EXPECT_EQUAL(c.size(), 0u);
+ EXPECT_TRUE(c == nullptr);
+
+ }
+ {
+ CloneablePtr<B> a(new A());
+ EXPECT_TRUE(a.get() != nullptr);
+ CloneablePtr<B> b(a);
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(b.get() != nullptr);
+ EXPECT_TRUE(b.get() != a.get());
+ CloneablePtr<B> c;
+ c = a;
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(c.get() != nullptr);
+ EXPECT_TRUE(c.get() != a.get());
+
+ b = CloneablePtr<B>(new B());
+ EXPECT_TRUE(dynamic_cast<B*>(b.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(b.get()) == nullptr);
+ EXPECT_TRUE(dynamic_cast<B*>(a.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(a.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<B*>(c.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(c.get()) != nullptr);
+ c = b;
+ EXPECT_TRUE(dynamic_cast<B*>(c.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(c.get()) == nullptr);
+ }
+ {
+ CloneablePtr<B> null;
+ if (null) {
+ EXPECT_TRUE(false);
+ } else {
+ EXPECT_FALSE(bool(null));
+ EXPECT_TRUE(!null);
+ }
+ }
+ {
+ CloneablePtr<B> notNull(new A());
+ if (notNull) {
+ EXPECT_TRUE(bool(notNull));
+ EXPECT_FALSE(!notNull);
+ } else {
+ EXPECT_TRUE(false);
+ }
+ }
+ {
+ int a[3];
+ int b[4] = {0,1,2,3};
+ int c[4] = {0,1,2};
+ int d[] = {0,1,2,3,4};
+ EXPECT_EQUAL(VESPA_NELEMS(a), 3u);
+ EXPECT_EQUAL(VESPA_NELEMS(b), 4u);
+ EXPECT_EQUAL(VESPA_NELEMS(c), 4u);
+ EXPECT_EQUAL(VESPA_NELEMS(d), 5u);
+ }
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)