SYCL: Avoid using no_init read accessor in rocFFT
[alexxy/gromacs.git] / src / gromacs / utility / tests / logger.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
8  *
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.
13  *
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.
18  *
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.
23  *
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.
31  *
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.
34  */
35 #include "gmxpre.h"
36
37 #include "gromacs/utility/logger.h"
38
39 #include <gtest/gtest.h>
40
41 #include "gromacs/utility/loggerbuilder.h"
42 #include "gromacs/utility/stringstream.h"
43
44 #include "testutils/stringtest.h"
45 #include "testutils/testfilemanager.h"
46
47 namespace
48 {
49
50 //! Test fixture for logging tests.
51 typedef gmx::test::StringTestBase LoggerTest;
52
53 TEST_F(LoggerTest, EmptyLoggerWorks)
54 {
55     gmx::MDLogger logger;
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");
61 }
62
63 TEST_F(LoggerTest, LogsToStream)
64 {
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");
77 }
78
79 TEST_F(LoggerTest, LogsToFile)
80 {
81     gmx::test::TestFileManager files;
82     std::string                filename(files.getTemporaryFilePath("log.txt"));
83     FILE*                      fp = fopen(filename.c_str(), "w");
84     {
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");
95     }
96     fclose(fp);
97     checkFileContents(filename, "Output");
98 }
99
100 TEST_F(LoggerTest, LevelFilteringWorks)
101 {
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");
114 }
115
116 TEST_F(LoggerTest, LogsToMultipleStreams)
117 {
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");
137
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");
143 }
144
145 TEST_F(LoggerTest, LogsToMultipleFiles)
146 {
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");
158     {
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");
173     }
174     fclose(fp1);
175     fclose(fp2);
176     fclose(fp3);
177     fclose(fp4);
178     fclose(fp5);
179     checkFileContents(filename1, "Output1");
180     checkFileContents(filename2, "Output2");
181     checkFileContents(filename3, "Output3");
182     checkFileContents(filename4, "Output4");
183     checkFileContents(filename5, "Output5");
184 }
185
186 TEST_F(LoggerTest, LogsToStreamAndFile)
187 {
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");
192     {
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");
204     }
205     fclose(fp);
206     checkText(stream.toString(), "OutputStream");
207     checkFileContents(filename, "OutputFile");
208 }
209
210 } // namespace