summaryrefslogtreecommitdiff
path: root/test/buildtool/multithreading/async_map.test.cpp
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2022-02-22 17:03:21 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2022-02-22 17:03:21 +0100
commit619def44c1cca9f3cdf63544d5f24f2c7a7d9b77 (patch)
tree01868de723cb82c86842f33743fa7b14e24c1fa3 /test/buildtool/multithreading/async_map.test.cpp
downloadjustbuild-619def44c1cca9f3cdf63544d5f24f2c7a7d9b77.tar.gz
Initial self-hosting commit
This is the initial version of our tool that is able to build itself. In can be bootstrapped by ./bin/bootstrap.py Co-authored-by: Oliver Reiche <oliver.reiche@huawei.com> Co-authored-by: Victor Moreno <victor.moreno1@huawei.com>
Diffstat (limited to 'test/buildtool/multithreading/async_map.test.cpp')
-rw-r--r--test/buildtool/multithreading/async_map.test.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/test/buildtool/multithreading/async_map.test.cpp b/test/buildtool/multithreading/async_map.test.cpp
new file mode 100644
index 00000000..bac7f031
--- /dev/null
+++ b/test/buildtool/multithreading/async_map.test.cpp
@@ -0,0 +1,58 @@
+#include <string>
+
+#include "catch2/catch.hpp"
+#include "src/buildtool/multithreading/async_map.hpp"
+#include "src/buildtool/multithreading/async_map_node.hpp"
+#include "src/buildtool/multithreading/task_system.hpp"
+
+TEST_CASE("Single-threaded: nodes only created once", "[async_map]") {
+ AsyncMap<std::string, int> map;
+ auto* key_node = map.GetOrCreateNode("key");
+ CHECK(key_node != nullptr);
+
+ auto* other_node = map.GetOrCreateNode("otherkey");
+ CHECK(other_node != nullptr);
+
+ auto* should_be_key_node = map.GetOrCreateNode("key");
+ CHECK(should_be_key_node != nullptr);
+
+ CHECK(key_node != other_node);
+ CHECK(key_node == should_be_key_node);
+}
+
+TEST_CASE("Nodes only created once and survive the map destruction",
+ "[async_map]") {
+
+ using NodePtr = typename AsyncMap<std::string, int>::NodePtr;
+ NodePtr key_node{nullptr};
+ NodePtr other_node{nullptr};
+ NodePtr should_be_key_node{nullptr};
+ {
+ AsyncMap<std::string, int> map;
+ {
+ TaskSystem ts;
+ ts.QueueTask([&key_node, &map]() {
+ auto* node = map.GetOrCreateNode("key");
+ CHECK(node != nullptr);
+ key_node = node;
+ });
+
+ ts.QueueTask([&other_node, &map]() {
+ auto* node = map.GetOrCreateNode("otherkey");
+ CHECK(node != nullptr);
+ other_node = node;
+ });
+
+ ts.QueueTask([&should_be_key_node, &map]() {
+ auto* node = map.GetOrCreateNode("key");
+ CHECK(node != nullptr);
+ should_be_key_node = node;
+ });
+ }
+ }
+ CHECK(key_node != nullptr);
+ CHECK(other_node != nullptr);
+ CHECK(should_be_key_node != nullptr);
+ CHECK(key_node != other_node);
+ CHECK(key_node == should_be_key_node);
+}