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( TestSetup::initLater );
25 test = TestSetup( Arch_x86_64 );
27 ~TestInit() { test.reset(); }
29 BOOST_GLOBAL_FIXTURE( TestInit );
31 BOOST_AUTO_TEST_CASE(capabilities_test)
33 //////////////////////////////////////////////////////////////////////
34 // Id 0 and 1 are nor equal, but share the same representation ""/NOCAP
35 //////////////////////////////////////////////////////////////////////
37 Capability c0( 0 ); // id 0
38 Capability c1( 1 ); // id 1
39 Capability cD; // default constructed empty
40 Capability cE( "" ); // empty
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
47 BOOST_CHECK_EQUAL( c0.asString(), "" );
48 BOOST_CHECK_EQUAL( c1.asString(), "" );
50 BOOST_CHECK_EQUAL( c0.empty(), true );
51 BOOST_CHECK_EQUAL( c1.empty(), true );
53 BOOST_CHECK_EQUAL( c0.detail().kind(), CapDetail::NOCAP );
54 BOOST_CHECK_EQUAL( c1.detail().kind(), CapDetail::NOCAP );
56 BOOST_CHECK_EQUAL( ( c0 == c1 ), false );
57 BOOST_CHECK_EQUAL( Capability::matches( c0, c1 ), CapMatch::yes );
59 //////////////////////////////////////////////////////////////////////
60 // skipping internal marker in Capabilities
61 //////////////////////////////////////////////////////////////////////
63 Capability r( "req" );
64 Capability p( "prereq" );
66 sat::detail::IdType caps[10];
68 caps[1] = sat::detail::solvablePrereqMarker;
72 // Capabilities with and without prereq (skip marker in ++)
73 Capabilities c( caps );
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 );
80 BOOST_CHECK_EQUAL( *it, p );
81 BOOST_CHECK_EQUAL( it.tagged(), true );
83 // Capabilities with prereq only (skip marker in ctor)
84 c = Capabilities( caps+1 );
86 BOOST_CHECK_EQUAL( c.size(), 1 );
88 BOOST_CHECK_EQUAL( *it, p );
89 BOOST_CHECK_EQUAL( it.tagged(), true );
92 //////////////////////////////////////////////////////////////////////
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" );
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 );
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 );
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() );
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 );
121 BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me" ), na );
122 BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me == 1" ), naoe );
125 BOOST_AUTO_TEST_CASE(guessPackageSpec)
127 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "" ), Capability( "", "", "", "" ) );
129 // Remember: 'name OP ver-rel': name may match provides
130 // 'name-ver-rel': name may match package names only
132 // With no libzypp in the pool, no guess should succeed:
133 BOOST_REQUIRE( sat::WhatProvides(Capability("libzypp")).empty() );
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" ) );
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() );
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" ) );
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" ) );
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", "", "" ) );
168 // Now check prepended kind specs.
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" ) );
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" ) );
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
189 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit-1-2" ) );
190 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit=1-2" ) );