1 // Copyright 2014 Dolphin Emulator Project
2 // Licensed under GPLv2+
3 // Refer to the license.txt file included.
4 
5 #include <gtest/gtest.h>
6 #include <thread>
7 
8 #include "Common/SPSCQueue.h"
9 
TEST(SPSCQueue,Simple)10 TEST(SPSCQueue, Simple)
11 {
12   Common::SPSCQueue<u32> q;
13 
14   EXPECT_EQ(0u, q.Size());
15   EXPECT_TRUE(q.Empty());
16 
17   q.Push(1);
18   EXPECT_EQ(1u, q.Size());
19   EXPECT_FALSE(q.Empty());
20 
21   u32 v;
22   q.Pop(v);
23   EXPECT_EQ(1u, v);
24   EXPECT_EQ(0u, q.Size());
25   EXPECT_TRUE(q.Empty());
26 
27   // Test the FIFO order.
28   for (u32 i = 0; i < 1000; ++i)
29     q.Push(i);
30   EXPECT_EQ(1000u, q.Size());
31   for (u32 i = 0; i < 1000; ++i)
32   {
33     u32 v2;
34     q.Pop(v2);
35     EXPECT_EQ(i, v2);
36   }
37   EXPECT_TRUE(q.Empty());
38 
39   for (u32 i = 0; i < 1000; ++i)
40     q.Push(i);
41   EXPECT_FALSE(q.Empty());
42   q.Clear();
43   EXPECT_TRUE(q.Empty());
44 }
45 
TEST(SPSCQueue,MultiThreaded)46 TEST(SPSCQueue, MultiThreaded)
47 {
48   Common::SPSCQueue<u32> q;
49 
50   auto inserter = [&q]() {
51     for (u32 i = 0; i < 100000; ++i)
52       q.Push(i);
53   };
54 
55   auto popper = [&q]() {
56     for (u32 i = 0; i < 100000; ++i)
57     {
58       while (q.Empty())
59         ;
60       u32 v;
61       q.Pop(v);
62       EXPECT_EQ(i, v);
63     }
64   };
65 
66   std::thread popper_thread(popper);
67   std::thread inserter_thread(inserter);
68 
69   popper_thread.join();
70   inserter_thread.join();
71 }
72