4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief ConfigFile unit tests */
31 //#include "ConfigFile.test.hh"
32 //#include "ConfigFile.test.ih"
37 #include <boost/filesystem/operations.hpp>
39 #include <senf/Utils/auto_unit_test.hh>
40 #include <boost/test/test_tools.hpp>
43 //-/////////////////////////////////////////////////////////////////////////////////////////////////
50 void fun1(int v) { var1 = v; }
51 void fun2() { var2 = true; }
56 TempFile(std::string const & name) : name_ (name), file_ (name_.c_str()) {}
57 ~TempFile() { file_.close(); boost::filesystem::remove(name_); }
59 template <class T> TempFile & operator<<(T const & v) { file_ << v; return *this; }
60 enum Closer { close }; void operator<<(Closer) { file_.close(); }
61 std::string const & name() { return name_; }
70 #define SENF_CHECK_THROW_SYSTEMEXCEPTION( expr, errorNumber, msg) \
72 BOOST_TEST_PASSPOINT(); \
74 BOOST_ERROR( "senf::SystemException is expected"); \
75 } catch( senf::SystemException const & ex ) { \
76 BOOST_CHECK( ex.anyOf( errorNumber)); \
77 BOOST_CHECK( ex.message().find(msg) != std::string::npos); \
81 SENF_AUTO_UNIT_TEST(configFile)
83 namespace fty = senf::console::factory;
85 TempFile cfgf ("test.cfg");
86 cfgf << "dir1/fun1 10;\n"
89 senf::console::ScopedDirectory<> dir1;
90 senf::console::root().add("dir1", dir1);
91 dir1.add("fun1",fty::Command(&fun1));
94 senf::console::ConfigFile cfg (cfgf.name());
97 SENF_CHECK_NO_THROW( cfg.parse() );
98 BOOST_CHECK_EQUAL( var1, 10 );
101 SENF_CHECK_NO_THROW( cfg.parse() );
102 BOOST_CHECK_EQUAL( var1, 0 );
106 SENF_CHECK_NO_THROW( cfg.parse() );
107 BOOST_CHECK_EQUAL( var1, 10 );
111 senf::console::ConfigFile cfg ("i don't exist");
112 SENF_CHECK_THROW_SYSTEMEXCEPTION(cfg.parse(), ENOENT, "i don't exist");
114 SENF_CHECK_NO_THROW( cfg.parse() );
117 std::string etc_shaddow ("/etc/shadow");
118 if (getuid() != 0 && boost::filesystem::exists(etc_shaddow)) {
119 senf::console::ConfigFile cfg (etc_shaddow);
120 SENF_CHECK_THROW_SYSTEMEXCEPTION( cfg.parse(), EACCES, etc_shaddow);
125 SENF_AUTO_UNIT_TEST(configFileRestrict)
127 namespace fty = senf::console::factory;
129 TempFile cfgf ("test.cfg");
130 cfgf << "dir1/fun1 10;\n"
134 senf::console::ScopedDirectory<> dir1;
135 senf::console::root().add("dir1", dir1);
136 dir1.add("fun1",fty::Command(&fun1));
141 senf::console::ConfigFile cfg (cfgf.name());
142 SENF_CHECK_NO_THROW( cfg.parse(dir1) );
143 BOOST_CHECK_EQUAL( var1, 10 );
144 BOOST_CHECK_EQUAL( var2, false );
145 BOOST_CHECK( cfg.parsed(dir1) );
146 BOOST_CHECK( ! cfg.complete() );
148 senf::console::ScopedDirectory<> dir2;
149 senf::console::root().add("dir2", dir2);
150 dir2.add("fun2",fty::Command(&fun2));
154 SENF_CHECK_NO_THROW( cfg.parse() );
155 BOOST_CHECK_EQUAL( var1, 0 );
156 BOOST_CHECK_EQUAL( var2, true );
157 BOOST_CHECK( cfg.complete() );
161 SENF_AUTO_UNIT_TEST(configFileSkipGroup)
163 namespace fty = senf::console::factory;
165 TempFile cfgf ("test.cfg");
166 cfgf << "dir1/fun1 10;\n"
167 << "dir2 { dir3 { fun2; } fun1 5; }"
170 senf::console::ScopedDirectory<> dir1;
171 senf::console::root().add("dir1", dir1);
172 dir1.add("fun1",fty::Command(&fun1));
174 senf::console::ScopedDirectory<> dir2;
175 senf::console::root().add("dir2", dir2);
177 dir2.add("dir3",fty::Directory()).add("fun2", fty::Command(&fun2));
178 dir2.add("fun1", fty::Command(&fun1));
183 senf::console::ConfigFile cfg (cfgf.name());
184 SENF_CHECK_NO_THROW( cfg.parse(dir1) );
185 BOOST_CHECK_EQUAL( var1, 10 );
186 BOOST_CHECK_EQUAL( var2, false );
187 BOOST_CHECK( cfg.parsed(dir1) );
191 SENF_CHECK_NO_THROW( cfg.parse(dir2["dir3"]) );
192 BOOST_CHECK_EQUAL( var1, 0 );
193 BOOST_CHECK_EQUAL( var2, true );
194 BOOST_CHECK( ! cfg.parsed(dir2) );
198 SENF_CHECK_NO_THROW( cfg.parse() );
199 BOOST_CHECK_EQUAL( var1, 5 );
200 BOOST_CHECK_EQUAL( var2, false );
204 SENF_AUTO_UNIT_TEST(configRestrictAndLink)
206 namespace fty = senf::console::factory;
208 TempFile cfgf ("test.cfg");
209 cfgf << "dir1/fun1 10;\n"
210 << "link1 { dir3 { fun2; } fun1 5; }"
213 senf::console::ScopedDirectory<> dir1;
214 senf::console::root().add("dir1", dir1);
215 dir1.add("fun1",fty::Command(&fun1));
217 senf::console::ScopedDirectory<> dir2;
218 dir1.add("dir2", dir2);
220 dir2.add("dir3",fty::Directory()).add("fun2", fty::Command(&fun2));
221 dir2.add("fun1", fty::Command(&fun1));
223 senf::console::ScopedDirectory<> dir4;
224 senf::console::root().add("dir4", dir4);
225 dir4.add("link1", fty::Link(dir2));
228 senf::console::ConfigFile cfg (cfgf.name(), dir4);
232 SENF_CHECK_NO_THROW( cfg.parse(dir2["dir3"]) );
233 BOOST_CHECK_EQUAL( var1, 0 );
234 BOOST_CHECK_EQUAL( var2, true );
236 BOOST_CHECK_THROW( cfg.parse(), senf::console::SyntaxErrorException );
240 //-/////////////////////////////////////////////////////////////////////////////////////////////////
247 // comment-column: 40
248 // c-file-style: "senf"
249 // indent-tabs-mode: nil
250 // ispell-local-dictionary: "american"
251 // compile-command: "scons -u test"