proxygen
QueueTest Class Reference
Inheritance diagram for QueueTest:
QuickTest testing::Test QuickTest testing::Test QuickTest testing::Test testing::Test testing::Test testing::Test testing::Test testing::Test testing::Test testing::Test testing::Test testing::Test

Public Member Functions

 QueueTest (uint32_t maxSize, IntQueue::FdType type)
 
void sendOne ()
 
void putMessages ()
 
void multiConsumer ()
 
void maxQueueSize ()
 
void maxReadAtOnce ()
 
void destroyCallback ()
 
void useAfterFork ()
 
- Public Member Functions inherited from testing::Test
virtual ~Test ()
 
virtual ~Test ()
 
virtual ~Test ()
 

Public Attributes

IntQueue queue
 
IntQueue terminationQueue
 

Protected Member Functions

virtual void SetUp ()
 
void MapTester (const Queue< int > *q)
 
virtual void SetUp ()
 
virtual void SetUp ()
 
void MapTester (const Queue< int > *q)
 
virtual void SetUp ()
 
virtual void SetUp ()
 
void MapTester (const Queue< int > *q)
 
virtual void SetUp ()
 
- Protected Member Functions inherited from QuickTest
virtual void TearDown ()
 
virtual void TearDown ()
 
virtual void TearDown ()
 
- Protected Member Functions inherited from testing::Test
 Test ()
 
 Test ()
 
 Test ()
 

Static Protected Member Functions

static int Double (int n)
 
static int Double (int n)
 
static int Double (int n)
 

Protected Attributes

Queue< int > q0_
 
Queue< int > q1_
 
Queue< int > q2_
 
- Protected Attributes inherited from QuickTest
time_t start_time_
 

Additional Inherited Members

- Public Types inherited from testing::Test
typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc
 
typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc
 
typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc
 
typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc
 
typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc
 
typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc
 
- Static Public Member Functions inherited from testing::Test
static void SetUpTestCase ()
 
static void TearDownTestCase ()
 
static bool HasFatalFailure ()
 
static bool HasNonfatalFailure ()
 
static bool HasFailure ()
 
static void RecordProperty (const std::string &key, const std::string &value)
 
static void RecordProperty (const std::string &key, int value)
 
static void SetUpTestCase ()
 
static void TearDownTestCase ()
 
static bool HasFatalFailure ()
 
static bool HasNonfatalFailure ()
 
static bool HasFailure ()
 
static void RecordProperty (const std::string &key, const std::string &value)
 
static void RecordProperty (const std::string &key, int value)
 
static void SetUpTestCase ()
 
static void TearDownTestCase ()
 
static bool HasFatalFailure ()
 
static bool HasNonfatalFailure ()
 
static bool HasFailure ()
 
static void RecordProperty (const std::string &key, const std::string &value)
 
static void RecordProperty (const std::string &key, int value)
 

Detailed Description

Definition at line 70 of file sample3_unittest.cc.

Constructor & Destructor Documentation

QueueTest::QueueTest ( uint32_t  maxSize,
IntQueue::FdType  type 
)
inlineexplicit

Definition at line 55 of file NotificationQueueTest.cpp.

56  : queue(maxSize, type), terminationQueue(maxSize, type) {}
PskType type
IntQueue terminationQueue

Member Function Documentation

void QueueTest::destroyCallback ( )

Definition at line 349 of file NotificationQueueTest.cpp.

References EXPECT_EQ, EXPECT_TRUE, g(), folly::EventBase::loop(), folly::pushmi::__adl::noexcept(), and value.

Referenced by TEST().

