Fix Werrors with GCC-14.1.0
[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/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 zypp;
20
21 static TestSetup test( TestSetup::initLater );
22 struct TestInit {
23   TestInit() {
24     test = TestSetup( Arch_x86_64 );
25   }
26   ~TestInit() { test.reset(); }
27 };
28 BOOST_GLOBAL_FIXTURE( TestInit );
29
30 BOOST_AUTO_TEST_CASE(capabilities_test)
31 {
32   //////////////////////////////////////////////////////////////////////
33   // Id 0 and 1 are nor equal, but share the same representation ""/NOCAP
34   //////////////////////////////////////////////////////////////////////
35
36   Capability c0( 0 );  // id 0
37   Capability c1( 1 );  // id 1
38   Capability cD;       // default constructed empty
39   Capability cE( "" ); // empty
40
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
45
46   BOOST_CHECK_EQUAL( c0.asString(), "" );
47   BOOST_CHECK_EQUAL( c1.asString(), "" );
48
49   BOOST_CHECK_EQUAL( c0.empty(), true );
50   BOOST_CHECK_EQUAL( c1.empty(), true );
51
52   BOOST_CHECK_EQUAL( c0.detail().kind(), CapDetail::NOCAP );
53   BOOST_CHECK_EQUAL( c1.detail().kind(), CapDetail::NOCAP );
54
55   BOOST_CHECK_EQUAL( ( c0 == c1 ), false );
56   BOOST_CHECK_EQUAL( Capability::matches( c0, c1 ), CapMatch::yes );
57
58   //////////////////////////////////////////////////////////////////////
59   // skipping internal marker in Capabilities
60   //////////////////////////////////////////////////////////////////////
61
62   Capability r( "req" );
63   Capability p( "prereq" );
64
65   sat::detail::IdType caps[10];
66   caps[0] = r.id();
67   caps[1] = sat::detail::solvablePrereqMarker;
68   caps[2] = p.id();
69   caps[3] = 0;
70
71   // Capabilities with and without prereq (skip marker in ++)
72   Capabilities c( caps );
73   //cout << c << endl;
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 );
78   ++it;
79   BOOST_CHECK_EQUAL( *it, p );
80   BOOST_CHECK_EQUAL( it.tagged(), true );
81
82   // Capabilities with prereq only (skip marker in ctor)
83   c = Capabilities( caps+1 );
84   //cout << c << endl;
85   BOOST_CHECK_EQUAL( c.size(), 1 );
86   it = c.begin();
87   BOOST_CHECK_EQUAL( *it, p );
88   BOOST_CHECK_EQUAL( it.tagged(), true );
89
90
91   //////////////////////////////////////////////////////////////////////
92   //
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" );
98
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 );
103
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 );
108
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() );
113
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 );
118
119   // explicit arch
120   BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me" ), na );
121   BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me == 1" ), naoe );
122 }
123
124 BOOST_AUTO_TEST_CASE(guessPackageSpec)
125 {
126   BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "" ), Capability( "", "", "", "" ) );
127
128   // Remember:  'name OP ver-rel':      name may match provides
129   //            'name-ver-rel':         name may match package names only
130
131   // With no libzypp in the pool, no guess should succeed:
132   BOOST_REQUIRE( sat::WhatProvides(Capability("libzypp")).empty() );
133
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" ) );
141
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() );
145
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" ) );
152
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" ) );
160
161
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", "", "" ) );
166
167   // Now check prepended kind specs.
168
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" ) );
176
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" ) );
181
182
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
187
188   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit-1-2" ) );
189   BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit=1-2" ) );
190 }
191
192