]>
Commit | Line | Data |
---|---|---|
1c2d079d | 1 | #ifndef BOOST_TEST_DYN_LINK |
1566533a | 2 | #define BOOST_TEST_DYN_LINK |
1c2d079d FM |
3 | #endif |
4 | ||
1566533a | 5 | #define BOOST_TEST_NO_MAIN |
6 | ||
870a0fe4 AT |
7 | #ifdef HAVE_CONFIG_H |
8 | #include "config.h" | |
9 | #endif | |
1566533a | 10 | #include <boost/test/unit_test.hpp> |
11 | #include <boost/assign/list_of.hpp> | |
fa8fd4d2 | 12 | |
3fb6cb1e | 13 | #include <stdint.h> |
0ddde5fb | 14 | #include <thread> |
1566533a | 15 | #include "misc.hh" |
16 | #include "dns.hh" | |
17 | #include "statbag.hh" | |
18 | ||
19 | using std::string; | |
20 | ||
0ddde5fb | 21 | static void threadMangler(AtomicCounter* ac) |
1566533a | 22 | { |
2d3c55f6 | 23 | for(unsigned int n=0; n < 1000000; ++n) |
1566533a | 24 | (*ac)++; |
1566533a | 25 | } |
26 | ||
0ddde5fb | 27 | static void threadMangler2(StatBag* S) |
305cbc49 | 28 | { |
2d3c55f6 | 29 | for(unsigned int n=0; n < 1000000; ++n) |
305cbc49 | 30 | S->inc("c"); |
305cbc49 | 31 | } |
32 | ||
33 | ||
34 | ||
c7f29d3e | 35 | BOOST_AUTO_TEST_SUITE(test_misc_hh) |
1566533a | 36 | |
37 | BOOST_AUTO_TEST_CASE(test_StatBagBasic) { | |
38 | StatBag s; | |
39 | s.declare("a", "description"); | |
40 | s.declare("b", "description"); | |
41 | s.declare("c", "description"); | |
42 | s.inc("a"); | |
690b86b7 | 43 | BOOST_CHECK_EQUAL(s.read("a"), 1UL); |
d5ef463e | 44 | |
690b86b7 | 45 | unsigned long n; |
1566533a | 46 | for(n=0; n < 1000000; ++n) |
47 | s.inc("b"); | |
48 | ||
49 | BOOST_CHECK_EQUAL(s.read("b"), n); | |
50 | ||
51 | AtomicCounter* ac = s.getPointer("a"); | |
52 | for(n=0; n < 1000000; ++n) | |
53 | (*ac)++; | |
54 | ||
55 | BOOST_CHECK_EQUAL(s.read("a"), n+1); | |
56 | ||
57 | AtomicCounter* acc = s.getPointer("c"); | |
0ddde5fb RG |
58 | std::vector<std::thread> manglers; |
59 | for (int i=0; i < 4; ++i) { | |
60 | manglers.push_back(std::thread(threadMangler, acc)); | |
61 | } | |
62 | ||
63 | for (auto& t : manglers) { | |
64 | t.join(); | |
65 | } | |
66 | manglers.clear(); | |
1566533a | 67 | |
2d3c55f6 | 68 | BOOST_CHECK_EQUAL(s.read("c"), 4000000U); |
d5ef463e | 69 | |
305cbc49 | 70 | s.set("c", 0); |
71 | ||
0ddde5fb RG |
72 | for (int i=0; i < 4; ++i) { |
73 | manglers.push_back(std::thread(threadMangler2, &s)); | |
74 | } | |
305cbc49 | 75 | |
0ddde5fb RG |
76 | for (auto& t : manglers) { |
77 | t.join(); | |
78 | } | |
79 | manglers.clear(); | |
305cbc49 | 80 | |
2d3c55f6 | 81 | BOOST_CHECK_EQUAL(s.read("c"), 4000000U); |
305cbc49 | 82 | |
83 | ||
84 | s.set("c", 1ULL<<31); | |
85 | BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<31) ); | |
86 | s.inc("c"); | |
87 | BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<31) +1 ); | |
da043807 | 88 | |
d5ef463e | 89 | #ifdef UINTPTR_MAX |
305cbc49 | 90 | #if UINTPTR_MAX > 0xffffffffULL |
690b86b7 | 91 | BOOST_CHECK_EQUAL(sizeof(AtomicCounterInner), 8U); |
305cbc49 | 92 | s.set("c", 1ULL<<33); |
93 | BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<33) ); | |
94 | s.inc("c"); | |
95 | BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<33) +1 ); | |
96 | ||
97 | s.set("c", ~0ULL); | |
98 | BOOST_CHECK_EQUAL(s.read("c"), 0xffffffffffffffffULL ); | |
99 | s.inc("c"); | |
690b86b7 | 100 | BOOST_CHECK_EQUAL(s.read("c"), 0UL ); |
305cbc49 | 101 | #else |
690b86b7 | 102 | BOOST_CHECK_EQUAL(sizeof(AtomicCounterInner), 4U); |
007d8bdb | 103 | BOOST_CHECK_EQUAL(~0UL, 0xffffffffUL); |
305cbc49 | 104 | s.set("c", ~0UL); |
105 | BOOST_CHECK_EQUAL(s.read("c"), 0xffffffffUL ); | |
106 | s.inc("c"); | |
690b86b7 | 107 | BOOST_CHECK_EQUAL(s.read("c"), 0UL ); |
305cbc49 | 108 | #endif |
da043807 | 109 | #endif |
1566533a | 110 | } |
111 | ||
112 | ||
113 | BOOST_AUTO_TEST_SUITE_END() |