]>
Commit | Line | Data |
---|---|---|
7cac9316 XL |
1 | //===-- buffer_queue_test.cc ----------------------------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // This file is a part of XRay, a function call tracing system. | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | #include "xray_buffer_queue.h" | |
14 | #include "gtest/gtest.h" | |
15 | ||
16 | #include <future> | |
17 | #include <system_error> | |
18 | #include <unistd.h> | |
19 | ||
20 | namespace __xray { | |
21 | ||
22 | static constexpr size_t kSize = 4096; | |
23 | ||
24 | TEST(BufferQueueTest, API) { BufferQueue Buffers(kSize, 1); } | |
25 | ||
26 | TEST(BufferQueueTest, GetAndRelease) { | |
27 | BufferQueue Buffers(kSize, 1); | |
28 | BufferQueue::Buffer Buf; | |
29 | ASSERT_EQ(Buffers.getBuffer(Buf), std::error_code()); | |
30 | ASSERT_NE(nullptr, Buf.Buffer); | |
31 | ASSERT_EQ(Buffers.releaseBuffer(Buf), std::error_code()); | |
32 | ASSERT_EQ(nullptr, Buf.Buffer); | |
33 | } | |
34 | ||
35 | TEST(BufferQueueTest, GetUntilFailed) { | |
36 | BufferQueue Buffers(kSize, 1); | |
37 | BufferQueue::Buffer Buf0; | |
38 | EXPECT_EQ(Buffers.getBuffer(Buf0), std::error_code()); | |
39 | BufferQueue::Buffer Buf1; | |
40 | EXPECT_EQ(std::errc::not_enough_memory, Buffers.getBuffer(Buf1)); | |
41 | EXPECT_EQ(Buffers.releaseBuffer(Buf0), std::error_code()); | |
42 | } | |
43 | ||
44 | TEST(BufferQueueTest, ReleaseUnknown) { | |
45 | BufferQueue Buffers(kSize, 1); | |
46 | BufferQueue::Buffer Buf; | |
47 | Buf.Buffer = reinterpret_cast<void *>(0xdeadbeef); | |
48 | Buf.Size = kSize; | |
49 | EXPECT_EQ(std::errc::argument_out_of_domain, Buffers.releaseBuffer(Buf)); | |
50 | } | |
51 | ||
52 | TEST(BufferQueueTest, ErrorsWhenFinalising) { | |
53 | BufferQueue Buffers(kSize, 2); | |
54 | BufferQueue::Buffer Buf; | |
55 | ASSERT_EQ(Buffers.getBuffer(Buf), std::error_code()); | |
56 | ASSERT_NE(nullptr, Buf.Buffer); | |
57 | ASSERT_EQ(Buffers.finalize(), std::error_code()); | |
58 | BufferQueue::Buffer OtherBuf; | |
59 | ASSERT_EQ(std::errc::state_not_recoverable, Buffers.getBuffer(OtherBuf)); | |
60 | ASSERT_EQ(std::errc::state_not_recoverable, Buffers.finalize()); | |
61 | ASSERT_EQ(Buffers.releaseBuffer(Buf), std::error_code()); | |
62 | } | |
63 | ||
64 | TEST(BufferQueueTest, MultiThreaded) { | |
65 | BufferQueue Buffers(kSize, 100); | |
66 | auto F = [&] { | |
67 | BufferQueue::Buffer B; | |
68 | while (!Buffers.getBuffer(B)) { | |
69 | Buffers.releaseBuffer(B); | |
70 | } | |
71 | }; | |
72 | auto T0 = std::async(std::launch::async, F); | |
73 | auto T1 = std::async(std::launch::async, F); | |
74 | auto T2 = std::async(std::launch::async, [&] { | |
75 | while (!Buffers.finalize()) | |
76 | ; | |
77 | }); | |
78 | F(); | |
79 | } | |
80 | ||
81 | } // namespace __xray |