summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/issue
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2021-10-06 17:10:17 +0000
committerHåvard Pettersen <havardpe@oath.com>2021-10-07 09:47:42 +0000
commite1a26413bd20ef269d53dc56552a8d8809ab4e58 (patch)
treef866cb22f63f765bb1fb2f259ada9d5d014f04b0 /vespalib/src/tests/issue
parentf63d33eb7a47c3bfd80229098a71eae1b3b48300 (diff)
capture issues by binding handlers to threads
Diffstat (limited to 'vespalib/src/tests/issue')
-rw-r--r--vespalib/src/tests/issue/CMakeLists.txt9
-rw-r--r--vespalib/src/tests/issue/issue_test.cpp68
2 files changed, 77 insertions, 0 deletions
diff --git a/vespalib/src/tests/issue/CMakeLists.txt b/vespalib/src/tests/issue/CMakeLists.txt
new file mode 100644
index 00000000000..7c8147979d7
--- /dev/null
+++ b/vespalib/src/tests/issue/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_issue_test_app TEST
+ SOURCES
+ issue_test.cpp
+ DEPENDS
+ vespalib
+ GTest::GTest
+)
+vespa_add_test(NAME vespalib_issue_test_app COMMAND vespalib_issue_test_app)
diff --git a/vespalib/src/tests/issue/issue_test.cpp b/vespalib/src/tests/issue/issue_test.cpp
new file mode 100644
index 00000000000..01b151da482
--- /dev/null
+++ b/vespalib/src/tests/issue/issue_test.cpp
@@ -0,0 +1,68 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/util/issue.h>
+#include <vespa/vespalib/gtest/gtest.h>
+
+using namespace vespalib;
+
+struct MyHandler : Issue::Handler {
+ std::vector<vespalib::string> list;
+ void handle(const Issue &issue) override {
+ list.push_back(issue.message());
+ }
+};
+
+std::vector<vespalib::string> make_list(std::vector<vespalib::string> list) {
+ return list;
+}
+
+TEST(IssueTest, log_issue_not_captured) {
+ Issue::report(Issue("this should be logged"));
+}
+
+TEST(IssueTest, capture_an_issue) {
+ MyHandler my_handler;
+ {
+ Issue::report(Issue("this should be logged"));
+ Issue::Binding my_binding = Issue::listen(my_handler);
+ Issue::report(Issue("this should be captured"));
+ }
+ Issue::report(Issue("this should also be logged"));
+ EXPECT_EQ(my_handler.list, make_list({"this should be captured"}));
+}
+
+TEST(IssueTest, capture_issues_with_nested_bindings) {
+ MyHandler my_handler1;
+ MyHandler my_handler2;
+ {
+ Issue::report(Issue("this should be logged"));
+ auto my_binding1 = Issue::listen(my_handler1);
+ Issue::report(Issue("issue1"));
+ {
+ auto my_binding2 = Issue::listen(my_handler2);
+ Issue::report(Issue("issue2"));
+ }
+ Issue::report(Issue("issue3"));
+ }
+ Issue::report(Issue("this should also be logged"));
+ EXPECT_EQ(my_handler1.list, make_list({"issue1", "issue3"}));
+ EXPECT_EQ(my_handler2.list, make_list({"issue2"}));
+}
+
+TEST(IssueTest, handler_can_be_bound_multiple_times) {
+ MyHandler my_handler;
+ {
+ Issue::report(Issue("this should be logged"));
+ auto my_binding1 = Issue::listen(my_handler);
+ Issue::report(Issue("issue1"));
+ {
+ auto my_binding2 = Issue::listen(my_handler);
+ Issue::report(Issue("issue2"));
+ }
+ Issue::report(Issue("issue3"));
+ }
+ Issue::report(Issue("this should also be logged"));
+ EXPECT_EQ(my_handler.list, make_list({"issue1", "issue2", "issue3"}));
+}
+
+GTEST_MAIN_RUN_ALL_TESTS()