Merge branch 'release-4-6'
[alexxy/gromacs.git] / src / testutils / testfilemanager.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012, by the GROMACS development team, led by
5  * David van der Spoel, Berk Hess, Erik Lindahl, and including many
6  * others, as listed in the AUTHORS file in the top-level source
7  * 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 /*! \internal \file
36  * \brief
37  * Implements gmx::test::TestFileManager.
38  *
39  * \author Teemu Murtola <teemu.murtola@gmail.com>
40  * \ingroup module_testutils
41  */
42 #include "testfilemanager.h"
43
44 #include <cstdio>
45
46 #include <algorithm>
47 #include <set>
48 #include <string>
49
50 #include <gtest/gtest.h>
51
52 #include "gromacs/utility/gmxassert.h"
53 #include "gromacs/utility/path.h"
54
55 namespace gmx
56 {
57 namespace test
58 {
59
60 /********************************************************************
61  * TestFileManager::Impl
62  */
63
64 /*! \internal \brief
65  * Private implementation class for TestFileManager.
66  *
67  * \ingroup module_testutils
68  */
69 class TestFileManager::Impl
70 {
71     public:
72         //! Global test input data path set with setDataInputDirectory().
73         static const char *s_inputDirectory;
74
75         //! Container type for names of temporary files.
76         typedef std::set<std::string> FileNameList;
77
78         /*! \brief
79          * Try to remove all temporary files.
80          *
81          * Does not throw; errors (e.g., missing files) are silently ignored.
82          */
83         void removeFiles();
84
85         //! List of unique paths returned by getTemporaryFilePath().
86         FileNameList            files_;
87 };
88
89 const char *TestFileManager::Impl::s_inputDirectory = NULL;
90
91 void TestFileManager::Impl::removeFiles()
92 {
93     FileNameList::const_iterator i;
94     for (i = files_.begin(); i != files_.end(); ++i)
95     {
96         std::remove(i->c_str());
97     }
98     files_.clear();
99 }
100
101 /********************************************************************
102  * TestFileManager
103  */
104
105 TestFileManager::TestFileManager()
106     : impl_(new Impl)
107 {
108 }
109
110 TestFileManager::~TestFileManager()
111 {
112     impl_->removeFiles();
113 }
114
115 std::string TestFileManager::getTemporaryFilePath(const char *suffix)
116 {
117     // TODO: Add the path of the test binary
118     std::string filename = getTestSpecificFileName(suffix);
119     impl_->files_.insert(filename);
120     return filename;
121 }
122
123 std::string TestFileManager::getTestSpecificFileName(const char *suffix)
124 {
125     const ::testing::TestInfo *test_info =
126             ::testing::UnitTest::GetInstance()->current_test_info();
127     std::string                filename = std::string(test_info->test_case_name())
128         + "_" + test_info->name();
129     if (suffix[0] != '.')
130     {
131         filename.append("_");
132     }
133     filename.append(suffix);
134     std::replace(filename.begin(), filename.end(), '/', '_');
135     return filename;
136 }
137
138 std::string TestFileManager::getInputFilePath(const char *filename)
139 {
140     return Path::join(getInputDataDirectory(), filename);
141 }
142
143 const char *TestFileManager::getInputDataDirectory()
144 {
145     GMX_RELEASE_ASSERT(Impl::s_inputDirectory != NULL, "Test data path not set");
146     return Impl::s_inputDirectory;
147 }
148
149 void TestFileManager::setInputDataDirectory(const char *path)
150 {
151     // There is no need to protect this by a mutex, as this is called in early
152     // initialization of the tests.
153     GMX_RELEASE_ASSERT(Directory::exists(path),
154                        "Test data directory does not exist");
155     Impl::s_inputDirectory = path;
156 }
157
158 } // namespace test
159 } // namespace gmx