/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #define USING_LOG_PREFIX SHARE #include "gtest/gtest.h" #include "lib/thread/ob_async_task_queue.h" namespace oceanbase { using namespace common; namespace share { class ObFakeTask : public ObAsyncTask { public: ObFakeTask(const bool copy_success, const bool process_success) : copy_success_(copy_success), process_success_(process_success) {} virtual int process() { return process_success_ ? OB_SUCCESS : OB_ERROR; } int64_t get_deep_copy_size() const { return sizeof(ObFakeTask); } ObAsyncTask *deep_copy(char *buf, const int64_t buf_size) const; protected: bool copy_success_; bool process_success_; }; ObAsyncTask *ObFakeTask::deep_copy(char *buf, const int64_t buf_size) const { UNUSED(buf_size); ObAsyncTask *task = NULL; if (copy_success_) { task = new (buf)ObFakeTask(copy_success_, process_success_); memcpy(task, this, sizeof(*this)); } return task; } TEST(TestAsyncTaskQueue, init) { ObAsyncTaskQueue queue; ASSERT_EQ(OB_INVALID_ARGUMENT, queue.init(0, 0)); ASSERT_EQ(OB_INVALID_ARGUMENT, queue.init(1, 0)); ASSERT_EQ(OB_INVALID_ARGUMENT, queue.init(1, 7)); ASSERT_EQ(OB_SUCCESS, queue.init(1, 1024)); ASSERT_EQ(OB_INIT_TWICE, queue.init(2, 1024)); queue.destroy(); } TEST(TestAsyncTaskQueue, push) { ObAsyncTaskQueue queue; ASSERT_EQ(OB_SUCCESS, queue.init(2, 1024)); ObFakeTask fail_task(false, true); ASSERT_EQ(OB_ERR_UNEXPECTED, queue.push(fail_task)); ObFakeTask success_task(true, true); ASSERT_EQ(OB_SUCCESS, queue.push(success_task)); queue.destroy(); } TEST(TestAsyncTaskQueue, run) { ObAsyncTaskQueue queue; ASSERT_EQ(OB_SUCCESS, queue.init(2, 1024)); ObFakeTask task(true, true); for (int i = 0; i < 10; ++i) { ASSERT_EQ(OB_SUCCESS, queue.push(task)); } ObFakeTask fail_task(true, false); fail_task.set_retry_times(3); ASSERT_EQ(OB_SUCCESS, queue.push(fail_task)); usleep(6 * static_cast(fail_task.get_retry_interval())); queue.destroy(); } }//end namespace share }//end namespace oceanbase int main(int argc, char **argv) { oceanbase::common::ObLogger::get_logger().set_log_level("INFO"); ::testing::InitGoogleTest(&argc,argv); return RUN_ALL_TESTS(); }