0434fa9172ee5aba466b527284dcf45801d2898e
[platform/upstream/libzypp.git] / tests / zypp / Capabilities_test.cc
1 // Capabilities.cc
2 //
3 // tests for Capabilities
4 //
5 #include <iostream>
6 #include <string>
7
8 // Boost.Test
9 #include <boost/test/floating_point_comparison.hpp>
10 #include <boost/test/auto_unit_test.hpp>
11
12 #include "TestSetup.h"
13 #include "zypp/Arch.h"
14 #include "zypp/Capability.h"
15 #include "zypp/Capabilities.h"
16
17 using boost::unit_test::test_suite;
18 using boost::unit_test::test_case;
19 using boost::test_tools::close_at_tolerance;
20
21 using namespace std;
22 using namespace zypp;
23
24 static TestSetup test( Arch_x86_64 );
25
26 BOOST_AUTO_TEST_CASE(capabilities_test)
27 {
28   //////////////////////////////////////////////////////////////////////
29   // Id 0 and 1 are nor equal, but share the same representation ""/NOCAP
30   //////////////////////////////////////////////////////////////////////
31
32   Capability c0( 0 );  // id 0
33   Capability c1( 1 );  // id 1
34   Capability cD;       // default constructed empty
35   Capability cE( "" ); // empty
36
37   BOOST_CHECK_EQUAL( c0.id(), 0 );
38   BOOST_CHECK_EQUAL( c1.id(), 1 );
39   BOOST_CHECK_EQUAL( Capability().id(), 1 );   // default constructed empty
40   BOOST_CHECK_EQUAL( Capability("").id(), 1 ); // empty
41
42   BOOST_CHECK_EQUAL( c0.asString(), "" );
43   BOOST_CHECK_EQUAL( c1.asString(), "" );
44
45   BOOST_CHECK_EQUAL( c0.empty(), true );
46   BOOST_CHECK_EQUAL( c1.empty(), true );
47
48   BOOST_CHECK_EQUAL( c0.detail().kind(), CapDetail::NOCAP );
49   BOOST_CHECK_EQUAL( c1.detail().kind(), CapDetail::NOCAP );
50
51   BOOST_CHECK_EQUAL( ( c0 == c1 ), false );
52   BOOST_CHECK_EQUAL( Capability::matches( c0, c1 ), CapMatch::yes );
53
54   //////////////////////////////////////////////////////////////////////
55   // skipping internal marker in Capabilities
56   //////////////////////////////////////////////////////////////////////
57
58   Capability r( "req" );
59   Capability p( "prereq" );
60
61   sat::detail::IdType caps[10];
62   caps[0] = r.id();
63   caps[1] = sat::detail::solvablePrereqMarker;
64   caps[2] = p.id();
65   caps[3] = 0;
66
67   // Capabilities with and without prereq (skip marker in ++)
68   Capabilities c( caps );
69   //cout << c << endl;
70   BOOST_CHECK_EQUAL( c.size(), 2 );
71   Capabilities::const_iterator it( c.begin() );
72   BOOST_CHECK_EQUAL( *it, r );
73   BOOST_CHECK_EQUAL( it.tagged(), false );
74   ++it;
75   BOOST_CHECK_EQUAL( *it, p );
76   BOOST_CHECK_EQUAL( it.tagged(), true );
77
78   // Capabilities with prereq only (skip marker in ctor)
79   c = Capabilities( caps+1 );
80   //cout << c << endl;
81   BOOST_CHECK_EQUAL( c.size(), 1 );
82   it = c.begin();
83   BOOST_CHECK_EQUAL( *it, p );
84   BOOST_CHECK_EQUAL( it.tagged(), true );
85
86
87   //////////////////////////////////////////////////////////////////////
88   //
89   //////////////////////////////////////////////////////////////////////
90   Capability n( "na.me" );
91   Capability na( "na.me.i386" );
92   Capability noe( "na.me == 1" );
93   Capability naoe( "na.me.i386 == 1" );
94
95   BOOST_CHECK_EQUAL( n.detail().kind(), CapDetail::NAMED );
96   BOOST_CHECK_EQUAL( na.detail().kind(), CapDetail::NAMED );
97   BOOST_CHECK_EQUAL( noe.detail().kind(), CapDetail::VERSIONED );
98   BOOST_CHECK_EQUAL( naoe.detail().kind(), CapDetail::VERSIONED );
99
100   BOOST_CHECK_EQUAL( n.detail().hasArch(), false );
101   BOOST_CHECK_EQUAL( na.detail().hasArch(), true );
102   BOOST_CHECK_EQUAL( noe.detail().hasArch(), false );
103   BOOST_CHECK_EQUAL( naoe.detail().hasArch(), true );
104
105   BOOST_CHECK      ( n.detail().arch().empty() );
106   BOOST_CHECK_EQUAL( na.detail().arch(), Arch_i386.idStr() );
107   BOOST_CHECK      ( noe.detail().arch().empty() );
108   BOOST_CHECK_EQUAL( naoe.detail().arch(), Arch_i386.idStr() );
109
110   BOOST_CHECK_EQUAL( Capability( "",     "na.me", "",   "" ), n );
111   BOOST_CHECK_EQUAL( Capability( "i386", "na.me", "",   "" ), na );
112   BOOST_CHECK_EQUAL( Capability( "",     "na.me", "==", "1" ), noe );
113   BOOST_CHECK_EQUAL( Capability( "i386", "na.me", "==", "1" ), naoe );
114
115   // explicit arch
116   BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me" ), na );
117   BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me == 1" ), naoe );
118 }
119
120 BOOST_AUTO_TEST_CASE(guessPackageSpec)
121 {
122   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "" ), Capability( "", "", "", "" ) );
123
124   // Remember:  'name OP ver-rel':      name may match provides
125   //            'name-ver-rel':         name may match package names only
126
127   // With no libzypp in the pool, no guess should succeed:
128   BOOST_REQUIRE( sat::WhatProvides(Capability("libzypp")).empty() );
129
130   // these must be guessed
131   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2" ),             Capability( "",         "libzypp-1-2",  "",     "" ) );
132   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2.i586" ),        Capability( "i586",     "libzypp-1-2",  "",     "" ) );
133   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2" ),        Capability( "",         "libzypp.i586-1-2", "", "" ) );
134   // these are unambiguous
135   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "patch:swmgmt=12" ),         Capability( "",         "swmgmt",       "=",    "12", ResKind::patch ) );
136   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp=0:1.0.2-2" ),       Capability( "",         "libzypp",      "=",    "0:1.0.2-2" ) );
137
138   // now load some repo providing libzypp and see how the guessing changes:
139   test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" );
140   BOOST_REQUIRE( ! sat::WhatProvides(Capability("libzypp")).empty() );
141
142   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2" ),             Capability( "",         "libzypp",      "=",    "1-2" ) );
143   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2.i586" ),        Capability( "i586",     "libzypp",      "=",    "1-2" ) );
144   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2" ),        Capability( "i586",     "libzypp",      "=",    "1-2" ) );
145   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp<=1.0.2-2" ),        Capability( "",         "libzypp",      "<=",   "1.0.2-2" ) );
146   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp<=1:1.0.2-2" ),      Capability( "",         "libzypp",      "<=",   "1:1.0.2-2" ) );
147   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-0:1.0.2-2" ),       Capability( "",         "libzypp",      "=",    "0:1.0.2-2" ) );
148
149   // now with yast2-packagemanager which is just a provides. Guess must not lead to libzypp.
150   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager-1-2" ),        Capability( "",         "yast2-packagemanager-1-2",     "",     "" ) );
151   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager-1-2.i586" ),   Capability( "i586",     "yast2-packagemanager-1-2",     "",     "" ) );
152   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager.i586-1-2" ),   Capability( "",         "yast2-packagemanager.i586-1-2","",     "" ) );
153   // these are unambiguous
154   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager<=1.0.2-2" ),   Capability( "",         "yast2-packagemanager",         "<=",   "1.0.2-2" ) );
155   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager<=1:1.0.2-2" ), Capability( "",         "yast2-packagemanager",         "<=",   "1:1.0.2-2" ) );
156
157
158   // Double arch spec: the trailing one succeeds, the other one gets part of the name.
159   // As "libzypp.i586' is not in the pool, guessing fails. Result is a named cap.
160   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2.ppc" ),
161                      Capability( "ppc",  "libzypp.i586-1-2", "", "" ) );
162
163   // Now check prepended kind specs.
164
165   Capability cap( "package:libzypp=1-2" );
166   BOOST_CHECK_EQUAL( cap, Capability( "",       "libzypp",              "=",    "1-2", ResKind::package ) );
167   BOOST_CHECK_EQUAL( cap, Capability( "",       "package:libzypp",      "=",    "1-2" ) );
168   BOOST_CHECK_EQUAL( cap, Capability( "",       "package:libzypp",      "=",    "1-2", ResKind::pattern ) ); // known name prefix wins
169   // 'package:' is the default
170   BOOST_CHECK_EQUAL( cap, Capability( "libzypp=1-2" ) );
171   BOOST_CHECK_EQUAL( cap, Capability( "",       "libzypp",              "=",    "1-2" ) );
172
173   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "package:libzypp-1-2" ) );
174   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "package:libzypp=1-2" ) );
175   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "libzypp-1-2" ) );
176   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "libzypp=1-2" ) );
177
178
179   cap = Capability( "pattern:32bit=1-2" );
180   BOOST_CHECK_EQUAL( cap, Capability( "",       "32bit",                "=",    "1-2", ResKind::pattern ) );
181   BOOST_CHECK_EQUAL( cap, Capability( "",       "pattern:32bit",        "=",    "1-2" ) );
182   BOOST_CHECK_EQUAL( cap, Capability( "",       "pattern:32bit",        "=",    "1-2", ResKind::package ) ); // known name prefix wins
183
184   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit-1-2" ) );
185   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit=1-2" ) );
186 }
187
188