349  {
350  // Rather than using QueueConsumer, define a separate class for the destroy
351  // test. The DestroyTestConsumer will delete itself inside the
352  // messageAvailable() callback. With a regular QueueConsumer this would
353  // destroy the std::function object while the function is running, which we
354  // should probably avoid doing. This uses a pointer to a std::function to
355  // avoid destroying the function object.
356  class DestroyTestConsumer : public IntQueue::Consumer {
357  public:
358  void messageAvailable(int&& value) noexcept override {
359  DestructorGuard g(this);
360  if (fn && *fn) {
361  (*fn)(value);
362  }
363  }
364 
365  std::function<void(int)>* fn;
366 
367  protected:
368  ~DestroyTestConsumer() override = default;
369  };
370 
371  EventBase eventBase;
372  // Create a queue and add 2 messages to it
373  queue.putMessage(1);
374  queue.putMessage(2);
375 
376  // Create two QueueConsumers allocated on the heap.
377  // Have whichever one gets called first destroy both of the QueueConsumers.
378  // This way one consumer will be destroyed from inside its messageAvailable()
379  // callback, and one consume will be destroyed when it isn't inside
380  // messageAvailable().
381  std::unique_ptr<DestroyTestConsumer, DelayedDestruction::Destructor>
382  consumer1(new DestroyTestConsumer);
383  std::unique_ptr<DestroyTestConsumer, DelayedDestruction::Destructor>
384  consumer2(new DestroyTestConsumer);
385  std::function<void(int)> fn = [&](int) {
386  consumer1 = nullptr;
387  consumer2 = nullptr;
388  };
389  consumer1->fn = &fn;
390  consumer2->fn = &fn;
391 
392  consumer1->startConsuming(&eventBase, &queue);
393  consumer2->startConsuming(&eventBase, &queue);
394 
395  // Run the event loop.
396  eventBase.loop();
397 
398  // One of the consumers should have fired, received the message,
399  // then destroyed both consumers.
400  EXPECT_TRUE(!consumer1);
401  EXPECT_TRUE(!consumer2);
402  // One message should be left in the queue
403  int result = 1;
404  EXPECT_TRUE(queue.tryConsume(result));
405  EXPECT_EQ(2, result);
406 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
requires E e noexcept(noexcept(s.error(std::move(e))))
void putMessage(MessageTT &&message)
bool tryConsume(MessageT &result)
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
g_t g(f_t)
static int QueueTest::Double ( int  n)
inlinestaticprotected

Definition at line 91 of file sample3_unittest.cc.

Referenced by MapTester().

91  {
92  return 2*n;
93  }
static int QueueTest::Double ( int  n)
inlinestaticprotected

Definition at line 91 of file sample3_unittest.cc.

91  {
92  return 2*n;
93  }
static int QueueTest::Double ( int  n)
inlinestaticprotected

Definition at line 91 of file sample3_unittest.cc.

91  {
92  return 2*n;
93  }
void QueueTest::MapTester ( const Queue< int > *  q)
inlineprotected

Definition at line 96 of file sample3_unittest.cc.

References ASSERT_EQ, Double(), EXPECT_EQ, Queue< E >::Head(), Queue< E >::Map(), QueueNode< E >::next(), q0_, q1_, q2_, and Queue< E >::Size().

96  {
97  // Creates a new queue, where each element is twice as big as the
98  // corresponding one in q.
99  const Queue<int> * const new_q = q->Map(Double);
100 
101  // Verifies that the new queue has the same size as q.
102  ASSERT_EQ(q->Size(), new_q->Size());
103 
104  // Verifies the relationship between the elements of the two queues.
105  for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
106  n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
107  EXPECT_EQ(2 * n1->element(), n2->element());
108  }
109 
110  delete new_q;
111  }
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
QueueNode< E > * Head()
Definition: sample3-inl.h:105
size_t Size() const
Definition: sample3-inl.h:102
static int Double(int n)
QueueNode * next()
Definition: sample3-inl.h:57
Queue * Map(F function) const
Definition: sample3-inl.h:153
void QueueTest::MapTester ( const Queue< int > *  q)
inlineprotected

Definition at line 96 of file sample3_unittest.cc.

References ASSERT_EQ, Double(), EXPECT_EQ, Queue< E >::Head(), Queue< E >::Map(), QueueNode< E >::next(), and Queue< E >::Size().

Referenced by TEST_F().

