3 // tests for Capabilities
9 #include <boost/test/floating_point_comparison.hpp>
10 #include <boost/test/auto_unit_test.hpp>
12 #include "TestSetup.h"
13 #include "zypp/Arch.h"
14 #include "zypp/Capability.h"
15 #include "zypp/Capabilities.h"
17 using boost::unit_test::test_suite;
18 using boost::unit_test::test_case;
19 using boost::test_tools::close_at_tolerance;
24 static TestSetup test( Arch_x86_64 );
26 BOOST_AUTO_TEST_CASE(capabilities_test)
28 //////////////////////////////////////////////////////////////////////
29 // Id 0 and 1 are nor equal, but share the same representation ""/NOCAP
30 //////////////////////////////////////////////////////////////////////
32 Capability c0( 0 ); // id 0
33 Capability c1( 1 ); // id 1
34 Capability cD; // default constructed empty
35 Capability cE( "" ); // empty
37 BOOST_CHECK_EQUAL( c0.id(), 0 );
38 BOOST_CHECK_EQUAL( c1.id(), 1 );
39 BOOST_CHECK_EQUAL( Capability().id(), 1 ); // default constructed empty
40 BOOST_CHECK_EQUAL( Capability("").id(), 1 ); // empty
42 BOOST_CHECK_EQUAL( c0.asString(), "" );
43 BOOST_CHECK_EQUAL( c1.asString(), "" );
45 BOOST_CHECK_EQUAL( c0.empty(), true );
46 BOOST_CHECK_EQUAL( c1.empty(), true );
48 BOOST_CHECK_EQUAL( c0.detail().kind(), CapDetail::NOCAP );
49 BOOST_CHECK_EQUAL( c1.detail().kind(), CapDetail::NOCAP );
51 BOOST_CHECK_EQUAL( ( c0 == c1 ), false );
52 BOOST_CHECK_EQUAL( Capability::matches( c0, c1 ), CapMatch::yes );
54 //////////////////////////////////////////////////////////////////////
55 // skipping internal marker in Capabilities
56 //////////////////////////////////////////////////////////////////////
58 Capability r( "req" );
59 Capability p( "prereq" );
61 sat::detail::IdType caps[10];
63 caps[1] = sat::detail::solvablePrereqMarker;
67 // Capabilities with and without prereq (skip marker in ++)
68 Capabilities c( caps );
70 BOOST_CHECK_EQUAL( c.size(), 2 );
71 Capabilities::const_iterator it( c.begin() );
72 BOOST_CHECK_EQUAL( *it, r );
73 BOOST_CHECK_EQUAL( it.tagged(), false );
75 BOOST_CHECK_EQUAL( *it, p );
76 BOOST_CHECK_EQUAL( it.tagged(), true );
78 // Capabilities with prereq only (skip marker in ctor)
79 c = Capabilities( caps+1 );
81 BOOST_CHECK_EQUAL( c.size(), 1 );
83 BOOST_CHECK_EQUAL( *it, p );
84 BOOST_CHECK_EQUAL( it.tagged(), true );
87 //////////////////////////////////////////////////////////////////////
89 //////////////////////////////////////////////////////////////////////
90 Capability n( "na.me" );
91 Capability na( "na.me.i386" );
92 Capability noe( "na.me == 1" );
93 Capability naoe( "na.me.i386 == 1" );
95 BOOST_CHECK_EQUAL( n.detail().kind(), CapDetail::NAMED );
96 BOOST_CHECK_EQUAL( na.detail().kind(), CapDetail::NAMED );
97 BOOST_CHECK_EQUAL( noe.detail().kind(), CapDetail::VERSIONED );
98 BOOST_CHECK_EQUAL( naoe.detail().kind(), CapDetail::VERSIONED );
100 BOOST_CHECK_EQUAL( n.detail().hasArch(), false );
101 BOOST_CHECK_EQUAL( na.detail().hasArch(), true );
102 BOOST_CHECK_EQUAL( noe.detail().hasArch(), false );
103 BOOST_CHECK_EQUAL( naoe.detail().hasArch(), true );
105 BOOST_CHECK ( n.detail().arch().empty() );
106 BOOST_CHECK_EQUAL( na.detail().arch(), Arch_i386.idStr() );
107 BOOST_CHECK ( noe.detail().arch().empty() );
108 BOOST_CHECK_EQUAL( naoe.detail().arch(), Arch_i386.idStr() );
110 BOOST_CHECK_EQUAL( Capability( "", "na.me", "", "" ), n );
111 BOOST_CHECK_EQUAL( Capability( "i386", "na.me", "", "" ), na );
112 BOOST_CHECK_EQUAL( Capability( "", "na.me", "==", "1" ), noe );
113 BOOST_CHECK_EQUAL( Capability( "i386", "na.me", "==", "1" ), naoe );
116 BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me" ), na );
117 BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me == 1" ), naoe );
120 BOOST_AUTO_TEST_CASE(guessPackageSpec)
122 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "" ), Capability( "", "", "", "" ) );
124 // Remember: 'name OP ver-rel': name may match provides
125 // 'name-ver-rel': name may match package names only
127 // With no libzypp in the pool, no guess should succeed:
128 BOOST_REQUIRE( sat::WhatProvides(Capability("libzypp")).empty() );
130 // these must be guessed
131 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2" ), Capability( "", "libzypp-1-2", "", "" ) );
132 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2.i586" ), Capability( "i586", "libzypp-1-2", "", "" ) );
133 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2" ), Capability( "", "libzypp.i586-1-2", "", "" ) );
134 // these are unambiguous
135 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "patch:swmgmt=12" ), Capability( "", "swmgmt", "=", "12", ResKind::patch ) );
136 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp=0:1.0.2-2" ), Capability( "", "libzypp", "=", "0:1.0.2-2" ) );
138 // now load some repo providing libzypp and see how the guessing changes:
139 test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" );
140 BOOST_REQUIRE( ! sat::WhatProvides(Capability("libzypp")).empty() );
142 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2" ), Capability( "", "libzypp", "=", "1-2" ) );
143 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2.i586" ), Capability( "i586", "libzypp", "=", "1-2" ) );
144 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2" ), Capability( "i586", "libzypp", "=", "1-2" ) );
145 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp<=1.0.2-2" ), Capability( "", "libzypp", "<=", "1.0.2-2" ) );
146 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp<=1:1.0.2-2" ), Capability( "", "libzypp", "<=", "1:1.0.2-2" ) );
147 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-0:1.0.2-2" ), Capability( "", "libzypp", "=", "0:1.0.2-2" ) );
149 // now with yast2-packagemanager which is just a provides. Guess must not lead to libzypp.
150 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager-1-2" ), Capability( "", "yast2-packagemanager-1-2", "", "" ) );
151 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager-1-2.i586" ), Capability( "i586", "yast2-packagemanager-1-2", "", "" ) );
152 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager.i586-1-2" ), Capability( "", "yast2-packagemanager.i586-1-2","", "" ) );
153 // these are unambiguous
154 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager<=1.0.2-2" ), Capability( "", "yast2-packagemanager", "<=", "1.0.2-2" ) );
155 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager<=1:1.0.2-2" ), Capability( "", "yast2-packagemanager", "<=", "1:1.0.2-2" ) );
158 // Double arch spec: the trailing one succeeds, the other one gets part of the name.
159 // As "libzypp.i586' is not in the pool, guessing fails. Result is a named cap.
160 BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2.ppc" ),
161 Capability( "ppc", "libzypp.i586-1-2", "", "" ) );
163 // Now check prepended kind specs.
165 Capability cap( "package:libzypp=1-2" );
166 BOOST_CHECK_EQUAL( cap, Capability( "", "libzypp", "=", "1-2", ResKind::package ) );
167 BOOST_CHECK_EQUAL( cap, Capability( "", "package:libzypp", "=", "1-2" ) );
168 BOOST_CHECK_EQUAL( cap, Capability( "", "package:libzypp", "=", "1-2", ResKind::pattern ) ); // known name prefix wins
169 // 'package:' is the default
170 BOOST_CHECK_EQUAL( cap, Capability( "libzypp=1-2" ) );
171 BOOST_CHECK_EQUAL( cap, Capability( "", "libzypp", "=", "1-2" ) );
173 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "package:libzypp-1-2" ) );
174 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "package:libzypp=1-2" ) );
175 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "libzypp-1-2" ) );
176 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "libzypp=1-2" ) );
179 cap = Capability( "pattern:32bit=1-2" );
180 BOOST_CHECK_EQUAL( cap, Capability( "", "32bit", "=", "1-2", ResKind::pattern ) );
181 BOOST_CHECK_EQUAL( cap, Capability( "", "pattern:32bit", "=", "1-2" ) );
182 BOOST_CHECK_EQUAL( cap, Capability( "", "pattern:32bit", "=", "1-2", ResKind::package ) ); // known name prefix wins
184 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit-1-2" ) );
185 BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit=1-2" ) );