summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/tdutils/test/SharedSlice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/tdutils/test/SharedSlice.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/tdutils/test/SharedSlice.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/tdutils/test/SharedSlice.cpp b/protocols/Telegram/tdlib/td/tdutils/test/SharedSlice.cpp
new file mode 100644
index 0000000000..7327f0dbb3
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/tdutils/test/SharedSlice.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#include "td/utils/common.h"
+#include "td/utils/port/thread.h"
+#include "td/utils/SharedSlice.h"
+#include "td/utils/tests.h"
+
+char disable_linker_warning_about_empty_file_tdutils_test_shared_slice_cpp TD_UNUSED;
+
+#if !TD_THREAD_UNSUPPORTED
+TEST(SharedSlice, Hands) {
+ {
+ td::SharedSlice h("hello");
+ ASSERT_EQ("hello", h.as_slice());
+ // auto g = h; // CE
+ auto g = h.clone();
+ ASSERT_EQ("hello", h.as_slice());
+ ASSERT_EQ("hello", g.as_slice());
+ }
+
+ {
+ td::SharedSlice h("hello");
+ td::UniqueSharedSlice g(std::move(h));
+ ASSERT_EQ("", h.as_slice());
+ ASSERT_EQ("hello", g.as_slice());
+ }
+ {
+ td::SharedSlice h("hello");
+ td::SharedSlice t = h.clone();
+ td::UniqueSharedSlice g(std::move(h));
+ ASSERT_EQ("", h.as_slice());
+ ASSERT_EQ("hello", g.as_slice());
+ ASSERT_EQ("hello", t.as_slice());
+ }
+
+ {
+ td::UniqueSharedSlice g(5);
+ g.as_mutable_slice().copy_from("hello");
+ td::SharedSlice h(std::move(g));
+ ASSERT_EQ("hello", h);
+ ASSERT_EQ("", g);
+ }
+
+ {
+ td::UniqueSlice h("hello");
+ td::UniqueSlice g(std::move(h));
+ ASSERT_EQ("", h.as_slice());
+ ASSERT_EQ("hello", g.as_slice());
+ }
+
+ {
+ td::SecureString h("hello");
+ td::SecureString g(std::move(h));
+ ASSERT_EQ("", h.as_slice());
+ ASSERT_EQ("hello", g.as_slice());
+ }
+
+ {
+ td::Stage stage;
+ td::SharedSlice a;
+ td::SharedSlice b;
+ td::vector<td::thread> threads(2);
+ for (int i = 0; i < 2; i++) {
+ threads[i] = td::thread([i, &stage, &a, &b] {
+ for (int j = 0; j < 10000; j++) {
+ if (i == 0) {
+ a = td::SharedSlice("hello");
+ b = a.clone();
+ }
+ stage.wait((2 * j + 1) * 2);
+ if (i == 0) {
+ ASSERT_EQ('h', a[0]);
+ a.clear();
+ } else {
+ td::UniqueSharedSlice c(std::move(b));
+ c.as_mutable_slice()[0] = '!';
+ }
+ stage.wait((2 * j + 2) * 2);
+ }
+ });
+ }
+ for (auto &thread : threads) {
+ thread.join();
+ }
+ }
+}
+#endif