3 // tests for Capabilities
9 #include <boost/test/auto_unit_test.hpp>
11 #include "TestSetup.h"
12 #include "zypp/Arch.h"
13 #include "zypp/Capability.h"
14 #include "zypp/Capabilities.h"
16 using boost::unit_test::test_suite;
17 using boost::unit_test::test_case;
22 static TestSetup test( Arch_x86_64 );
24 BOOST_AUTO_TEST_CASE(capabilities_test)
26 //////////////////////////////////////////////////////////////////////
27 // Id 0 and 1 are nor equal, but share the same representation ""/NOCAP
28 //////////////////////////////////////////////////////////////////////
30 Capability c0( 0 ); // id 0
31 Capability c1( 1 ); // id 1
32 Capability cD; // default constructed empty
33 Capability cE( "" ); // empty
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
40 BOOST_CHECK_EQUAL( c0.asString(), "" );
41 BOOST_CHECK_EQUAL( c1.asString(), "" );
43 BOOST_CHECK_EQUAL( c0.empty(), true );
44 BOOST_CHECK_EQUAL( c1.empty(), true );
46 BOOST_CHECK_EQUAL( c0.detail().kind(), CapDetail::NOCAP );
47 BOOST_CHECK_EQUAL( c1.detail().kind(), CapDetail::NOCAP );
49 BOOST_CHECK_EQUAL( ( c0 == c1 ), false );
50 BOOST_CHECK_EQUAL( Capability::matches( c0, c1 ), CapMatch::yes );
52 //////////////////////////////////////////////////////////////////////
53 // skipping internal marker in Capabilities
54 //////////////////////////////////////////////////////////////////////
56 Capability r( "req" );
57 Capability p( "prereq" );
59 sat::detail::IdType caps[10];
61 caps[1] = sat::detail::solvablePrereqMarker;
65 // Capabilities with and without prereq (skip marker in ++)
66 Capabilities c( caps );
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 );
73 BOOST_CHECK_EQUAL( *it, p );
74 BOOST_CHECK_EQUAL( it.tagged(), true );
76 // Capabilities with prereq only (skip marker in ctor)
77 c = Capabilities( caps+1 );
79 BOOST_CHECK_EQUAL( c.size(), 1 );
81 BOOST_CHECK_EQUAL( *it, p );
82 BOOST_CHECK_EQUAL( it.tagged(), true );
85 //////////////////////////////////////////////////////////////////////
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" );
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 );
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 );
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() );
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 );
114 BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me" ), na );
115 BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me == 1" ), naoe );
118 BOOST_AUTO_TEST_CASE(guessPackageSpec)
120 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "" ), Capability( "", "", "", "" ) );
122 // Remember: 'name OP ver-rel': name may match provides
123 // 'name-ver-rel': name may match package names only
125 // With no libzypp in the pool, no guess should succeed:
126 BOOST_REQUIRE( sat::WhatProvides(Capability("libzypp")).empty() );
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" ) );
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() );
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" ) );
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" ) );
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", "", "" ) );
161 // Now check prepended kind specs.
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" ) );
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" ) );
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
182 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit-1-2" ) );
183 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit=1-2" ) );