Merge release-4-6 into master
[alexxy/gromacs.git] / src / testutils / testfilemanager.cpp
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
9  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11  * Copyright (c) 2001-2009, The GROMACS development team,
12  * check out http://www.gromacs.org for more information.
13
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  *
19  * If you want to redistribute modifications, please consider that
20  * scientific software is very special. Version control is crucial -
21  * bugs must be traceable. We will be happy to consider code for
22  * inclusion in the official distribution, but derived work must not
23  * be called official GROMACS. Details are found in the README & COPYING
24  * files - if they are missing, get the official version at www.gromacs.org.
25  *
26  * To help us fund GROMACS development, we humbly ask that you cite
27  * the papers on the package - you can find them in the top README file.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \internal \file
32  * \brief
33  * Implements gmx::test::TestFileManager.
34  *
35  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36  * \ingroup module_testutils
37  */
38 #include "testfilemanager.h"
39
40 #include <cstdio>
41
42 #include <algorithm>
43 #include <set>
44 #include <string>
45
46 #include <gtest/gtest.h>
47
48 #include "gromacs/utility/gmxassert.h"
49 #include "gromacs/utility/path.h"
50
51 namespace gmx
52 {
53 namespace test
54 {
55
56 /********************************************************************
57  * TestFileManager::Impl
58  */
59
60 /*! \internal \brief
61  * Private implementation class for TestFileManager.
62  *
63  * \ingroup module_testutils
64  */
65 class TestFileManager::Impl
66 {
67     public:
68         //! Global test input data path set with setDataInputDirectory().
69         static const char *s_inputDirectory;
70
71         //! Container type for names of temporary files.
72         typedef std::set<std::string> FileNameList;
73
74         /*! \brief
75          * Try to remove all temporary files.
76          *
77          * Does not throw; errors (e.g., missing files) are silently ignored.
78          */
79         void removeFiles();
80
81         //! List of unique paths returned by getTemporaryFilePath().
82         FileNameList            files_;
83 };
84
85 const char *TestFileManager::Impl::s_inputDirectory = NULL;
86
87 void TestFileManager::Impl::removeFiles()
88 {
89     FileNameList::const_iterator i;
90     for (i = files_.begin(); i != files_.end(); ++i)
91     {
92         std::remove(i->c_str());
93     }
94     files_.clear();
95 }
96
97 /********************************************************************
98  * TestFileManager
99  */
100
101 TestFileManager::TestFileManager()
102     : impl_(new Impl)
103 {
104 }
105
106 TestFileManager::~TestFileManager()
107 {
108     impl_->removeFiles();
109 }
110
111 std::string TestFileManager::getTemporaryFilePath(const char *suffix)
112 {
113     // TODO: Add the path of the test binary
114     std::string filename = getTestSpecificFileName(suffix);
115     impl_->files_.insert(filename);
116     return filename;
117 }
118
119 std::string TestFileManager::getTestSpecificFileName(const char *suffix)
120 {
121     const ::testing::TestInfo *test_info =
122         ::testing::UnitTest::GetInstance()->current_test_info();
123     std::string filename = std::string(test_info->test_case_name())
124         + "_" + test_info->name();
125     if (suffix[0] != '.')
126     {
127         filename.append("_");
128     }
129     filename.append(suffix);
130     std::replace(filename.begin(), filename.end(), '/', '_');
131     return filename;
132 }
133
134 std::string TestFileManager::getInputFilePath(const char *filename)
135 {
136     return Path::join(getInputDataDirectory(), filename);
137 }
138
139 const char *TestFileManager::getInputDataDirectory()
140 {
141     GMX_RELEASE_ASSERT(Impl::s_inputDirectory != NULL, "Test data path not set");
142     return Impl::s_inputDirectory;
143 }
144
145 void TestFileManager::setInputDataDirectory(const char *path)
146 {
147     // There is no need to protect this by a mutex, as this is called in early
148     // initialization of the tests.
149     GMX_RELEASE_ASSERT(Directory::exists(path),
150                        "Test data directory does not exist");
151     Impl::s_inputDirectory = path;
152 }
153
154 } // namespace test
155 } // namespace gmx