This is an automated email from the ASF dual-hosted git repository. jamesge pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-brpc.git
The following commit(s) were added to refs/heads/master by this push: new 11949fc Fix #955 and add UT 11949fc is described below commit 11949fc1cb60a96f891205853162e8f7b0f1ff87 Author: jamesge <jge...@gmail.com> AuthorDate: Sun Nov 3 20:02:17 2019 -0800 Fix #955 and add UT --- src/butil/containers/bounded_queue.h | 12 ++-- test/BUILD | 1 + test/CMakeLists.txt | 1 + test/Makefile | 1 + test/bounded_queue_unittest.cc | 106 +++++++++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+), 5 deletions(-) diff --git a/src/butil/containers/bounded_queue.h b/src/butil/containers/bounded_queue.h index 556d70b..fb688ca 100644 --- a/src/butil/containers/bounded_queue.h +++ b/src/butil/containers/bounded_queue.h @@ -168,8 +168,9 @@ public: bool pop(T* item) { if (_count) { --_count; - *item = ((T*)_items)[_start]; - ((T*)_items)[_start].~T(); + T* const p = (T*)_items + _start; + *item = *p; + p->~T(); _start = _mod(_start + 1, _cap); return true; } @@ -181,7 +182,7 @@ public: bool pop_bottom() { if (_count) { --_count; - ((T*)_items + _start + _count)->~T(); + ((T*)_items + _mod(_start + _count, _cap))->~T(); return true; } return false; @@ -192,8 +193,9 @@ public: bool pop_bottom(T* item) { if (_count) { --_count; - *item = ((T*)_items)[_start + _count]; - ((T*)_items)[_start + _count].~T(); + T* const p = (T*)_items + _mod(_start + _count, _cap); + *item = *p; + p->~T(); return true; } return false; diff --git a/test/BUILD b/test/BUILD index 88ccafe..71206da 100644 --- a/test/BUILD +++ b/test/BUILD @@ -155,6 +155,7 @@ TEST_BUTIL_SOURCES = [ "scoped_locale.cc", "recordio_unittest.cpp", #"popen_unittest.cpp", + "bounded_queue_unittest.cc", "butil_unittest_main.cpp", ] + select({ "@bazel_tools//tools/osx:darwin": [], diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f61b715..f3642de 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -76,6 +76,7 @@ file(COPY ${PROJECT_SOURCE_DIR}/test/run_tests.sh DESTINATION ${CMAKE_CURRENT_BI SET(TEST_BUTIL_SOURCES ${PROJECT_SOURCE_DIR}/test/recordio_unittest.cpp ${PROJECT_SOURCE_DIR}/test/popen_unittest.cpp + ${PROJECT_SOURCE_DIR}/test/bounded_queue_unittest.cc ${PROJECT_SOURCE_DIR}/test/at_exit_unittest.cc ${PROJECT_SOURCE_DIR}/test/atomicops_unittest.cc ${PROJECT_SOURCE_DIR}/test/base64_unittest.cc diff --git a/test/Makefile b/test/Makefile index 27c97c4..ad7fff1 100644 --- a/test/Makefile +++ b/test/Makefile @@ -140,6 +140,7 @@ TEST_BUTIL_SOURCES = \ test_switches.cc \ scoped_locale.cc \ popen_unittest.cpp \ + bounded_queue_unittest.cc \ butil_unittest_main.cpp ifeq ($(SYSTEM), Linux) diff --git a/test/bounded_queue_unittest.cc b/test/bounded_queue_unittest.cc new file mode 100644 index 0000000..6e1bc45 --- /dev/null +++ b/test/bounded_queue_unittest.cc @@ -0,0 +1,106 @@ +// 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. + +// Author: Ge,Jun (ge...@baidu.com) +// Date: Sun Nov 3 19:16:50 PST 2019 + +#include <iostream> +#include "butil/containers/bounded_queue.h" +#include <gtest/gtest.h> + +namespace { + +TEST(BoundedQueueTest, sanity) { + const int N = 36; + char storage[N * sizeof(int)]; + butil::BoundedQueue<int> q(storage, sizeof(storage), butil::NOT_OWN_STORAGE); + ASSERT_EQ(0ul, q.size()); + ASSERT_TRUE(q.empty()); + ASSERT_TRUE(NULL == q.top()); + ASSERT_TRUE(NULL == q.bottom()); + for (int i = 1; i <= N; ++i) { + if (i % 2 == 0) { + ASSERT_TRUE(q.push(i)); + } else { + int* p = q.push(); + ASSERT_TRUE(p); + *p = i; + } + ASSERT_EQ((size_t)i, q.size()); + ASSERT_EQ(1, *q.top()); + ASSERT_EQ(i, *q.bottom()); + } + ASSERT_FALSE(q.push(N+1)); + ASSERT_FALSE(q.push_top(N+1)); + ASSERT_EQ((size_t)N, q.size()); + ASSERT_FALSE(q.empty()); + ASSERT_TRUE(q.full()); + + for (int i = 1; i <= N; ++i) { + ASSERT_EQ(i, *q.top()); + ASSERT_EQ(N, *q.bottom()); + if (i % 2 == 0) { + int tmp = 0; + ASSERT_TRUE(q.pop(&tmp)); + ASSERT_EQ(tmp, i); + } else { + ASSERT_TRUE(q.pop()); + } + ASSERT_EQ((size_t)(N-i), q.size()); + } + ASSERT_EQ(0ul, q.size()); + ASSERT_TRUE(q.empty()); + ASSERT_FALSE(q.full()); + ASSERT_FALSE(q.pop()); + + for (int i = 1; i <= N; ++i) { + if (i % 2 == 0) { + ASSERT_TRUE(q.push_top(i)); + } else { + int* p = q.push_top(); + ASSERT_TRUE(p); + *p = i; + } + ASSERT_EQ((size_t)i, q.size()); + ASSERT_EQ(i, *q.top()); + ASSERT_EQ(1, *q.bottom()); + } + ASSERT_FALSE(q.push(N+1)); + ASSERT_FALSE(q.push_top(N+1)); + ASSERT_EQ((size_t)N, q.size()); + ASSERT_FALSE(q.empty()); + ASSERT_TRUE(q.full()); + + for (int i = 1; i <= N; ++i) { + ASSERT_EQ(N, *q.top()); + ASSERT_EQ(i, *q.bottom()); + if (i % 2 == 0) { + int tmp = 0; + ASSERT_TRUE(q.pop_bottom(&tmp)); + ASSERT_EQ(tmp, i); + } else { + ASSERT_TRUE(q.pop_bottom()); + } + ASSERT_EQ((size_t)(N-i), q.size()); + } + ASSERT_EQ(0ul, q.size()); + ASSERT_TRUE(q.empty()); + ASSERT_FALSE(q.full()); + ASSERT_FALSE(q.pop()); +} + +} // anonymous namespace --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org For additional commands, e-mail: dev-h...@brpc.apache.org