summaryrefslogtreecommitdiffstats
path: root/src/tests/log-switch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/log-switch.cpp')
-rw-r--r--src/tests/log-switch.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/tests/log-switch.cpp b/src/tests/log-switch.cpp
new file mode 100644
index 0000000..1a83b83
--- /dev/null
+++ b/src/tests/log-switch.cpp
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2018-2019 [Ribose Inc](https://www.ribose.com).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "rnp_tests.h"
+#include "support.h"
+
+static const char LOGTEST_FILENAME[] = "logtest.log";
+
+TEST_F(rnp_tests, test_log_switch)
+{
+ FILE *stream = fopen(LOGTEST_FILENAME, "w");
+ assert_non_null(stream);
+ bool saved_rnp_log_switch = rnp_log_switch();
+
+ // reset _rnp_log_switch manually
+ set_rnp_log_switch(0);
+ RNP_LOG_FD(stream, "x");
+ fflush(stream);
+ assert_int_equal(0, ftell(stream)); // nothing was written
+
+ // enable _rnp_log_switch manually
+ set_rnp_log_switch(1);
+ RNP_LOG_FD(stream, "x");
+ fflush(stream);
+ assert_int_not_equal(0, ftell(stream)); // something was written
+
+ fclose(stream);
+ assert_int_equal(0, rnp_unlink(LOGTEST_FILENAME));
+
+ stream = fopen(LOGTEST_FILENAME, "w");
+ assert_non_null(stream);
+
+ const char *saved_env = getenv(RNP_LOG_CONSOLE);
+
+ // let _rnp_log_switch initialize to 0 from unset environment variable
+ assert_int_equal(0, unsetenv(RNP_LOG_CONSOLE));
+ set_rnp_log_switch(-1);
+ RNP_LOG_FD(stream, "x");
+ fflush(stream);
+ assert_int_equal(0, ftell(stream)); // nothing was written
+
+ // let _rnp_log_switch initialize to 0 from environment variable "0"
+ setenv(RNP_LOG_CONSOLE, "0", 1);
+ set_rnp_log_switch(-1);
+ RNP_LOG_FD(stream, "x");
+ fflush(stream);
+ assert_int_equal(0, ftell(stream)); // nothing was written
+
+ // let _rnp_log_switch initialize to 1 from environment variable "1"
+ setenv(RNP_LOG_CONSOLE, "1", 1);
+ set_rnp_log_switch(-1);
+ RNP_LOG_FD(stream, "x");
+ fflush(stream);
+ assert_int_not_equal(0, ftell(stream)); // something was written
+
+ // restore environment variable
+ if (saved_env) {
+ assert_int_equal(0, setenv(RNP_LOG_CONSOLE, saved_env, 1));
+ } else {
+ unsetenv(RNP_LOG_CONSOLE);
+ }
+
+ // check temporary stopping of logging
+ fclose(stream);
+ assert_int_equal(0, rnp_unlink(LOGTEST_FILENAME));
+ stream = fopen(LOGTEST_FILENAME, "w");
+
+ set_rnp_log_switch(0);
+ // make sure it will not allow logging
+ rnp_log_continue();
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ assert_int_equal(0, ftell(stream));
+ // make sure logging was temporary stopped
+ set_rnp_log_switch(1);
+ rnp_log_stop();
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ assert_int_equal(0, ftell(stream));
+ // make sure logging continued
+ rnp_log_continue();
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ auto sz = ftell(stream);
+ assert_int_not_equal(0, sz);
+ {
+ // check C++ object helper
+ rnp::LogStop log_stop;
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ assert_int_equal(sz, ftell(stream));
+ }
+ // make sure this continues logging
+ {
+ // check C++ object helper
+ rnp::LogStop log_stop(false);
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ assert_true(sz < ftell(stream));
+ sz = ftell(stream);
+ }
+ // combine multiple log_stop calls
+ rnp_log_stop();
+ {
+ rnp::LogStop log_stop;
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ assert_int_equal(sz, ftell(stream));
+ }
+ // this should continue logging
+ rnp_log_continue();
+ RNP_LOG_FD(stream, "y");
+ fflush(stream);
+ auto sz2 = ftell(stream);
+ assert_int_not_equal(sz2, sz);
+ assert_true(sz2 > sz);
+
+ // restore _rnp_log_switch
+ set_rnp_log_switch(saved_rnp_log_switch ? 1 : 0);
+
+ fclose(stream);
+ assert_int_equal(0, rnp_unlink(LOGTEST_FILENAME));
+}