892e9ab7c6ee2ebc1d5d66207608adee5c59ca3c
[platform/upstream/libzypp.git] / tests / repo / RepoVariables_test.cc
1 #include <boost/test/auto_unit_test.hpp>
2 #include <iostream>
3 #include <list>
4 #include <map>
5
6 #include "zypp/ZConfig.h"
7 #include "zypp/Pathname.h"
8 #include "zypp/Url.h"
9 #include "zypp/base/ValueTransform.h"
10 #include "zypp/repo/RepoVariables.h"
11
12 using std::cout;
13 using std::endl;
14 using namespace zypp;
15 using namespace boost::unit_test;
16
17 #define DATADIR (Pathname(TESTS_SRC_DIR) +  "/repo/yum/data")
18
19 typedef std::list<std::string> ListType;
20
21 namespace std {
22   std::ostream & operator<<( std::ostream & str, const ListType & obj )
23   {
24     str << "[";
25     for ( const auto & el : obj )
26       str << " " << el;
27     return str << " ]";
28   }
29 }
30
31 // A plain functor
32 struct PlainTransformator
33 {
34   std::string operator()( const std::string & value_r ) const
35   { return "{"+value_r+"}"; }
36 };
37
38 // plain functor + required std::unary_function typedefs
39 struct FncTransformator : public PlainTransformator, public std::unary_function<const std::string &, std::string>
40 {};
41
42
43 BOOST_AUTO_TEST_CASE(value_transform)
44 {
45   using zypp::base::ValueTransform;
46   using zypp::base::ContainerTransform;
47
48   typedef ValueTransform<std::string, FncTransformator> ReplacedString;
49   typedef ContainerTransform<ListType, FncTransformator> ReplacedStringList;
50
51   ReplacedString r( "val" );
52   BOOST_CHECK_EQUAL( r.raw(), "val" );
53   BOOST_CHECK_EQUAL( r.transformed(),   "{val}" );
54
55   r.raw() = "new";
56   BOOST_CHECK_EQUAL( r.raw(), "new" );
57   BOOST_CHECK_EQUAL( r.transformed(),   "{new}" );
58
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() );
64
65   rl.raw().push_back("a");
66   rl.raw().push_back("b");
67   rl.raw().push_back("c");
68
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}" }) );
73
74   BOOST_CHECK_EQUAL( rl.transformed( rl.rawBegin() ), "{a}" );
75 }
76
77 void helperGenRepVarExpandResults()
78 {
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;
85   bool varsoff = true;
86
87   auto varLookup = [&vartable,&varsoff]( const std::string & name_r )->const std::string *
88   {
89     if ( varsoff )
90       return nullptr;
91     std::string & val( vartable[name_r] );
92     if ( val.empty() )
93     { val = "["+name_r+"]"; }
94     return &val;
95   };
96
97   for ( auto && value : {
98     ""
99     , "$"
100     , "$${}"
101     , "$_:"
102     , "$_A:"
103     , "$_A_:"
104     , "$_A_B:"
105     , "${_A_B}"
106     , "\\${_A_B}"       // no escape on level 0
107     , "${_A_B\\}"       // no close brace
108     , "${C:-a$Bba}"
109     , "${C:+a$Bba}"
110     , "${C:+a${B}ba}"
111     , "${C:+a\\$Bba}"   // escape on level > 0; no var $Bba
112     , "${C:+a$Bba\\}"   // escape on level > 0; no close brace C
113     , "${C:+a${B}ba}"
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}${}__"
119   } ) {
120     varsoff = true;
121     result[value].first = repo::RepoVarExpand()( value, varLookup );
122     varsoff = false;
123     result[value].second = repo::RepoVarExpand()( value, varLookup );
124   }
125
126   for ( const auto & el : result )
127   {
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;
130   }
131 }
132
133 void RepVarExpandTest( const std::string & string_r, const std::string & allUndef_r, const std::string & allDef_r )
134 {
135   std::map<std::string,std::string> vartable;
136   bool varsoff = true;
137
138   auto varLookup = [&vartable,&varsoff]( const std::string & name_r )->const std::string *
139   {
140     if ( varsoff )
141       return nullptr;
142     std::string & val( vartable[name_r] );
143     if ( val.empty() )
144     { val = "["+name_r+"]"; }
145     return &val;
146   };
147
148   varsoff = true;
149   BOOST_CHECK_EQUAL( repo::RepoVarExpand()( string_r, varLookup ), allUndef_r );
150   varsoff = false;
151   BOOST_CHECK_EQUAL( repo::RepoVarExpand()( string_r, varLookup ), allDef_r );
152 }
153
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]${}__"              );
176 }
177
178 BOOST_AUTO_TEST_CASE(replace_text)
179 {
180   /* check RepoVariablesStringReplacer */
181   ZConfig::instance().setSystemArchitecture(Arch("i686"));
182   ::setenv( "ZYPP_REPO_RELEASEVER", "13.2", 1 );
183
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" );
189
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" );
193
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" );
197
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" );
200
201   BOOST_CHECK_EQUAL( replacer1("${releasever}"),        "13.2" );
202   BOOST_CHECK_EQUAL( replacer1("${releasever_major}"),  "13" );
203   BOOST_CHECK_EQUAL( replacer1("${releasever_minor}"),  "2" );
204
205   BOOST_CHECK_EQUAL(replacer1("http://foo/$arch/bar"), "http://foo/i686/bar");
206
207   /* check RepoVariablesUrlReplacer */
208   repo::RepoVariablesUrlReplacer replacer2;
209
210 //   // first of all url with {} must be accepted:
211   BOOST_CHECK_NO_THROW( Url("ftp://site.org/${arch}/?arch=${arch}") );
212   BOOST_CHECK_NO_THROW( Url("ftp://site.org/${arch:-noarch}/?arch=${arch:-noarch}") );
213   BOOST_CHECK_NO_THROW( Url("ftp://site.org/${arch:+somearch}/?arch=${arch:+somearch}") );
214
215   BOOST_CHECK_EQUAL(replacer2(Url("ftp://user:secret@site.org/$arch/")).asCompleteString(),
216                     "ftp://user:secret@site.org/i686/");
217
218   BOOST_CHECK_EQUAL(replacer2(Url("http://user:my$arch@site.org/$basearch/")).asCompleteString(),
219                     "http://user:my$arch@site.org/i386/");
220
221   BOOST_CHECK_EQUAL(replacer2(Url("http://site.org/update/?arch=$arch")).asCompleteString(),
222                     "http://site.org/update/?arch=i686");
223
224   BOOST_CHECK_EQUAL(replacer2(Url("http://site.org/update/$releasever/?arch=$arch")).asCompleteString(),
225                     "http://site.org/update/13.2/?arch=i686");
226 }
227
228 // vim: set ts=2 sts=2 sw=2 ai et: