1 #include <boost/test/auto_unit_test.hpp>
6 #include "zypp/ZConfig.h"
7 #include "zypp/Pathname.h"
9 #include "zypp/base/ValueTransform.h"
10 #include "zypp/repo/RepoVariables.h"
15 using namespace boost::unit_test;
17 #define DATADIR (Pathname(TESTS_SRC_DIR) + "/repo/yum/data")
19 typedef std::list<std::string> ListType;
22 std::ostream & operator<<( std::ostream & str, const ListType & obj )
25 for ( const auto & el : obj )
32 struct PlainTransformator
34 std::string operator()( const std::string & value_r ) const
35 { return "{"+value_r+"}"; }
38 // plain functor + required std::unary_function typedefs
39 struct FncTransformator : public PlainTransformator, public std::unary_function<const std::string &, std::string>
43 BOOST_AUTO_TEST_CASE(value_transform)
45 using zypp::base::ValueTransform;
46 using zypp::base::ContainerTransform;
48 typedef ValueTransform<std::string, FncTransformator> ReplacedString;
49 typedef ContainerTransform<ListType, FncTransformator> ReplacedStringList;
51 ReplacedString r( "val" );
52 BOOST_CHECK_EQUAL( r.raw(), "val" );
53 BOOST_CHECK_EQUAL( r.transformed(), "{val}" );
56 BOOST_CHECK_EQUAL( r.raw(), "new" );
57 BOOST_CHECK_EQUAL( r.transformed(), "{new}" );
59 ReplacedStringList rl;
60 BOOST_CHECK_EQUAL( rl.empty(), true );
61 BOOST_CHECK_EQUAL( rl.size(), 0 );
62 BOOST_CHECK_EQUAL( rl.raw(), ListType() );
63 BOOST_CHECK_EQUAL( rl.transformed(), ListType() );
65 rl.raw().push_back("a");
66 rl.raw().push_back("b");
67 rl.raw().push_back("c");
69 BOOST_CHECK_EQUAL( rl.empty(), false );
70 BOOST_CHECK_EQUAL( rl.size(), 3 );
71 BOOST_CHECK_EQUAL( rl.raw(), ListType({ "a","b","c" }) );
72 BOOST_CHECK_EQUAL( rl.transformed(), ListType({ "{a}", "{b}", "{c}" }) );
74 BOOST_CHECK_EQUAL( rl.transformed( rl.rawBegin() ), "{a}" );
77 void helperGenRepVarExpandResults()
79 // Generate test result strings for RepVarExpand:
80 // ( STRING, REPLACED_all_vars_undef, REPLACED_all_vars_defined )
81 // Crefully check whether new stings are correct before
82 // adding them to the testccse.
83 std::map<std::string,std::string> vartable;
84 std::map<std::string,std::pair<std::string,std::string>> result;
87 auto varLookup = [&vartable,&varsoff]( const std::string & name_r )->const std::string *
91 std::string & val( vartable[name_r] );
93 { val = "["+name_r+"]"; }
97 for ( auto && value : {
106 , "\\${_A_B}" // no escape on level 0
107 , "${_A_B\\}" // no close brace
111 , "${C:+a\\$Bba}" // escape on level > 0; no var $Bba
112 , "${C:+a$Bba\\}" // escape on level > 0; no close brace C
114 , "${C:+a\\${B}ba}" // escape on level > 0; no var ${B}
115 , "${C:+a${B\\}ba}" // escape on level > 0; no close brace B
116 , "${C:+a\\${B\\}ba}"
117 , "__${D:+\\$X--{${E:-==\\$X{o\\}==} }--}__\\${B}${}__"
118 , "__${D:+\\$X--{${E:-==\\$X{o\\}==}\\}--}__\\${B}${}__"
121 result[value].first = repo::RepoVarExpand()( value, varLookup );
123 result[value].second = repo::RepoVarExpand()( value, varLookup );
126 for ( const auto & el : result )
128 #define CSTR(STR) str::form( "%-40s", str::gsub( "\""+STR+"\"", "\\", "\\\\" ).c_str() )
129 cout << "RepVarExpandTest( " << CSTR(el.first) << ", " << CSTR(el.second.first) << ", " << CSTR(el.second.second) << " );" << endl;
133 void RepVarExpandTest( const std::string & string_r, const std::string & allUndef_r, const std::string & allDef_r )
135 std::map<std::string,std::string> vartable;
138 auto varLookup = [&vartable,&varsoff]( const std::string & name_r )->const std::string *
142 std::string & val( vartable[name_r] );
144 { val = "["+name_r+"]"; }
149 BOOST_CHECK_EQUAL( repo::RepoVarExpand()( string_r, varLookup ), allUndef_r );
151 BOOST_CHECK_EQUAL( repo::RepoVarExpand()( string_r, varLookup ), allDef_r );
154 BOOST_AUTO_TEST_CASE(RepVarExpand)
155 { // ( STRING , REPLACED_all_vars_undef , REPLACED_all_vars_defined )
156 RepVarExpandTest( "" , "" , "" );
157 RepVarExpandTest( "$" , "$" , "$" );
158 RepVarExpandTest( "$${}" , "$${}" , "$${}" );
159 RepVarExpandTest( "$_:" , "$_:" , "[_]:" );
160 RepVarExpandTest( "$_A:" , "$_A:" , "[_A]:" );
161 RepVarExpandTest( "$_A_:" , "$_A_:" , "[_A_]:" );
162 RepVarExpandTest( "$_A_B:" , "$_A_B:" , "[_A_B]:" );
163 RepVarExpandTest( "${C:+a$Bba\\}" , "${C:+a$Bba\\}" , "${C:+a[Bba]\\}" );
164 RepVarExpandTest( "${C:+a$Bba}" , "" , "a[Bba]" );
165 RepVarExpandTest( "${C:+a${B\\}ba}" , "${C:+a${B\\}ba}" , "${C:+a${B\\}ba}" );
166 RepVarExpandTest( "${C:+a${B}ba}" , "" , "a[B]ba" );
167 RepVarExpandTest( "${C:+a\\$Bba}" , "" , "a$Bba" );
168 RepVarExpandTest( "${C:+a\\${B\\}ba}" , "" , "a${B}ba" );
169 RepVarExpandTest( "${C:+a\\${B}ba}" , "ba}" , "a${Bba}" );
170 RepVarExpandTest( "${C:-a$Bba}" , "a$Bba" , "[C]" );
171 RepVarExpandTest( "${_A_B\\}" , "${_A_B\\}" , "${_A_B\\}" );
172 RepVarExpandTest( "${_A_B}" , "${_A_B}" , "[_A_B]" );
173 RepVarExpandTest( "\\${_A_B}" , "\\${_A_B}" , "\\[_A_B]" );
174 RepVarExpandTest( "__${D:+\\$X--{${E:-==\\$X{o\\}==} }--}__\\${B}${}__", "__--}__\\${B}${}__" , "__$X--{[E] --}__\\[B]${}__" );
175 RepVarExpandTest( "__${D:+\\$X--{${E:-==\\$X{o\\}==}\\}--}__\\${B}${}__", "____\\${B}${}__" , "__$X--{[E]}--__\\[B]${}__" );
178 BOOST_AUTO_TEST_CASE(replace_text)
180 /* check RepoVariablesStringReplacer */
181 ZConfig::instance().setSystemArchitecture(Arch("i686"));
182 ::setenv( "ZYPP_REPO_RELEASEVER", "13.2", 1 );
184 repo::RepoVariablesStringReplacer replacer1;
185 BOOST_CHECK_EQUAL( replacer1(""), "" );
186 BOOST_CHECK_EQUAL( replacer1("$"), "$" );
187 BOOST_CHECK_EQUAL( replacer1("$arc"), "$arc" );
188 BOOST_CHECK_EQUAL( replacer1("$arch"), "i686" );
190 BOOST_CHECK_EQUAL( replacer1("$archit"), "$archit" );
191 BOOST_CHECK_EQUAL( replacer1("${rc}it"), "${rc}it" );
192 BOOST_CHECK_EQUAL( replacer1("$arch_it"), "$arch_it" );
194 BOOST_CHECK_EQUAL( replacer1("$arch-it"), "i686-it" );
195 BOOST_CHECK_EQUAL( replacer1("$arch it"), "i686 it" );
196 BOOST_CHECK_EQUAL( replacer1("${arch}it"), "i686it" );
198 BOOST_CHECK_EQUAL( replacer1("${arch}it$archit $arch"), "i686it$archit i686" );
199 BOOST_CHECK_EQUAL( replacer1("X${arch}it$archit $arch-it"), "Xi686it$archit i686-it" );
201 BOOST_CHECK_EQUAL( replacer1("${releasever}"), "13.2" );
202 BOOST_CHECK_EQUAL( replacer1("${releasever_major}"), "13" );
203 BOOST_CHECK_EQUAL( replacer1("${releasever_minor}"), "2" );
205 BOOST_CHECK_EQUAL(replacer1("http://foo/$arch/bar"), "http://foo/i686/bar");
207 /* check RepoVariablesUrlReplacer */
208 repo::RepoVariablesUrlReplacer replacer2;
210 BOOST_CHECK_EQUAL(replacer2(Url("ftp://user:secret@site.org/$arch/")).asCompleteString(),
211 "ftp://user:secret@site.org/i686/");
213 BOOST_CHECK_EQUAL(replacer2(Url("http://user:my$arch@site.org/$basearch/")).asCompleteString(),
214 "http://user:my$arch@site.org/i386/");
216 BOOST_CHECK_EQUAL(replacer2(Url("http://site.org/update/?arch=$arch")).asCompleteString(),
217 "http://site.org/update/?arch=i686");
219 BOOST_CHECK_EQUAL(replacer2(Url("http://site.org/update/$releasever/?arch=$arch")).asCompleteString(),
220 "http://site.org/update/13.2/?arch=i686");
223 // vim: set ts=2 sts=2 sw=2 ai et: