Path: blob/main/contrib/kyua/utils/logging/operations_test.cpp
48178 views
// Copyright 2011 The Kyua Authors.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above copyright10// notice, this list of conditions and the following disclaimer in the11// documentation and/or other materials provided with the distribution.12// * Neither the name of Google Inc. nor the names of its contributors13// may be used to endorse or promote products derived from this software14// without specific prior written permission.15//16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2728#include "utils/logging/operations.hpp"2930extern "C" {31#include <unistd.h>32}3334#include <fstream>35#include <string>3637#include <atf-c++.hpp>3839#include "utils/datetime.hpp"40#include "utils/format/macros.hpp"41#include "utils/fs/operations.hpp"42#include "utils/fs/path.hpp"4344namespace datetime = utils::datetime;45namespace fs = utils::fs;46namespace logging = utils::logging;474849ATF_TEST_CASE_WITHOUT_HEAD(generate_log_name__before_log);50ATF_TEST_CASE_BODY(generate_log_name__before_log)51{52datetime::set_mock_now(2011, 2, 21, 18, 10, 0, 0);53ATF_REQUIRE_EQ(fs::path("/some/dir/foobar.20110221-181000.log"),54logging::generate_log_name(fs::path("/some/dir"), "foobar"));5556datetime::set_mock_now(2011, 2, 21, 18, 10, 1, 987654);57logging::log(logging::level_info, "file", 123, "A message");5859datetime::set_mock_now(2011, 2, 21, 18, 10, 2, 123);60ATF_REQUIRE_EQ(fs::path("/some/dir/foobar.20110221-181000.log"),61logging::generate_log_name(fs::path("/some/dir"), "foobar"));62}636465ATF_TEST_CASE_WITHOUT_HEAD(generate_log_name__after_log);66ATF_TEST_CASE_BODY(generate_log_name__after_log)67{68datetime::set_mock_now(2011, 2, 21, 18, 15, 0, 0);69logging::log(logging::level_info, "file", 123, "A message");70datetime::set_mock_now(2011, 2, 21, 18, 15, 1, 987654);71logging::log(logging::level_info, "file", 123, "A message");7273datetime::set_mock_now(2011, 2, 21, 18, 15, 2, 123);74ATF_REQUIRE_EQ(fs::path("/some/dir/foobar.20110221-181500.log"),75logging::generate_log_name(fs::path("/some/dir"), "foobar"));7677datetime::set_mock_now(2011, 2, 21, 18, 15, 3, 1);78logging::log(logging::level_info, "file", 123, "A message");7980datetime::set_mock_now(2011, 2, 21, 18, 15, 4, 91);81ATF_REQUIRE_EQ(fs::path("/some/dir/foobar.20110221-181500.log"),82logging::generate_log_name(fs::path("/some/dir"), "foobar"));83}848586ATF_TEST_CASE_WITHOUT_HEAD(log);87ATF_TEST_CASE_BODY(log)88{89logging::set_inmemory();9091datetime::set_mock_now(2011, 2, 21, 18, 10, 0, 0);92logging::log(logging::level_debug, "f1", 1, "Debug message");9394datetime::set_mock_now(2011, 2, 21, 18, 10, 1, 987654);95logging::log(logging::level_error, "f2", 2, "Error message");9697logging::set_persistency("debug", fs::path("test.log"));9899datetime::set_mock_now(2011, 2, 21, 18, 10, 2, 123);100logging::log(logging::level_info, "f3", 3, "Info message");101102datetime::set_mock_now(2011, 2, 21, 18, 10, 3, 456);103logging::log(logging::level_warning, "f4", 4, "Warning message");104105std::ifstream input("test.log");106ATF_REQUIRE(input);107108const pid_t pid = ::getpid();109110std::string line;111ATF_REQUIRE(std::getline(input, line).good());112ATF_REQUIRE_EQ(113(F("20110221-181000 D %s f1:1: Debug message") % pid).str(), line);114ATF_REQUIRE(std::getline(input, line).good());115ATF_REQUIRE_EQ(116(F("20110221-181001 E %s f2:2: Error message") % pid).str(), line);117ATF_REQUIRE(std::getline(input, line).good());118ATF_REQUIRE_EQ(119(F("20110221-181002 I %s f3:3: Info message") % pid).str(), line);120ATF_REQUIRE(std::getline(input, line).good());121ATF_REQUIRE_EQ(122(F("20110221-181003 W %s f4:4: Warning message") % pid).str(), line);123}124125126ATF_TEST_CASE_WITHOUT_HEAD(set_inmemory__reset);127ATF_TEST_CASE_BODY(set_inmemory__reset)128{129logging::set_persistency("debug", fs::path("test.log"));130131datetime::set_mock_now(2011, 2, 21, 18, 20, 0, 654321);132logging::log(logging::level_debug, "file", 123, "Debug message");133logging::set_inmemory();134logging::log(logging::level_debug, "file", 123, "Debug message 2");135136std::ifstream input("test.log");137ATF_REQUIRE(input);138139const pid_t pid = ::getpid();140141std::string line;142ATF_REQUIRE(std::getline(input, line).good());143ATF_REQUIRE_EQ(144(F("20110221-182000 D %s file:123: Debug message") % pid).str(), line);145}146147148ATF_TEST_CASE_WITHOUT_HEAD(set_persistency__no_backlog);149ATF_TEST_CASE_BODY(set_persistency__no_backlog)150{151logging::set_persistency("debug", fs::path("test.log"));152153datetime::set_mock_now(2011, 2, 21, 18, 20, 0, 654321);154logging::log(logging::level_debug, "file", 123, "Debug message");155156std::ifstream input("test.log");157ATF_REQUIRE(input);158159const pid_t pid = ::getpid();160161std::string line;162ATF_REQUIRE(std::getline(input, line).good());163ATF_REQUIRE_EQ(164(F("20110221-182000 D %s file:123: Debug message") % pid).str(), line);165}166167168/// Creates a log for testing purposes, buffering messages on start.169///170/// \param level The level of the desired log.171/// \param path The output file.172static void173create_log(const std::string& level, const std::string& path)174{175logging::set_inmemory();176177datetime::set_mock_now(2011, 3, 19, 11, 40, 0, 100);178logging::log(logging::level_debug, "file1", 11, "Debug 1");179180datetime::set_mock_now(2011, 3, 19, 11, 40, 1, 200);181logging::log(logging::level_error, "file2", 22, "Error 1");182183datetime::set_mock_now(2011, 3, 19, 11, 40, 2, 300);184logging::log(logging::level_info, "file3", 33, "Info 1");185186datetime::set_mock_now(2011, 3, 19, 11, 40, 3, 400);187logging::log(logging::level_warning, "file4", 44, "Warning 1");188189logging::set_persistency(level, fs::path(path));190191datetime::set_mock_now(2011, 3, 19, 11, 40, 4, 500);192logging::log(logging::level_debug, "file1", 11, "Debug 2");193194datetime::set_mock_now(2011, 3, 19, 11, 40, 5, 600);195logging::log(logging::level_error, "file2", 22, "Error 2");196197datetime::set_mock_now(2011, 3, 19, 11, 40, 6, 700);198logging::log(logging::level_info, "file3", 33, "Info 2");199200datetime::set_mock_now(2011, 3, 19, 11, 40, 7, 800);201logging::log(logging::level_warning, "file4", 44, "Warning 2");202}203204205ATF_TEST_CASE_WITHOUT_HEAD(set_persistency__some_backlog__debug);206ATF_TEST_CASE_BODY(set_persistency__some_backlog__debug)207{208create_log("debug", "test.log");209210std::ifstream input("test.log");211ATF_REQUIRE(input);212213const pid_t pid = ::getpid();214215std::string line;216ATF_REQUIRE(std::getline(input, line).good());217ATF_REQUIRE_EQ(218(F("20110319-114000 D %s file1:11: Debug 1") % pid).str(), line);219ATF_REQUIRE(std::getline(input, line).good());220ATF_REQUIRE_EQ(221(F("20110319-114001 E %s file2:22: Error 1") % pid).str(), line);222ATF_REQUIRE(std::getline(input, line).good());223ATF_REQUIRE_EQ(224(F("20110319-114002 I %s file3:33: Info 1") % pid).str(), line);225ATF_REQUIRE(std::getline(input, line).good());226ATF_REQUIRE_EQ(227(F("20110319-114003 W %s file4:44: Warning 1") % pid).str(), line);228ATF_REQUIRE(std::getline(input, line).good());229ATF_REQUIRE_EQ(230(F("20110319-114004 D %s file1:11: Debug 2") % pid).str(), line);231ATF_REQUIRE(std::getline(input, line).good());232ATF_REQUIRE_EQ(233(F("20110319-114005 E %s file2:22: Error 2") % pid).str(), line);234ATF_REQUIRE(std::getline(input, line).good());235ATF_REQUIRE_EQ(236(F("20110319-114006 I %s file3:33: Info 2") % pid).str(), line);237ATF_REQUIRE(std::getline(input, line).good());238ATF_REQUIRE_EQ(239(F("20110319-114007 W %s file4:44: Warning 2") % pid).str(), line);240}241242243ATF_TEST_CASE_WITHOUT_HEAD(set_persistency__some_backlog__error);244ATF_TEST_CASE_BODY(set_persistency__some_backlog__error)245{246create_log("error", "test.log");247248std::ifstream input("test.log");249ATF_REQUIRE(input);250251const pid_t pid = ::getpid();252253std::string line;254ATF_REQUIRE(std::getline(input, line).good());255ATF_REQUIRE_EQ(256(F("20110319-114001 E %s file2:22: Error 1") % pid).str(), line);257ATF_REQUIRE(std::getline(input, line).good());258ATF_REQUIRE_EQ(259(F("20110319-114005 E %s file2:22: Error 2") % pid).str(), line);260}261262263ATF_TEST_CASE_WITHOUT_HEAD(set_persistency__some_backlog__info);264ATF_TEST_CASE_BODY(set_persistency__some_backlog__info)265{266create_log("info", "test.log");267268std::ifstream input("test.log");269ATF_REQUIRE(input);270271const pid_t pid = ::getpid();272273std::string line;274ATF_REQUIRE(std::getline(input, line).good());275ATF_REQUIRE_EQ(276(F("20110319-114001 E %s file2:22: Error 1") % pid).str(), line);277ATF_REQUIRE(std::getline(input, line).good());278ATF_REQUIRE_EQ(279(F("20110319-114002 I %s file3:33: Info 1") % pid).str(), line);280ATF_REQUIRE(std::getline(input, line).good());281ATF_REQUIRE_EQ(282(F("20110319-114003 W %s file4:44: Warning 1") % pid).str(), line);283ATF_REQUIRE(std::getline(input, line).good());284ATF_REQUIRE_EQ(285(F("20110319-114005 E %s file2:22: Error 2") % pid).str(), line);286ATF_REQUIRE(std::getline(input, line).good());287ATF_REQUIRE_EQ(288(F("20110319-114006 I %s file3:33: Info 2") % pid).str(), line);289ATF_REQUIRE(std::getline(input, line).good());290ATF_REQUIRE_EQ(291(F("20110319-114007 W %s file4:44: Warning 2") % pid).str(), line);292}293294295ATF_TEST_CASE_WITHOUT_HEAD(set_persistency__some_backlog__warning);296ATF_TEST_CASE_BODY(set_persistency__some_backlog__warning)297{298create_log("warning", "test.log");299300std::ifstream input("test.log");301ATF_REQUIRE(input);302303const pid_t pid = ::getpid();304305std::string line;306ATF_REQUIRE(std::getline(input, line).good());307ATF_REQUIRE_EQ(308(F("20110319-114001 E %s file2:22: Error 1") % pid).str(), line);309ATF_REQUIRE(std::getline(input, line).good());310ATF_REQUIRE_EQ(311(F("20110319-114003 W %s file4:44: Warning 1") % pid).str(), line);312ATF_REQUIRE(std::getline(input, line).good());313ATF_REQUIRE_EQ(314(F("20110319-114005 E %s file2:22: Error 2") % pid).str(), line);315ATF_REQUIRE(std::getline(input, line).good());316ATF_REQUIRE_EQ(317(F("20110319-114007 W %s file4:44: Warning 2") % pid).str(), line);318}319320321ATF_TEST_CASE(set_persistency__fail);322ATF_TEST_CASE_HEAD(set_persistency__fail)323{324set_md_var("require.user", "unprivileged");325}326ATF_TEST_CASE_BODY(set_persistency__fail)327{328ATF_REQUIRE_THROW_RE(std::range_error, "'foobar'",329logging::set_persistency("foobar", fs::path("log")));330331fs::mkdir(fs::path("dir"), 0644);332ATF_REQUIRE_THROW_RE(std::runtime_error, "dir/fail.log",333logging::set_persistency("debug",334fs::path("dir/fail.log")));335}336337338ATF_INIT_TEST_CASES(tcs)339{340ATF_ADD_TEST_CASE(tcs, generate_log_name__before_log);341ATF_ADD_TEST_CASE(tcs, generate_log_name__after_log);342343ATF_ADD_TEST_CASE(tcs, log);344345ATF_ADD_TEST_CASE(tcs, set_inmemory__reset);346347ATF_ADD_TEST_CASE(tcs, set_persistency__no_backlog);348ATF_ADD_TEST_CASE(tcs, set_persistency__some_backlog__debug);349ATF_ADD_TEST_CASE(tcs, set_persistency__some_backlog__error);350ATF_ADD_TEST_CASE(tcs, set_persistency__some_backlog__info);351ATF_ADD_TEST_CASE(tcs, set_persistency__some_backlog__warning);352ATF_ADD_TEST_CASE(tcs, set_persistency__fail);353}354355356