aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/cpp/thread_manager
diff options
context:
space:
mode:
authorGravatar Sree Kuchibhotla <sreek@google.com>2016-10-19 17:02:16 -0700
committerGravatar Sree Kuchibhotla <sreek@google.com>2016-10-19 17:02:16 -0700
commit920ed0c4187761b55d081e1eed7eb7fbbbe6e757 (patch)
treed0470d6517df907235c0727436eba89794d9ce12 /test/cpp/thread_manager
parentda069a506d927f81fb4e69cd518e934796cd3081 (diff)
Modify Thread manager test
Diffstat (limited to 'test/cpp/thread_manager')
-rw-r--r--test/cpp/thread_manager/thread_manager_test.cc102
-rw-r--r--test/cpp/thread_manager/thread_manager_test.h58
2 files changed, 66 insertions, 94 deletions
diff --git a/test/cpp/thread_manager/thread_manager_test.cc b/test/cpp/thread_manager/thread_manager_test.cc
index 9265c2921a..326e30e895 100644
--- a/test/cpp/thread_manager/thread_manager_test.cc
+++ b/test/cpp/thread_manager/thread_manager_test.cc
@@ -31,7 +31,7 @@
*is % allowed in string
*/
-#include <chrono>
+#include <atomic>
#include <memory>
#include <string>
@@ -39,63 +39,93 @@
#include <grpc++/grpc++.h>
#include <grpc/support/log.h>
-#include "test/cpp/thread_manager/thread_manager_test.h"
#include "test/cpp/util/test_config.h"
-using grpc::testing::ThreadManagerTest;
+class ThreadManagerTest GRPC_FINAL : public grpc::ThreadManager {
+ public:
+ ThreadManagerTest()
+ : ThreadManager(kMinPollers, kMaxPollers),
+ num_do_work_(0),
+ num_poll_for_work_(0),
+ num_work_found_(0) {}
-static const int kMinPollers = 2;
-static const int kMaxPollers = 10;
+ grpc::ThreadManager::WorkStatus PollForWork(void **tag,
+ bool *ok) GRPC_OVERRIDE;
+ void DoWork(void *tag, bool ok) GRPC_OVERRIDE;
+ void PerformTest();
-static const int kPollingTimeoutMsec = 10;
-static const int kDoWorkDurationMsec = 1;
+ private:
+ void SleepForMs(int sleep_time_ms);
-static const int kNumDoWorkIterations = 10;
+ static const int kMinPollers = 2;
+ static const int kMaxPollers = 10;
+
+ static const int kPollingTimeoutMsec = 10;
+ static const int kDoWorkDurationMsec = 1;
+
+ // PollForWork will return SHUTDOWN after these many number of invocations
+ static const int kMaxNumPollForWork = 50;
+
+ std::atomic_int num_do_work_; // Number of calls to DoWork
+ std::atomic_int num_poll_for_work_; // Number of calls to PollForWork
+ std::atomic_int num_work_found_; // Number of times WORK_FOUND was returned
+};
+
+void ThreadManagerTest::SleepForMs(int duration_ms) {
+ gpr_timespec sleep_time =
+ gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+ gpr_time_from_millis(duration_ms, GPR_TIMESPAN));
+ gpr_sleep_until(sleep_time);
+}
grpc::ThreadManager::WorkStatus ThreadManagerTest::PollForWork(void **tag,
bool *ok) {
- {
- std::unique_lock<grpc::mutex> lock(mu_);
- gpr_log(GPR_INFO, "PollForWork: Entered");
+ int call_num = num_poll_for_work_.fetch_add(1);
+
+ if (call_num >= kMaxNumPollForWork) {
+ ThreadManager::Shutdown();
+ return SHUTDOWN;
}
- WorkStatus work_status = WORK_FOUND;
+ // Simulate "polling for work" by sleeping for sometime
+ SleepForMs(kPollingTimeoutMsec);
+
*tag = nullptr;
*ok = true;
- // Simulate "polling for work" by sleeping for sometime
- std::this_thread::sleep_for(std::chrono::milliseconds(kPollingTimeoutMsec));
-
- {
- std::unique_lock<grpc::mutex> lock(mu_);
- num_calls_++;
- if (num_calls_ > kNumDoWorkIterations) {
- gpr_log(GPR_DEBUG, "PollForWork: Returning shutdown");
- work_status = SHUTDOWN;
- ThreadManager::Shutdown();
- }
+ // Return timeout roughly 1 out of every 3 calls
+ if (call_num % 3 == 0) {
+ return TIMEOUT;
+ } else {
+ num_work_found_++;
+ return WORK_FOUND;
}
-
- return work_status;
}
void ThreadManagerTest::DoWork(void *tag, bool ok) {
- {
- std::unique_lock<grpc::mutex> lock(mu_);
- gpr_log(GPR_DEBUG, "DoWork()");
- }
+ num_do_work_++;
+ SleepForMs(kDoWorkDurationMsec); // Simulate doing work by sleeping
+}
- gpr_timespec sleep_time =
- gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
- gpr_time_from_millis(kDoWorkDurationMsec, GPR_TIMESPAN));
- gpr_sleep_until(sleep_time);
+void ThreadManagerTest::PerformTest() {
+ // Initialize() starts the ThreadManager
+ ThreadManager::Initialize();
+
+ // Wait for all the threads to gracefully terminate
+ ThreadManager::Wait();
+
+ // The number of times DoWork() was called is equal to the number of times
+ // WORK_FOUND was returned
+ gpr_log(GPR_DEBUG, "DoWork() called %d times", num_do_work_.load());
+ GPR_ASSERT(num_do_work_ == num_work_found_);
}
int main(int argc, char **argv) {
+ std::srand(std::time(NULL));
+
grpc::testing::InitTest(&argc, &argv, true);
- ThreadManagerTest test_rpc_manager(kMinPollers, kMaxPollers);
- test_rpc_manager.Initialize();
- test_rpc_manager.Wait();
+ ThreadManagerTest test_rpc_manager;
+ test_rpc_manager.PerformTest();
return 0;
}
diff --git a/test/cpp/thread_manager/thread_manager_test.h b/test/cpp/thread_manager/thread_manager_test.h
deleted file mode 100644
index 176448243b..0000000000
--- a/test/cpp/thread_manager/thread_manager_test.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *
- * Copyright 2016, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *is % allowed in string
- */
-#ifndef GRPC_TEST_CPP_THREAD_MANAGER_TEST_H
-#define GRPC_TEST_CPP_THREAD_MANAGER_TEST_H
-
-#include "src/cpp/thread_manager/thread_manager.h"
-
-namespace grpc {
-namespace testing {
-
-class ThreadManagerTest GRPC_FINAL : public ThreadManager {
- public:
- ThreadManagerTest(int min_pollers, int max_pollers)
- : ThreadManager(min_pollers, max_pollers), num_calls_(0){};
-
- grpc::ThreadManager::WorkStatus PollForWork(void **tag,
- bool *ok) GRPC_OVERRIDE;
- void DoWork(void *tag, bool ok) GRPC_OVERRIDE;
-
- private:
- grpc::mutex mu_;
- int num_calls_;
-};
-
-} // namespace testing
-} // namespace grpc
-
-#endif // GRPC_TEST_CPP_THREAD_MANAGER_TEST_H