PageRenderTime 24ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/test/service/monitor/entriesqueue.cpp

https://gitlab.com/github-cloud-corporation/cynara
C++ | 221 lines | 138 code | 45 blank | 38 comment | 5 complexity | 8f0c5551cce2fafaa1c1039888145cfa MD5 | raw file
  1. /*
  2. * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /**
  17. * @file test/service/monitor/entriesqueue.cpp
  18. * @author Aleksander Zdyb <a.zdyb@samsung.com>
  19. * @version 1.0
  20. * @brief Tests of EntriesQueue
  21. */
  22. #include <gtest/gtest.h>
  23. #include <gmock/gmock.h>
  24. #include <memory>
  25. #include <ctime>
  26. #include <service/monitor/EntriesQueue.h>
  27. #include <common/types/MonitorEntry.h>
  28. #include "../../helpers.h"
  29. using namespace Cynara;
  30. namespace {
  31. typedef std::vector<MonitorEntry> MonitorEntries;
  32. } /* namespace anonymous */
  33. TEST(EntriesQueue, empty) {
  34. EntriesQueue queue(10, 2);
  35. ASSERT_TRUE(queue.empty());
  36. ASSERT_EQ(10, queue.capacity());
  37. ASSERT_EQ(0, queue.size());
  38. ASSERT_EQ(0, queue.sizeFrom(queue.getFrontEntryId()));
  39. ASSERT_EQ(0, queue.getFrontEntryId());
  40. ASSERT_EQ(0, queue.getBackEntryId());
  41. }
  42. TEST(EntriesQueue, pushOne) {
  43. EntriesQueue queue;
  44. queue.push({{"c", "u", "p"}, 0, {0, 0}});
  45. ASSERT_EQ(1, queue.size());
  46. ASSERT_EQ(1, queue.sizeFrom(queue.getFrontEntryId()));
  47. ASSERT_EQ(queue.getFrontEntryId(), queue.getBackEntryId() - 1);
  48. }
  49. TEST(EntriesQueue, clear) {
  50. EntriesQueue queue;
  51. auto originalCapacity = queue.capacity();
  52. queue.push({{"c", "u", "p"}, 0, {0, 0}});
  53. ASSERT_EQ(1, queue.size());
  54. queue.clear();
  55. ASSERT_EQ(0, queue.size());
  56. ASSERT_EQ(originalCapacity, queue.capacity());
  57. }
  58. TEST(EntriesQueue, fetchFromEmpty) {
  59. EntriesQueue queue;
  60. MonitorEntries entries;
  61. ASSERT_EQ(-1, queue.fetch(queue.getFrontEntryId(), 1, entries));
  62. }
  63. TEST(EntriesQueue, fetchOne) {
  64. using ::testing::ElementsAre;
  65. EntriesQueue queue;
  66. MonitorEntry monitorEntry{{"c", "u", "p"}, 0, {0, 0}};
  67. queue.push(monitorEntry);
  68. std::vector<MonitorEntry> entries;
  69. auto nextId = queue.fetch(queue.getFrontEntryId(), 1, entries);
  70. ASSERT_EQ(1, nextId);
  71. ASSERT_THAT(entries, ElementsAre(monitorEntry));
  72. ASSERT_EQ(1, queue.size());
  73. queue.popUntil(nextId);
  74. ASSERT_EQ(0, queue.size());
  75. ASSERT_EQ(1, queue.getFrontEntryId());
  76. ASSERT_EQ(1, queue.getBackEntryId());
  77. }
  78. TEST(EntriesQueue, overflow) {
  79. EntriesQueue queue(10, 2);
  80. MonitorEntry monitorEntry1{{"c1", "u1", "p1"}, 0, {0, 0}};
  81. MonitorEntry monitorEntry2{{"c2", "u2", "p2"}, 0, {0, 0}};
  82. MonitorEntry monitorEntry11{{"c11", "u11", "p11"}, 0, {0, 0}};
  83. queue.push(monitorEntry1);
  84. queue.push(monitorEntry2);
  85. for (auto i = 0; i < 8; ++i)
  86. queue.push({{"cn", "un", "pn"}, 0, {0, 0}});
  87. // Now 1st entry should be overwritten
  88. auto overflow = queue.push(monitorEntry11);
  89. ASSERT_TRUE(overflow);
  90. std::vector<MonitorEntry> entries;
  91. auto sizeFromFront = queue.sizeFrom(queue.getFrontEntryId());
  92. ASSERT_EQ(10, sizeFromFront);
  93. queue.fetch(queue.getFrontEntryId(), sizeFromFront, entries);
  94. ASSERT_EQ(monitorEntry2, entries.at(0));
  95. ASSERT_EQ(monitorEntry11, entries.at(9));
  96. }
  97. TEST(EntriesQueue, pushFetch) {
  98. EntriesQueue queue(10, 2);
  99. MonitorEntries expectedEntries;
  100. for (auto i = 0; i < 20; ++i)
  101. expectedEntries.push_back({{"c", "u", "p"}, 0, {i, 0}});
  102. auto push = [&queue, &expectedEntries] (std::size_t from, std::size_t count) {
  103. for (auto i = from; i < from + count; ++i)
  104. queue.push(expectedEntries.at(i));
  105. };
  106. auto pop = [&queue] (std::size_t count) -> MonitorEntries {
  107. MonitorEntries entries;
  108. auto nextId = queue.fetch(queue.getFrontEntryId(), count, entries);
  109. queue.popUntil(nextId);
  110. return entries;
  111. };
  112. // push 5 entries [0-5)
  113. push(0, 5);
  114. ASSERT_EQ(5, queue.size());
  115. // pop 3 entries, compare [0-3)
  116. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin(), 3), pop(3));
  117. ASSERT_EQ(2, queue.size());
  118. // push 4 entries [5-9)
  119. push(5, 4);
  120. ASSERT_EQ(6, queue.size());
  121. // pop 5 entries, compare [3-8)
  122. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin() + 3, 5), pop(5));
  123. ASSERT_EQ(1, queue.size());
  124. // push 3 entries [9-12)
  125. push(9, 3);
  126. ASSERT_EQ(4, queue.size());
  127. // pop 4 entries, compare [8-12)
  128. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin() + 8, 4), pop(4));
  129. ASSERT_EQ(0, queue.size());
  130. // push 10 entries [10-20)
  131. push(10, 10);
  132. ASSERT_EQ(10, queue.size());
  133. // pop 10 entries, compare [10-20)
  134. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin() + 10, 10), pop(10));
  135. ASSERT_EQ(0, queue.size());
  136. }
  137. TEST(EntriesQueue, pushFetch2) {
  138. EntriesQueue queue(10, 2);
  139. MonitorEntries expectedEntries;
  140. for (auto i = 0; i < 20; ++i)
  141. expectedEntries.push_back({{"c", "u", "p"}, 0, {i, 0}});
  142. auto push = [&queue, &expectedEntries] (std::size_t from, std::size_t count) {
  143. for (auto i = from; i < from + count; ++i)
  144. queue.push(expectedEntries.at(i));
  145. };
  146. auto pop = [&queue] (std::size_t count) -> MonitorEntries {
  147. MonitorEntries entries;
  148. auto nextId = queue.fetch(queue.getFrontEntryId(), count, entries);
  149. queue.popUntil(nextId);
  150. return entries;
  151. };
  152. // push 5 entries [0-5)
  153. push(0, 5);
  154. ASSERT_EQ(5, queue.size());
  155. // pop 3 entries, compare [0-3)
  156. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin(), 3), pop(3));
  157. ASSERT_EQ(2, queue.size());
  158. // push 4 entries [5-9)
  159. push(5, 4);
  160. ASSERT_EQ(6, queue.size());
  161. // pop 5 entries, compare [3-8)
  162. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin() + 3, 5), pop(5));
  163. ASSERT_EQ(1, queue.size());
  164. // push 6 entries [9-15)
  165. push(9, 6);
  166. ASSERT_EQ(7, queue.size());
  167. // pop 5 entries, compare [8-13)
  168. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin() + 8, 5), pop(5));
  169. ASSERT_EQ(2, queue.size());
  170. // push 8 entries [10-18)
  171. push(15, 5);
  172. ASSERT_EQ(7, queue.size());
  173. // pop 7 entries, compare [13-20)
  174. ASSERT_EQ(Helpers::sliced<MonitorEntries>(expectedEntries.begin() + 13, 7), pop(7));
  175. ASSERT_EQ(0, queue.size());
  176. }