96  {
97  // Creates a new queue, where each element is twice as big as the
98  // corresponding one in q.
99  const Queue<int> * const new_q = q->Map(Double);
100 
101  // Verifies that the new queue has the same size as q.
102  ASSERT_EQ(q->Size(), new_q->Size());
103 
104  // Verifies the relationship between the elements of the two queues.
105  for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
106  n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
107  EXPECT_EQ(2 * n1->element(), n2->element());
108  }
109 
110  delete new_q;
111  }
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
QueueNode< E > * Head()
Definition: sample3-inl.h:105
size_t Size() const
Definition: sample3-inl.h:102
static int Double(int n)
QueueNode * next()
Definition: sample3-inl.h:57
Queue * Map(F function) const
Definition: sample3-inl.h:153
void QueueTest::MapTester ( const Queue< int > *  q)
inlineprotected

Definition at line 96 of file sample3_unittest.cc.

References ASSERT_EQ, Double(), EXPECT_EQ, Queue< E >::Head(), Queue< E >::Map(), QueueNode< E >::next(), q0_, q1_, q2_, and Queue< E >::Size().

96  {
97  // Creates a new queue, where each element is twice as big as the
98  // corresponding one in q.
99  const Queue<int> * const new_q = q->Map(Double);
100 
101  // Verifies that the new queue has the same size as q.
102  ASSERT_EQ(q->Size(), new_q->Size());
103 
104  // Verifies the relationship between the elements of the two queues.
105  for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
106  n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
107  EXPECT_EQ(2 * n1->element(), n2->element());
108  }
109 
110  delete new_q;
111  }
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
QueueNode< E > * Head()
Definition: sample3-inl.h:105
size_t Size() const
Definition: sample3-inl.h:102
static int Double(int n)
QueueNode * next()
Definition: sample3-inl.h:57
Queue * Map(F function) const
Definition: sample3-inl.h:153
void QueueTest::maxQueueSize ( )

Definition at line 218 of file NotificationQueueTest.cpp.

References EXPECT_EQ, EXPECT_FALSE, EXPECT_THROW, EXPECT_TRUE, folly::gen::move, and val.

Referenced by TEST().

218  {
219  // Create a queue with a maximum size of 5, and fill it up
220 
221  for (int n = 0; n < 5; ++n) {
222  queue.tryPutMessage(n);
223  }
224 
225  // Calling tryPutMessage() now should fail
226  EXPECT_THROW(queue.tryPutMessage(5), std::overflow_error);
227 
229  int val = 5;
231 
232  // Pop a message from the queue
233  int result = -1;
234  EXPECT_TRUE(queue.tryConsume(result));
235  EXPECT_EQ(0, result);
236 
237  // We should be able to write another message now that we popped one off.
238  queue.tryPutMessage(5);
239  // But now we are full again.
240  EXPECT_THROW(queue.tryPutMessage(6), std::overflow_error);
241  // putMessage() should let us exceed the maximum
242  queue.putMessage(6);
243 
244  // Pull another mesage off
245  EXPECT_TRUE(queue.tryConsume(result));
246  EXPECT_EQ(1, result);
247 
248  // tryPutMessage() should still fail since putMessage() actually put us over
249  // the max.
250  EXPECT_THROW(queue.tryPutMessage(7), std::overflow_error);
251 
252  // Pull another message off and try again
253  EXPECT_TRUE(queue.tryConsume(result));
254  EXPECT_EQ(2, result);
255  queue.tryPutMessage(7);
256 
257  // Now pull all the remaining messages off
258  EXPECT_TRUE(queue.tryConsume(result));
259  EXPECT_EQ(3, result);
260  EXPECT_TRUE(queue.tryConsume(result));
261  EXPECT_EQ(4, result);
262  EXPECT_TRUE(queue.tryConsume(result));
263  EXPECT_EQ(5, result);
264  EXPECT_TRUE(queue.tryConsume(result));
265  EXPECT_EQ(6, result);
266  EXPECT_TRUE(queue.tryConsume(result));
267  EXPECT_EQ(7, result);
268 
269  // There should be no messages left
270  result = -1;
271  EXPECT_TRUE(!queue.tryConsume(result));
272  EXPECT_EQ(-1, result);
273 }
#define EXPECT_THROW(statement, expected_exception)
Definition: gtest.h:1843
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
double val
Definition: String.cpp:273
void putMessage(MessageTT &&message)
bool tryConsume(MessageT &result)
bool tryPutMessageNoThrow(MessageTT &&message)
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
void tryPutMessage(MessageTT &&message)
void QueueTest::maxReadAtOnce ( )

