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