Use task queue factory factory as parameter for TaskQueueTest

The new parameter simplify TaskQueueFactory lifetime and
allows insertion of per TestCase state

Bug: webrtc:10191
Change-Id: If4948df2756580957052b2b333b5c12cf4914d55
Reviewed-on: https://webrtc-review.googlesource.com/c/121648
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26583}
diff --git a/api/task_queue/task_queue_test.cc b/api/task_queue/task_queue_test.cc
index ca7aee9..b6f04cd 100644
--- a/api/task_queue/task_queue_test.cc
+++ b/api/task_queue/task_queue_test.cc
@@ -19,20 +19,22 @@
 namespace {
 
 std::unique_ptr<TaskQueueBase, TaskQueueDeleter> CreateTaskQueue(
-    TaskQueueFactory* factory,
+    const std::unique_ptr<webrtc::TaskQueueFactory>& factory,
     absl::string_view task_queue_name,
     TaskQueueFactory::Priority priority = TaskQueueFactory::Priority::NORMAL) {
   return factory->CreateTaskQueue(task_queue_name, priority);
 }
 
 TEST_P(TaskQueueTest, Construct) {
-  auto queue = CreateTaskQueue(GetParam(), "Construct");
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  auto queue = CreateTaskQueue(factory, "Construct");
   EXPECT_FALSE(queue->IsCurrent());
 }
 
 TEST_P(TaskQueueTest, PostAndCheckCurrent) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event event;
-  auto queue = CreateTaskQueue(GetParam(), "PostAndCheckCurrent");
+  auto queue = CreateTaskQueue(factory, "PostAndCheckCurrent");
 
   // We're not running a task, so there shouldn't be a current queue.
   EXPECT_FALSE(queue->IsCurrent());
@@ -46,8 +48,9 @@
 }
 
 TEST_P(TaskQueueTest, PostCustomTask) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event ran;
-  auto queue = CreateTaskQueue(GetParam(), "PostCustomImplementation");
+  auto queue = CreateTaskQueue(factory, "PostCustomImplementation");
 
   class CustomTask : public QueuedTask {
    public:
@@ -67,16 +70,18 @@
 }
 
 TEST_P(TaskQueueTest, PostDelayedZero) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event event;
-  auto queue = CreateTaskQueue(GetParam(), "PostDelayedZero");
+  auto queue = CreateTaskQueue(factory, "PostDelayedZero");
 
   queue->PostDelayedTask(rtc::NewClosure([&event] { event.Set(); }), 0);
   EXPECT_TRUE(event.Wait(1000));
 }
 
 TEST_P(TaskQueueTest, PostFromQueue) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event event;
-  auto queue = CreateTaskQueue(GetParam(), "PostFromQueue");
+  auto queue = CreateTaskQueue(factory, "PostFromQueue");
 
   queue->PostTask(rtc::NewClosure([&event, &queue] {
     queue->PostTask(rtc::NewClosure([&event] { event.Set(); }));
@@ -85,9 +90,10 @@
 }
 
 TEST_P(TaskQueueTest, PostDelayed) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event event;
-  auto queue = CreateTaskQueue(GetParam(), "PostDelayed",
-                               TaskQueueFactory::Priority::HIGH);
+  auto queue =
+      CreateTaskQueue(factory, "PostDelayed", TaskQueueFactory::Priority::HIGH);
 
   int64_t start = rtc::TimeMillis();
   queue->PostDelayedTask(rtc::NewClosure([&event, &queue] {
@@ -105,7 +111,8 @@
 }
 
 TEST_P(TaskQueueTest, PostMultipleDelayed) {
-  auto queue = CreateTaskQueue(GetParam(), "PostMultipleDelayed");
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  auto queue = CreateTaskQueue(factory, "PostMultipleDelayed");
 
   std::vector<rtc::Event> events(100);
   for (int i = 0; i < 100; ++i) {
@@ -122,9 +129,10 @@
 }
 
 TEST_P(TaskQueueTest, PostDelayedAfterDestruct) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event run;
   rtc::Event deleted;
-  auto queue = CreateTaskQueue(GetParam(), "PostDelayedAfterDestruct");
+  auto queue = CreateTaskQueue(factory, "PostDelayedAfterDestruct");
   queue->PostDelayedTask(
       rtc::NewClosure([&run] { run.Set(); }, [&deleted] { deleted.Set(); }),
       100);
@@ -136,9 +144,10 @@
 }
 
 TEST_P(TaskQueueTest, PostAndReuse) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   rtc::Event event;
-  auto post_queue = CreateTaskQueue(GetParam(), "PostQueue");
-  auto reply_queue = CreateTaskQueue(GetParam(), "ReplyQueue");
+  auto post_queue = CreateTaskQueue(factory, "PostQueue");
+  auto reply_queue = CreateTaskQueue(factory, "ReplyQueue");
 
   int call_count = 0;
 
@@ -181,6 +190,7 @@
 // Tests posting more messages than a queue can queue up.
 // In situations like that, tasks will get dropped.
 TEST_P(TaskQueueTest, PostALot) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   // To destruct the event after the queue has gone out of scope.
   rtc::Event event;
 
@@ -189,7 +199,7 @@
   static const int kTaskCount = 0xffff;
 
   {
-    auto queue = CreateTaskQueue(GetParam(), "PostALot");
+    auto queue = CreateTaskQueue(factory, "PostALot");
 
     // On linux, the limit of pending bytes in the pipe buffer is 0xffff.
     // So here we post a total of 0xffff+1 messages, which triggers a failure
@@ -219,12 +229,13 @@
 // unit test, run it under TSan or some other tool that is able to
 // directly detect data races.
 TEST_P(TaskQueueTest, PostTwoWithSharedUnprotectedState) {
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
   struct SharedState {
     // First task will set this value to 1 and second will assert it.
     int state = 0;
   } state;
 
-  auto queue = CreateTaskQueue(GetParam(), "PostTwoWithSharedUnprotectedState");
+  auto queue = CreateTaskQueue(factory, "PostTwoWithSharedUnprotectedState");
   rtc::Event done;
   queue->PostTask(rtc::NewClosure([&state, &queue, &done] {
     // Post tasks from queue to guarantee, that 1st task won't be
diff --git a/api/task_queue/task_queue_test.h b/api/task_queue/task_queue_test.h
index 300d6f3..e2e4730 100644
--- a/api/task_queue/task_queue_test.h
+++ b/api/task_queue/task_queue_test.h
@@ -10,6 +10,9 @@
 #ifndef API_TASK_QUEUE_TASK_QUEUE_TEST_H_
 #define API_TASK_QUEUE_TASK_QUEUE_TEST_H_
 
+#include <functional>
+#include <memory>
+
 #include "api/task_queue/task_queue_factory.h"
 #include "test/gtest.h"
 
@@ -20,12 +23,17 @@
 //
 // namespace {
 //
+// using ::testing::Values;
 // using ::webrtc::TaskQueueTest;
-// webrtc::TaskQueueFactory* MyFactory();
-// INSTANTIATE_TEST_SUITE_P(My, TaskQueueTest, ::testing::Values(MyFactory()));
+//
+// std::unique_ptr<webrtc::TaskQueueFactory> CreateMyFactory();
+//
+// INSTANTIATE_TEST_SUITE_P(My, TaskQueueTest, Values(CreateMyFactory));
 //
 // }  // namespace
-class TaskQueueTest : public ::testing::TestWithParam<TaskQueueFactory*> {};
+class TaskQueueTest : public ::testing::TestWithParam<
+                          std::function<std::unique_ptr<TaskQueueFactory>()>> {
+};
 
 }  // namespace webrtc