Definition at line 275 of file NotificationQueueTest.cpp.

References EXPECT_EQ, QueueConsumer::fn, folly::EventBase::loop(), QueueConsumer::messages, folly::EventBase::runInLoop(), folly::NotificationQueue< MessageT >::Consumer::setMaxReadAtOnce(), folly::NotificationQueue< MessageT >::Consumer::startConsuming(), folly::EventBase::terminateLoopSoon(), uint32_t, and value.

Referenced by TEST().

275  {
276  // Add 100 messages to the queue
277  for (int n = 0; n < 100; ++n) {
278  queue.putMessage(n);
279  }
280 
281  EventBase eventBase;
282 
283  // Record how many messages were processed each loop iteration.
284  uint32_t messagesThisLoop = 0;
285  std::vector<uint32_t> messagesPerLoop;
286  std::function<void()> loopFinished = [&] {
287  // Record the current number of messages read this loop
288  messagesPerLoop.push_back(messagesThisLoop);
289  // Reset messagesThisLoop to 0 for the next loop
290  messagesThisLoop = 0;
291 
292  // To prevent use-after-free bugs when eventBase destructs,
293  // prevent calling runInLoop any more after the test is finished.
294  // 55 == number of times loop should run.
295  if (messagesPerLoop.size() != 55) {
296  // Reschedule ourself to run at the end of the next loop
297  eventBase.runInLoop(loopFinished);
298  }
299  };
300  // Schedule the first call to loopFinished
301  eventBase.runInLoop(loopFinished);
302 
303  QueueConsumer consumer;
304  // Read the first 50 messages 10 at a time.
305  consumer.setMaxReadAtOnce(10);
306  consumer.fn = [&](int value) {
307  ++messagesThisLoop;
308  // After 50 messages, drop to reading only 1 message at a time.
309  if (value == 50) {
310  consumer.setMaxReadAtOnce(1);
311  }
312  // Terminate the loop when we reach the end of the messages.
313  if (value == 99) {
314  eventBase.terminateLoopSoon();
315  }
316  };
317  consumer.startConsuming(&eventBase, &queue);
318 
319  // Run the event loop until the consumer terminates it
320  eventBase.loop();
321 
322  // The consumer should have read all 100 messages in order
323  EXPECT_EQ(100, consumer.messages.size());
324  for (int n = 0; n < 100; ++n) {
325  EXPECT_EQ(n, consumer.messages.at(n));
326  }
327 
328  // Currently EventBase happens to still run the loop callbacks even after
329  // terminateLoopSoon() is called. However, we don't really want to depend on
330  // this behavior. In case this ever changes in the future, add
331  // messagesThisLoop to messagesPerLoop in loop callback isn't invoked for the
332  // last loop iteration.
333  if (messagesThisLoop > 0) {
334  messagesPerLoop.push_back(messagesThisLoop);
335  messagesThisLoop = 0;
336  }
337 
338  // For the first 5 loops it should have read 10 messages each time.
339  // After that it should have read 1 messages per loop for the next 50 loops.
340  EXPECT_EQ(55, messagesPerLoop.size());
341  for (int n = 0; n < 5; ++n) {
342  EXPECT_EQ(10, messagesPerLoop.at(n));
343  }
344  for (int n = 5; n < 55; ++n) {
345  EXPECT_EQ(1, messagesPerLoop.at(n));
346  }
347 }
void setMaxReadAtOnce(uint32_t maxAtOnce)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
void putMessage(MessageTT &&message)
std::function< void(int)> fn
void runInLoop(LoopCallback *callback, bool thisIteration=false)
Definition: EventBase.cpp:520
std::deque< int > messages
void terminateLoopSoon()
Definition: EventBase.cpp:493
static const char *const value
Definition: Conv.cpp:50
void startConsuming(EventBase *eventBase, NotificationQueue *queue)
void QueueTest::multiConsumer ( )

Definition at line 138 of file NotificationQueueTest.cpp.

