You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2016/05/11 20:31:31 UTC
[trafficserver] 07/33: TS-4425: Add tests for Ptr.
This is an automated email from the ASF dual-hosted git repository.
jpeach pushed a commit to branch master
in repository https://git-dual.apache.org/repos/asf/trafficserver.git
commit 2a47b9fa42823d3fa01b147297da850602dc5d2a
Author: James Peach <jp...@apache.org>
AuthorDate: Sat May 7 14:24:12 2016 -0700
TS-4425: Add tests for Ptr<T>.
---
lib/ts/Makefile.am | 7 +++-
lib/ts/test_Ptr.cc | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/lib/ts/Makefile.am b/lib/ts/Makefile.am
index cb0e076..da6d149 100644
--- a/lib/ts/Makefile.am
+++ b/lib/ts/Makefile.am
@@ -21,7 +21,8 @@ library_includedir=$(includedir)/ts
library_include_HEADERS = apidefs.h
noinst_PROGRAMS = mkdfa CompileParseRules
-check_PROGRAMS = test_arena test_atomic test_freelist test_geometry test_List test_Map test_Regex test_PriorityQueue test_Vec test_X509HostnameValidator
+check_PROGRAMS = test_arena test_atomic test_freelist test_geometry test_List test_Map test_Regex test_PriorityQueue test_Vec test_X509HostnameValidator test_Ptr
+
TESTS = $(check_PROGRAMS)
AM_CPPFLAGS = -I$(top_srcdir)/lib
@@ -235,6 +236,10 @@ test_X509HostnameValidator_SOURCES = test_X509HostnameValidator.cc
test_X509HostnameValidator_LDADD = libtsutil.la @LIBTCL@ @LIBPCRE@ @OPENSSL_LIBS@
test_X509HostnameValidator_LDFLAGS = @EXTRA_CXX_LDFLAGS@ @LIBTOOL_LINK_FLAGS@
+test_Ptr_SOURCES = test_Ptr.cc
+test_Ptr_LDADD = libtsutil.la @LIBTCL@ @LIBPCRE@
+test_Ptr_LDFLAGS = @EXTRA_CXX_LDFLAGS@ @LIBTOOL_LINK_FLAGS@
+
CompileParseRules_SOURCES = CompileParseRules.cc
test:: $(TESTS)
diff --git a/lib/ts/test_Ptr.cc b/lib/ts/test_Ptr.cc
new file mode 100644
index 0000000..3f7f826
--- /dev/null
+++ b/lib/ts/test_Ptr.cc
@@ -0,0 +1,93 @@
+/*
+
+ @section license License
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include "ts/Ptr.h"
+#include "ts/TestBox.h"
+
+struct PtrObject : RefCountObj {
+ PtrObject(unsigned *_c) : count(_c) { ++(*count); }
+ ~PtrObject() { --(*count); }
+ unsigned *count;
+};
+
+REGRESSION_TEST(Ptr_detach)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
+{
+ TestBox box(t, pstatus);
+ box = REGRESSION_TEST_PASSED;
+ unsigned alive = 0;
+
+ Ptr<PtrObject> p1 = make_ptr(new PtrObject(&alive));
+ PtrObject *p2 = p1.detach();
+
+ box.check(p1.get() == NULL, "Ptr<T>::detach NULLs the stored pointer");
+ box.check(p2->refcount() == 1, "Ptr<T>::detach preserves the refcount");
+
+ // Note that there's no symmetric reattach.
+ p1 = p2;
+ box.check(p2->refcount() == 2, "reattaching increments the refcount again");
+ p1->refcount_dec();
+}
+
+REGRESSION_TEST(Ptr_clear)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
+{
+ TestBox box(t, pstatus);
+ box = REGRESSION_TEST_PASSED;
+ unsigned alive = 0;
+
+ Ptr<PtrObject> p1 = make_ptr(new PtrObject(&alive));
+ box.check(alive == 1, "we have a live object");
+ p1.clear();
+ box.check(p1.get() == NULL, "Ptr<T>::clear NULLs the pointer");
+ box.check(alive == 0, "Ptr<T>::clear drops the refcount");
+
+ p1 = make_ptr(new PtrObject(&alive));
+ box.check(alive == 1, "we have a live object");
+ p1 = 0;
+ box.check(alive == 0, "assigning NULL drops the refcount");
+}
+
+REGRESSION_TEST(Ptr_refcount)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
+{
+ TestBox box(t, pstatus);
+ box = REGRESSION_TEST_PASSED;
+ unsigned alive = 0;
+
+ {
+ Ptr<PtrObject> p1 = make_ptr(new PtrObject(&alive));
+
+ box.check(p1->refcount() == 1, "initial refcount is 1");
+
+ Ptr<PtrObject> p2(p1);
+ box.check(p1->refcount() == 2, "initial refcount is 1");
+
+ Ptr<PtrObject> p3 = p1;
+ }
+
+ // Everything goes out of scope, so the refcounts should drop to zero.
+ box.check(alive == 0, "refcounts dropped");
+}
+
+int
+main(int /* argc ATS_UNUSED */, char ** /* argv ATS_UNUSED */)
+{
+ RegressionTest::run();
+ return RegressionTest::final_status == REGRESSION_TEST_PASSED ? 0 : 1;
+}
--
To stop receiving notification emails like this one, please contact
"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>.