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