References EXPECT_EQ, EXPECT_GE, EXPECT_LT, QueueConsumer::fn, folly::EventBase::loop(), messages, folly::EventBase::runInEventBaseThread(), folly::NotificationQueue< MessageT >::Consumer::startConsuming(), folly::NotificationQueue< MessageT >::Consumer::stopConsuming(), threads, uint32_t, and value.

Referenced by TEST().

138  {
139  uint32_t numConsumers = 8;
140  uint32_t numMessages = 10000;
141 
142  // Create several consumers each running in their own EventBase thread
143  vector<QueueConsumer> consumers(numConsumers);
144  vector<ScopedEventBaseThread> threads(numConsumers);
145 
146  for (uint32_t consumerIdx = 0; consumerIdx < numConsumers; ++consumerIdx) {
147  QueueConsumer* consumer = &consumers[consumerIdx];
148 
149  consumer->fn = [consumer, consumerIdx, this](int value) {
150  // Treat 0 as a signal to stop.
151  if (value == 0) {
152  consumer->stopConsuming();
153  // Put a message on the terminationQueue to indicate we have stopped
154  terminationQueue.putMessage(consumerIdx);
155  }
156  };
157 
158  EventBase* eventBase = threads[consumerIdx].getEventBase();
159  eventBase->runInEventBaseThread([eventBase, consumer, this] {
160  consumer->startConsuming(eventBase, &queue);
161  });
162  }
163 
164  // Now add a number of messages from this thread
165  // Start at 1 rather than 0, since 0 is the signal to stop.
166  for (uint32_t n = 1; n < numMessages; ++n) {
167  queue.putMessage(n);
168  }
169  // Now add a 0 for each consumer, to signal them to stop
170  for (uint32_t n = 0; n < numConsumers; ++n) {
171  queue.putMessage(0);
172  }
173 
174  // Wait until we get notified that all of the consumers have stopped
175  // We use a separate notification queue for this.
176  QueueConsumer terminationConsumer;
177  vector<uint32_t> consumersStopped(numConsumers, 0);
178  uint32_t consumersRemaining = numConsumers;
179  terminationConsumer.fn = [&](int consumerIdx) {
180  --consumersRemaining;
181  if (consumersRemaining == 0) {
182  terminationConsumer.stopConsuming();
183  }
184 
185  EXPECT_GE(consumerIdx, 0);
186  EXPECT_LT(consumerIdx, numConsumers);
187  ++consumersStopped[consumerIdx];
188  };
189  EventBase eventBase;
190  terminationConsumer.startConsuming(&eventBase, &terminationQueue);
191  eventBase.loop();
192 
193  // Verify that we saw exactly 1 stop message for each consumer
194  for (uint32_t n = 0; n < numConsumers; ++n) {
195  EXPECT_EQ(1, consumersStopped[n]);
196  }
197 
198  // Validate that every message sent to the main queue was received exactly
199  // once.
200  vector<int> messageCount(numMessages, 0);
201  for (uint32_t n = 0; n < numConsumers; ++n) {
202  for (int msg : consumers[n].messages) {
203  EXPECT_GE(msg, 0);
204  EXPECT_LT(msg, numMessages);
205  ++messageCount[msg];
206  }
207  }
208 
209  // 0 is the signal to stop, and should have been received once by each
210  // consumer
211  EXPECT_EQ(numConsumers, messageCount[0]);
212  // All other messages should have been received exactly once
213  for (uint32_t n = 1; n < numMessages; ++n) {
214  EXPECT_EQ(1, messageCount[n]);
215  }
216 }
static struct message messages[5]
Definition: test.c:75
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
#define EXPECT_GE(val1, val2)
Definition: gtest.h:1932
void putMessage(MessageTT &&message)
std::function< void(int)> fn
std::vector< std::thread::id > threads
bool runInEventBaseThread(void(*fn)(T *), T *arg)
Definition: EventBase.h:794
static const char *const value
Definition: Conv.cpp:50
IntQueue terminationQueue
void startConsuming(EventBase *eventBase, NotificationQueue *queue)
#define EXPECT_LT(val1, val2)
Definition: gtest.h:1930
void QueueTest::putMessages ( )

