15 #include "absl/strings/internal/cordz_sample_token.h"
18 #include <type_traits>
21 #include "gmock/gmock.h"
22 #include "gtest/gtest.h"
23 #include "absl/memory/memory.h"
24 #include "absl/random/random.h"
25 #include "absl/strings/cordz_test_helpers.h"
26 #include "absl/strings/internal/cord_rep_flat.h"
27 #include "absl/strings/internal/cordz_handle.h"
28 #include "absl/strings/internal/cordz_info.h"
29 #include "absl/synchronization/internal/thread_pool.h"
30 #include "absl/synchronization/notification.h"
31 #include "absl/time/clock.h"
32 #include "absl/time/time.h"
36 namespace cord_internal {
46 TEST(CordzSampleTokenTest, IteratorTraits) {
55 std::iterator_traits<CordzSampleToken::Iterator>::iterator_category,
56 std::input_iterator_tag>::
value,
60 const CordzInfo&>::
value,
64 std::iterator_traits<CordzSampleToken::Iterator>::difference_type,
68 std::is_same<std::iterator_traits<CordzSampleToken::Iterator>::pointer,
69 const CordzInfo*>::
value,
72 std::is_same<std::iterator_traits<CordzSampleToken::Iterator>::reference,
73 const CordzInfo&>::
value,
77 TEST(CordzSampleTokenTest, IteratorEmpty) {
78 CordzSampleToken token;
83 TestCordData cord1, cord2, cord3;
85 CordzInfo* info1 = cord1.data.cordz_info();
87 CordzInfo* info2 = cord2.data.cordz_info();
89 CordzInfo* info3 = cord3.data.cordz_info();
91 CordzSampleToken token;
92 std::vector<const CordzInfo*>
found;
93 for (
const CordzInfo& cord_info : token) {
94 found.push_back(&cord_info);
104 TEST(CordzSampleTokenTest, IteratorEquality) {
109 CordzInfo* info1 = cord1.data.cordz_info();
111 CordzSampleToken token1;
116 CordzInfo* info2 = cord2.data.cordz_info();
118 CordzSampleToken token2;
123 CordzInfo* info3 = cord3.data.cordz_info();
143 TEST(CordzSampleTokenTest, MultiThreaded) {
146 static constexpr
int kNumCords = 3;
147 static constexpr
int kNumTokens = 3;
153 TestCordData cords[kNumCords];
154 std::unique_ptr<CordzSampleToken> tokens[kNumTokens];
156 while (!
stop.HasBeenNotified()) {
163 int index = absl::Uniform(gen, 0, kNumCords);
164 if (absl::Bernoulli(gen, 0.5)) {
165 TestCordData& cord = cords[index];
167 if (cord.data.is_profiled()) {
169 cord.data.cordz_info()->Untrack();
170 cord.data.clear_cordz_info();;
173 CordzInfo::TrackCord(cord.data, kTrackCordMethod);
176 std::unique_ptr<CordzSampleToken>& token = tokens[index];
178 if (absl::Bernoulli(gen, 0.5)) {
180 for (const CordzInfo& info : *token) {
182 EXPECT_THAT(info.Next(*token), Ne(&info));
190 token = absl::make_unique<CordzSampleToken>();
194 for (TestCordData& cord : cords) {