2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 2016,2019, by the GROMACS development team, led by
5 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6 * and including many others, as listed in the AUTHORS file in the
7 * top-level source directory and at http://www.gromacs.org.
9 * GROMACS is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * GROMACS is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with GROMACS; if not, see
21 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * If you want to redistribute modifications to GROMACS, please
25 * consider that scientific software is very special. Version
26 * control is crucial - bugs must be traceable. We will be happy to
27 * consider code for inclusion in the official distribution, but
28 * derived work must not be called official GROMACS. Details are found
29 * in the README & COPYING files - if they are missing, get the
30 * official version at http://www.gromacs.org.
32 * To help us fund GROMACS development, we humbly ask that you cite
33 * the research papers on the package. Check out http://www.gromacs.org.
37 #include "gromacs/utility/logger.h"
39 #include <gtest/gtest.h>
41 #include "gromacs/utility/loggerbuilder.h"
42 #include "gromacs/utility/stringstream.h"
44 #include "testutils/stringtest.h"
45 #include "testutils/testfilemanager.h"
50 //! Test fixture for logging tests.
51 typedef gmx::test::StringTestBase LoggerTest;
53 TEST_F(LoggerTest, EmptyLoggerWorks)
56 GMX_LOG(logger.info).appendText("foobar");
57 GMX_LOG(logger.warning).appendText("foobar").asParagraph();
58 GMX_LOG(logger.debug).appendText("foobaz");
59 GMX_LOG(logger.error).appendText("baz");
60 GMX_LOG(logger.verboseDebug).appendText("verbose");
63 TEST_F(LoggerTest, LogsToStream)
65 gmx::StringOutputStream stream;
66 gmx::LoggerBuilder builder;
67 builder.addTargetStream(gmx::MDLogger::LogLevel::VerboseDebug, &stream);
68 gmx::LoggerOwner owner = builder.build();
69 const gmx::MDLogger& logger = owner.logger();
70 GMX_LOG(logger.info).appendText("line");
71 GMX_LOG(logger.warning).appendText("par").asParagraph();
72 GMX_LOG(logger.info).appendText("line2");
73 GMX_LOG(logger.error).appendTextFormatted("%s", "formatted");
74 GMX_LOG(logger.debug).appendText("debugline");
75 GMX_LOG(logger.verboseDebug).appendText("verbose");
76 checkText(stream.toString(), "Output");
79 TEST_F(LoggerTest, LogsToFile)
81 gmx::test::TestFileManager files;
82 std::string filename(files.getTemporaryFilePath("log.txt"));
83 FILE* fp = fopen(filename.c_str(), "w");
85 gmx::LoggerBuilder builder;
86 builder.addTargetFile(gmx::MDLogger::LogLevel::VerboseDebug, fp);
87 gmx::LoggerOwner owner = builder.build();
88 const gmx::MDLogger& logger = owner.logger();
89 GMX_LOG(logger.info).appendText("line");
90 GMX_LOG(logger.warning).appendText("par").asParagraph();
91 GMX_LOG(logger.info).appendText("line2");
92 GMX_LOG(logger.error).appendTextFormatted("%s", "formatted");
93 GMX_LOG(logger.debug).appendText("debugline");
94 GMX_LOG(logger.verboseDebug).appendText("verbose");
97 checkFileContents(filename, "Output");
100 TEST_F(LoggerTest, LevelFilteringWorks)
102 gmx::StringOutputStream stream;
103 gmx::LoggerBuilder builder;
104 builder.addTargetStream(gmx::MDLogger::LogLevel::Warning, &stream);
105 gmx::LoggerOwner owner = builder.build();
106 const gmx::MDLogger& logger = owner.logger();
107 GMX_LOG(logger.info).appendText("line");
108 GMX_LOG(logger.warning).appendText("par").asParagraph();
109 GMX_LOG(logger.info).appendText("line2");
110 GMX_LOG(logger.error).appendTextFormatted("%s", "formatted");
111 GMX_LOG(logger.debug).appendText("debugline");
112 GMX_LOG(logger.verboseDebug).appendText("verbose");
113 checkText(stream.toString(), "Output");
116 TEST_F(LoggerTest, LogsToMultipleStreams)
118 gmx::StringOutputStream stream1;
119 gmx::StringOutputStream stream2;
120 gmx::StringOutputStream stream3;
121 gmx::StringOutputStream stream4;
122 gmx::StringOutputStream stream5;
123 gmx::LoggerBuilder builder;
124 builder.addTargetStream(gmx::MDLogger::LogLevel::Info, &stream1);
125 builder.addTargetStream(gmx::MDLogger::LogLevel::Warning, &stream2);
126 builder.addTargetStream(gmx::MDLogger::LogLevel::Error, &stream3);
127 builder.addTargetStream(gmx::MDLogger::LogLevel::Debug, &stream4);
128 builder.addTargetStream(gmx::MDLogger::LogLevel::VerboseDebug, &stream5);
129 gmx::LoggerOwner owner = builder.build();
130 const gmx::MDLogger& logger = owner.logger();
131 GMX_LOG(logger.info).appendText("line");
132 GMX_LOG(logger.warning).appendText("par").asParagraph();
133 GMX_LOG(logger.info).appendText("line2");
134 GMX_LOG(logger.error).appendTextFormatted("%s", "formatted");
135 GMX_LOG(logger.debug).appendText("debugline");
136 GMX_LOG(logger.verboseDebug).appendText("verbose");
138 checkText(stream1.toString(), "Output1");
139 checkText(stream2.toString(), "Output2");
140 checkText(stream3.toString(), "Output3");
141 checkText(stream4.toString(), "Output4");
142 checkText(stream5.toString(), "Output5");
145 TEST_F(LoggerTest, LogsToMultipleFiles)
147 gmx::test::TestFileManager files;
148 std::string filename1(files.getTemporaryFilePath("log.txt"));
149 std::string filename2(files.getTemporaryFilePath("warn.txt"));
150 std::string filename3(files.getTemporaryFilePath("error.txt"));
151 std::string filename4(files.getTemporaryFilePath("debug.txt"));
152 std::string filename5(files.getTemporaryFilePath("verboseDebug.txt"));
153 FILE* fp1 = fopen(filename1.c_str(), "w");
154 FILE* fp2 = fopen(filename2.c_str(), "w");
155 FILE* fp3 = fopen(filename3.c_str(), "w");
156 FILE* fp4 = fopen(filename4.c_str(), "w");
157 FILE* fp5 = fopen(filename5.c_str(), "w");
159 gmx::LoggerBuilder builder;
160 builder.addTargetFile(gmx::MDLogger::LogLevel::Info, fp1);
161 builder.addTargetFile(gmx::MDLogger::LogLevel::Warning, fp2);
162 builder.addTargetFile(gmx::MDLogger::LogLevel::Error, fp3);
163 builder.addTargetFile(gmx::MDLogger::LogLevel::Debug, fp4);
164 builder.addTargetFile(gmx::MDLogger::LogLevel::VerboseDebug, fp5);
165 gmx::LoggerOwner owner = builder.build();
166 const gmx::MDLogger& logger = owner.logger();
167 GMX_LOG(logger.info).appendText("line");
168 GMX_LOG(logger.warning).appendText("par").asParagraph();
169 GMX_LOG(logger.info).appendText("line2");
170 GMX_LOG(logger.error).appendTextFormatted("%s", "formatted");
171 GMX_LOG(logger.debug).appendText("debugline");
172 GMX_LOG(logger.verboseDebug).appendText("verbose");
179 checkFileContents(filename1, "Output1");
180 checkFileContents(filename2, "Output2");
181 checkFileContents(filename3, "Output3");
182 checkFileContents(filename4, "Output4");
183 checkFileContents(filename5, "Output5");
186 TEST_F(LoggerTest, LogsToStreamAndFile)
188 gmx::test::TestFileManager files;
189 gmx::StringOutputStream stream;
190 std::string filename(files.getTemporaryFilePath("verboseDebug.txt"));
191 FILE* fp = fopen(filename.c_str(), "w");
193 gmx::LoggerBuilder builder;
194 builder.addTargetFile(gmx::MDLogger::LogLevel::VerboseDebug, fp);
195 builder.addTargetStream(gmx::MDLogger::LogLevel::VerboseDebug, &stream);
196 gmx::LoggerOwner owner = builder.build();
197 const gmx::MDLogger& logger = owner.logger();
198 GMX_LOG(logger.info).appendText("line");
199 GMX_LOG(logger.warning).appendText("par").asParagraph();
200 GMX_LOG(logger.info).appendText("line2");
201 GMX_LOG(logger.error).appendTextFormatted("%s", "formatted");
202 GMX_LOG(logger.debug).appendText("debugline");
203 GMX_LOG(logger.verboseDebug).appendText("verbose");
206 checkText(stream.toString(), "OutputStream");
207 checkFileContents(filename, "OutputFile");