Definition at line 93 of file NotificationQueueTest.cpp.

References EXPECT_EQ, QueueConsumer::fn, folly::EventBase::loop(), QueueConsumer::messages, folly::NotificationQueue< MessageT >::Consumer::startConsuming(), and folly::NotificationQueue< MessageT >::Consumer::stopConsuming().

93  {
94  EventBase eventBase;
95 
96  QueueConsumer consumer;
97  QueueConsumer consumer2;
98  consumer.fn = [&](int msg) {
99  // Stop consuming after we receive a message with value 0, and start
100  // consumer2
101  if (msg == 0) {
102  consumer.stopConsuming();
103  consumer2.startConsuming(&eventBase, &queue);
104  }
105  };
106  consumer2.fn = [&](int msg) {
107  // Stop consuming after we receive a message with value 0
108  if (msg == 0) {
109  consumer2.stopConsuming();
110  }
111  };
112  consumer.startConsuming(&eventBase, &queue);
113 
114  list<int> msgList = {1, 2, 3, 4};
115  vector<int> msgVector = {5, 0, 9, 8, 7, 6, 7, 7, 8, 8, 2, 9, 6, 6, 10, 2, 0};
116  // Call putMessages() several times to add messages to the queue
117  queue.putMessages(msgList.begin(), msgList.end());
118  queue.putMessages(msgVector.begin() + 2, msgVector.begin() + 4);
119  // Test sending 17 messages, the pipe-based queue calls write in 16 byte
120  // chunks
121  queue.putMessages(msgVector.begin(), msgVector.end());
122 
123  // Loop until the consumer has stopped
124  eventBase.loop();
125 
126  vector<int> expectedMessages = {1, 2, 3, 4, 9, 8, 7, 5, 0};
127  vector<int> expectedMessages2 = {9, 8, 7, 6, 7, 7, 8, 8, 2, 9, 6, 10, 2, 0};
128  EXPECT_EQ(expectedMessages.size(), consumer.messages.size());
129  for (unsigned int idx = 0; idx < expectedMessages.size(); ++idx) {
130  EXPECT_EQ(expectedMessages[idx], consumer.messages.at(idx));
131  }
132  EXPECT_EQ(expectedMessages2.size(), consumer2.messages.size());
133  for (unsigned int idx = 0; idx < expectedMessages2.size(); ++idx) {
134  EXPECT_EQ(expectedMessages2[idx], consumer2.messages.at(idx));
135  }
136 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
std::function< void(int)> fn
std::deque< int > messages
void putMessages(InputIteratorT first, InputIteratorT last)
void startConsuming(EventBase *eventBase, NotificationQueue *queue)
void QueueTest::sendOne ( )

Definition at line 70 of file NotificationQueueTest.cpp.

References EXPECT_EQ, QueueConsumer::fn, folly::ScopedEventBaseThread::getEventBase(), folly::EventBase::loop(), QueueConsumer::messages, messages, folly::EventBase::runInEventBaseThread(), folly::NotificationQueue< MessageT >::Consumer::startConsuming(), and folly::NotificationQueue< MessageT >::Consumer::stopConsuming().

Referenced by TEST().

70  {
71  // Create a notification queue and a callback in this thread
72  EventBase eventBase;
73 
74  QueueConsumer consumer;
75  consumer.fn = [&](int) {
76  // Stop consuming after we receive 1 message
77  consumer.stopConsuming();
78  };
79  consumer.startConsuming(&eventBase, &queue);
80 
81  // Start a new EventBase thread to put a message on our queue
83  t1.getEventBase()->runInEventBaseThread([&] { this->queue.putMessage(5); });
84 
85  // Loop until we receive the message
86  eventBase.loop();
87 
88  const auto& messages = consumer.messages;
89  EXPECT_EQ(1, messages.size());
90  EXPECT_EQ(5, messages.at(0));
91 }
static struct message messages[5]
Definition: test.c:75
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
void putMessage(MessageTT &&message)
std::function< void(int)> fn
std::deque< int > messages
bool runInEventBaseThread(void(*fn)(T *), T *arg)
Definition: EventBase.h:794
void startConsuming(EventBase *eventBase, NotificationQueue *queue)
virtual void QueueTest::SetUp ( )
inlineprotectedvirtual

Reimplemented from testing::Test.

Definition at line 77 of file sample3_unittest.cc.

References Queue< E >::Enqueue(), q1_, and q2_.

77  {
78  q1_.Enqueue(1);
79  q2_.Enqueue(2);
80  q2_.Enqueue(3);
81  }
Queue< int > q2_
void Enqueue(const E &element)
Definition: sample3-inl.h:116
Queue< int > q1_
virtual void QueueTest::SetUp ( )
inlineprotectedvirtual

Reimplemented from testing::Test.

Definition at line 77 of file sample3_unittest.cc.

References Queue< E >::Enqueue(), q1_, and q2_.

77  {
78  q1_.Enqueue(1);
79  q2_.Enqueue(2);
80  q2_.Enqueue(3);
81  }
Queue< int > q2_
void Enqueue(const E &element)
Definition: sample3-inl.h:116
Queue< int > q1_
virtual void QueueTest::SetUp ( )
inlineprotectedvirtual

Reimplemented from testing::Test.

Definition at line 77 of file sample3_unittest.cc.

References Queue< E >::Enqueue(), q1_, and q2_.

77  {
78  q1_.Enqueue(1);
79  q2_.Enqueue(2);
80  q2_.Enqueue(3);
81  }
Queue< int > q2_
void Enqueue(const E &element)
Definition: sample3-inl.h:116
Queue< int > q1_
virtual void QueueTest::SetUp ( )
inlineprotectedvirtual

Reimplemented from testing::Test.

Definition at line 146 of file sample5_unittest.cc.

References QuickTest::SetUp().

146  {
147  // First, we need to set up the super fixture (QuickTest).
149 
150  // Second, some additional setup for this fixture.
151  q1_.Enqueue(1);
152  q2_.Enqueue(2);
153  q2_.Enqueue(3);
154  }
virtual void SetUp()
Queue< int > q2_
void Enqueue(const E &element)
Definition: sample3-inl.h:116
Queue< int > q1_
virtual void QueueTest::SetUp ( )
inlineprotectedvirtual

Reimplemented from testing::Test.

Definition at line 146 of file sample5_unittest.cc.

References QuickTest::SetUp().

146  {
147  // First, we need to set up the super fixture (QuickTest).
149 
150  // Second, some additional setup for this fixture.
151  q1_.Enqueue(1);
152  q2_.Enqueue(2);
153  q2_.Enqueue(3);
154  }
virtual void SetUp()
Queue< int > q2_
void Enqueue(const E &element)
Definition: sample3-inl.h:116
Queue< int > q1_
virtual void QueueTest::SetUp ( )
inlineprotectedvirtual

Reimplemented from testing::Test.

Definition at line 146 of file sample5_unittest.cc.

References QuickTest::SetUp().

146  {
147  // First, we need to set up the super fixture (QuickTest).
149 
150  // Second, some additional setup for this fixture.
151  q1_.Enqueue(1);
152  q2_.Enqueue(2);
153  q2_.Enqueue(3);
154  }
virtual void SetUp()
Queue< int > q2_
void Enqueue(const E &element)
Definition: sample3-inl.h:116
Queue< int > q1_
void QueueTest::useAfterFork ( )

Member Data Documentation

Queue< int > QueueTest::q0_
protected

Definition at line 114 of file sample3_unittest.cc.

Referenced by MapTester(), and TEST_F().

Queue< int > QueueTest::q1_
protected

Definition at line 115 of file sample3_unittest.cc.

Referenced by MapTester(), SetUp(), and TEST_F().

Queue< int > QueueTest::q2_
protected

Definition at line 116 of file sample3_unittest.cc.

Referenced by MapTester(), SetUp(), and TEST_F().

IntQueue QueueTest::queue

Definition at line 66 of file NotificationQueueTest.cpp.

IntQueue QueueTest::terminationQueue

Definition at line 67 of file NotificationQueueTest.cpp.


The documentation for this class was generated from the following files: