18 #include "gmock/gmock.h"
19 #include "gtest/gtest.h"
20 #include "absl/base/config.h"
21 #include "absl/base/internal/raw_logging.h"
22 #include "absl/base/macros.h"
23 #include "absl/strings/cord.h"
24 #include "absl/strings/cord_test_helpers.h"
25 #include "absl/strings/cordz_test_helpers.h"
26 #include "absl/strings/internal/cordz_functions.h"
27 #include "absl/strings/internal/cordz_info.h"
28 #include "absl/strings/internal/cordz_sample_token.h"
29 #include "absl/strings/internal/cordz_statistics.h"
30 #include "absl/strings/internal/cordz_update_tracker.h"
31 #include "absl/strings/str_cat.h"
32 #include "absl/strings/string_view.h"
34 #ifdef ABSL_INTERNAL_CORDZ_ENABLED
42 using cord_internal::CordzInfo;
43 using cord_internal::CordzSampleToken;
44 using cord_internal::CordzStatistics;
45 using cord_internal::CordzUpdateTracker;
46 using Method = CordzUpdateTracker::MethodIdentifier;
50 inline void PrintTo(
const Cord& cord, std::ostream* s) {
51 if (s) *
s <<
"Cord[" << cord.size() <<
"]";
72 CordzSamplingIntervalHelper always(1);
84 Cord& cord() {
return cord_; }
92 CordzSamplingIntervalHelper sample_every_{1};
93 Cord cord_{MakeString(GetParam())};
109 CordzSamplingIntervalHelper sample_every_{1};
118 ParamToString<TestCordSize>);
120 TEST(CordzTest, ConstructSmallArray) {
121 CordzSamplingIntervalHelper sample_every{1};
123 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
126 TEST(CordzTest, ConstructLargeArray) {
127 CordzSamplingIntervalHelper sample_every{1};
129 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
132 TEST_P(CordzStringTest, ConstructString) {
133 CordzSamplingIntervalHelper sample_every{1};
136 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
140 TEST(CordzTest, CopyConstructFromUnsampled) {
141 CordzSamplingIntervalHelper sample_every{1};
147 TEST(CordzTest, CopyConstructFromSampled) {
148 CordzSamplingIntervalHelper sample_never{99999};
151 ASSERT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorCord));
157 TEST(CordzTest, MoveConstruct) {
158 CordzSamplingIntervalHelper sample_every{1};
161 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
164 TEST_P(CordzUpdateTest, AssignUnsampledCord) {
172 TEST_P(CordzUpdateTest, AssignSampledCord) {
175 ASSERT_THAT(cord(), HasValidCordzInfoOf(Method::kAssignCord));
182 TEST(CordzUpdateTest, AssignSampledCordToInlined) {
183 CordzSamplingIntervalHelper sample_never{99999};
187 ASSERT_THAT(cord, HasValidCordzInfoOf(Method::kAssignCord));
194 TEST(CordzUpdateTest, AssignSampledCordToUnsampledCord) {
195 CordzSamplingIntervalHelper sample_never{99999};
199 ASSERT_THAT(cord, HasValidCordzInfoOf(Method::kAssignCord));
206 TEST(CordzUpdateTest, AssignUnsampledCordToSampledCordWithoutSampling) {
207 CordzSamplingIntervalHelper sample_never{99999};
216 TEST(CordzUpdateTest, AssignUnsampledCordToSampledCordWithSampling) {
217 CordzSamplingIntervalHelper sample_every{1};
226 TEST(CordzUpdateTest, AssignSampledCordToSampledCord) {
227 CordzSamplingIntervalHelper sample_every{1};
231 ASSERT_THAT(cord, HasValidCordzInfoOf(Method::kAssignCord));
238 TEST(CordzUpdateTest, AssignUnsampledCordToSampledCord) {
239 CordzSamplingIntervalHelper sample_every{1};
243 ASSERT_THAT(cord, HasValidCordzInfoOf(Method::kAssignCord));
250 TEST(CordzTest, AssignInlinedCordToSampledCord) {
251 CordzSampleToken token;
252 CordzSamplingIntervalHelper sample_every{1};
261 TEST(CordzUpdateTest, MoveAssignCord) {
262 CordzSamplingIntervalHelper sample_every{1};
266 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
269 TEST_P(CordzUpdateTest, AssignLargeArray) {
271 EXPECT_THAT(cord(), HasValidCordzInfoOf(Method::kAssignString));
274 TEST_P(CordzUpdateTest, AssignSmallArray) {
276 EXPECT_THAT(cord(), HasValidCordzInfoOf(Method::kAssignString));
279 TEST_P(CordzUpdateTest, AssignInlinedArray) {
284 TEST_P(CordzStringTest, AssignStringToInlined) {
288 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kAssignString));
292 TEST_P(CordzStringTest, AssignStringToCord) {
296 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
297 EXPECT_THAT(cord, CordzMethodCountEq(Method::kAssignString, 1));
301 TEST_P(CordzUpdateTest, AssignInlinedString) {
306 TEST_P(CordzUpdateTest, AppendCord) {
309 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendCord)));
312 TEST_P(CordzUpdateTest, MoveAppendCord) {
314 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendCord)));
317 TEST_P(CordzUpdateTest, AppendSmallArray) {
319 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendString)));
322 TEST_P(CordzUpdateTest, AppendLargeArray) {
324 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendString)));
327 TEST_P(CordzStringTest, AppendStringToEmpty) {
331 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kAppendString));
335 TEST_P(CordzStringTest, AppendStringToInlined) {
339 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kAppendString));
343 TEST_P(CordzStringTest, AppendStringToCord) {
346 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
347 EXPECT_THAT(cord, CordzMethodCountEq(Method::kAppendString, 1));
351 CordzSamplingIntervalHelper sample_every{1};
353 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kMakeCordFromExternal));
356 TEST(CordzTest, MakeCordFromEmptyExternal) {
357 CordzSamplingIntervalHelper sample_every{1};
362 TEST_P(CordzUpdateTest, PrependCord) {
365 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kPrependCord)));
368 TEST_P(CordzUpdateTest, PrependSmallArray) {
370 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kPrependString)));
373 TEST_P(CordzUpdateTest, PrependLargeArray) {
375 EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kPrependString)));
378 TEST_P(CordzStringTest, PrependStringToEmpty) {
382 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kPrependString));
386 TEST_P(CordzStringTest, PrependStringToInlined) {
390 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kPrependString));
394 TEST_P(CordzStringTest, PrependStringToCord) {
397 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
398 EXPECT_THAT(cord, CordzMethodCountEq(Method::kPrependString, 1));
402 CordzSamplingIntervalHelper sample_every(1);
406 cord.RemovePrefix(cord.size() / 2);
407 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
408 EXPECT_THAT(cord, CordzMethodCountEq(Method::kRemovePrefix, 1));
412 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
413 EXPECT_THAT(cord, CordzMethodCountEq(Method::kRemovePrefix, 2));
415 cord.RemovePrefix(cord.size());
420 CordzSamplingIntervalHelper sample_every(1);
424 cord.RemoveSuffix(cord.size() / 2);
425 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
426 EXPECT_THAT(cord, CordzMethodCountEq(Method::kRemoveSuffix, 1));
430 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString));
431 EXPECT_THAT(cord, CordzMethodCountEq(Method::kRemoveSuffix, 2));
433 cord.RemoveSuffix(cord.size());
437 TEST(CordzTest, SubCordFromUnsampledCord) {
438 CordzSamplingIntervalHelper sample_every{1};
440 Cord cord = src.Subcord(10, src.size() / 2);
444 TEST(CordzTest, SubCordFromSampledCord) {
445 CordzSamplingIntervalHelper sample_never{99999};
447 Cord cord = src.Subcord(10, src.size() / 2);
448 ASSERT_THAT(cord, HasValidCordzInfoOf(Method::kSubCord));
454 TEST(CordzTest, SmallSubCord) {
455 CordzSamplingIntervalHelper sample_never{99999};
458 EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kSubCord));
466 #endif // ABSL_INTERNAL_CORDZ_ENABLED