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