2021-01-25 00:24:31 +01:00
# include "../data/config.h"
# include <c++utilities/conversion/stringbuilder.h>
# include <c++utilities/conversion/stringconversion.h>
# include <c++utilities/io/misc.h>
# include <c++utilities/tests/testutils.h>
using CppUtilities : : operator < < ; // must be visible prior to the call site
# include <cppunit/TestFixture.h>
# include <cppunit/extensions/HelperMacros.h>
# include <filesystem>
# include <initializer_list>
# include <iostream>
# include <string>
# include <vector>
using namespace std ;
using namespace CPPUNIT_NS ;
using namespace CppUtilities ;
using namespace CppUtilities : : Literals ;
using namespace LibPkg ;
class DataTests : public TestFixture {
CPPUNIT_TEST_SUITE ( DataTests ) ;
CPPUNIT_TEST ( testPackageVersionComparsion ) ;
CPPUNIT_TEST ( testDependencyStringConversion ) ;
CPPUNIT_TEST ( testDependencyMatching ) ;
CPPUNIT_TEST ( testPackageSearch ) ;
CPPUNIT_TEST ( testComputingFileName ) ;
CPPUNIT_TEST ( testDetectingUnresolved ) ;
CPPUNIT_TEST ( testComputingBuildOrder ) ;
CPPUNIT_TEST ( testComputingDatabaseOrder ) ;
CPPUNIT_TEST ( testComputingDatabasesRequiringDatabase ) ;
CPPUNIT_TEST ( testUpdateCheck ) ;
CPPUNIT_TEST ( testLocatePackage ) ;
CPPUNIT_TEST ( testAddingDepsAndProvidesFromOtherPackage ) ;
CPPUNIT_TEST ( testDependencyExport ) ;
CPPUNIT_TEST ( testMisc ) ;
CPPUNIT_TEST_SUITE_END ( ) ;
public :
void setUp ( ) override ;
void tearDown ( ) override ;
void testPackageVersionComparsion ( ) ;
void testDependencyStringConversion ( ) ;
void testDependencyMatching ( ) ;
void testPackageSearch ( ) ;
void testComputingFileName ( ) ;
void testDetectingUnresolved ( ) ;
void testComputingBuildOrder ( ) ;
void setupTestDbs ( std : : size_t dbCount = 5 ) ;
Database & db ( std : : size_t dbNum ) ;
std : : vector < Database * > dbs ( std : : initializer_list < std : : size_t > dbNums ) ;
void testComputingDatabaseOrder ( ) ;
void testComputingDatabasesRequiringDatabase ( ) ;
void testUpdateCheck ( ) ;
void testLocatePackage ( ) ;
void testAddingDepsAndProvidesFromOtherPackage ( ) ;
void testDependencyExport ( ) ;
void testMisc ( ) ;
private :
2021-12-05 23:40:51 +01:00
void setupPackages ( ) ;
std : : string m_dbFile ;
2021-01-25 00:24:31 +01:00
Config m_config ;
2021-12-05 23:40:51 +01:00
std : : shared_ptr < Package > m_pkg1 , m_pkg2 , m_pkg3 ;
StorageID m_pkgId1 , m_pkgId2 , m_pkgId3 ;
2021-01-25 00:24:31 +01:00
} ;
CPPUNIT_TEST_SUITE_REGISTRATION ( DataTests ) ;
void DataTests : : setUp ( )
{
2021-12-05 23:40:51 +01:00
}
void DataTests : : tearDown ( )
{
}
void DataTests : : setupPackages ( )
{
m_dbFile = workingCopyPath ( " test-data.db " , WorkingCopyMode : : Cleanup ) ;
m_config . initStorage ( m_dbFile . data ( ) ) ;
m_pkg1 = std : : make_shared < Package > ( ) ;
2021-01-25 00:24:31 +01:00
m_pkg1 - > name = " foo " ;
m_pkg1 - > version = " 5.6-6 " ;
m_pkg1 - > dependencies . emplace_back ( " bar>=5.5 " ) ;
m_pkg1 - > dependencies . emplace_back ( " bar<5.6 " ) ;
2021-12-05 23:40:51 +01:00
m_pkg2 = std : : make_shared < Package > ( ) ;
2021-01-25 00:24:31 +01:00
m_pkg2 - > name = " bar " ;
m_pkg2 - > version = " 5.5-1 " ;
m_pkg2 - > provides . emplace_back ( " foo " , " 5.8-1 " ) ;
2021-12-05 23:40:51 +01:00
m_pkg3 = std : : make_shared < Package > ( ) ;
2021-01-25 00:24:31 +01:00
m_pkg3 - > name = " foo " ;
m_pkg3 - > version = " 5.7-1 " ;
2021-12-05 23:40:51 +01:00
auto * const db1 = m_config . findOrCreateDatabase ( " db1 " sv , std : : string_view ( ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " ID for pkg 1 returned " , m_pkgId1 = db1 - > updatePackage ( m_pkg1 ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " ID for pkg 2 returned " , m_pkgId2 = db1 - > updatePackage ( m_pkg2 ) ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " packages added to db 1 " , 2 _st , db1 - > packageCount ( ) ) ;
auto * const db2 = m_config . findOrCreateDatabase ( " db2 " sv , std : : string_view ( ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " ID for pkg 3 returned " , m_pkgId3 = db2 - > updatePackage ( m_pkg3 ) ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " package added to db 2 " , 1 _st , db2 - > packageCount ( ) ) ;
2021-01-25 00:24:31 +01:00
}
void DataTests : : testPackageVersionComparsion ( )
{
Package pkg1 , pkg2 ;
pkg1 . version = pkg2 . version = " 1234.5678-9 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : Equal , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 01234.5678-9 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : Equal , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1235.5678-9 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : SoftwareUpgrade , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1:12 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : SoftwareUpgrade , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1235.5679-1 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : SoftwareUpgrade , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 12356.5678-1 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : SoftwareUpgrade , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1234.5678-10 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : PackageUpgradeOnly , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1234.5678-9.1 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : PackageUpgradeOnly , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1234.5678-8 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : NewerThanSyncVersion , pkg1 . compareVersion ( pkg2 ) ) ;
pkg2 . version = " 1224.5678-9 " ;
CPPUNIT_ASSERT_EQUAL ( PackageVersionComparison : : NewerThanSyncVersion , pkg1 . compareVersion ( pkg2 ) ) ;
}
void DataTests : : testDependencyStringConversion ( )
{
CPPUNIT_ASSERT_EQUAL ( " foo>=4.5: bar " s , Dependency ( " foo " , " 4.5 " , DependencyMode : : GreatherEqual , " bar " ) . toString ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " foo=4.5 " s , Dependency ( " foo " , " 4.5 " , DependencyMode : : Equal ) . toString ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " foo: bar " s , Dependency ( " foo " , " 4.5 " , DependencyMode : : Any , " bar " ) . toString ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " foo " s , Dependency ( " foo " , " 4.5 " , DependencyMode : : Any ) . toString ( ) ) ;
}
void DataTests : : testDependencyMatching ( )
{
Package pkg ;
pkg . name = " my-foo " ;
pkg . version = " 123.2.4-1 " ;
pkg . provides . emplace_back ( " foo " , " 123.2.4-1 " ) ;
Dependency dep ;
dep . name = " my-foo " ;
CPPUNIT_ASSERT_MESSAGE ( " without constraint, direct match " , pkg . providesDependency ( dep ) ) ;
dep . name = " bar " ;
CPPUNIT_ASSERT_MESSAGE ( " without constraint, no match " , ! pkg . providesDependency ( dep ) ) ;
dep . name = " foo " ;
CPPUNIT_ASSERT_MESSAGE ( " without constraint, match via provides " , pkg . providesDependency ( dep ) ) ;
dep . name = " my-foo " ;
dep . version = pkg . version ;
dep . mode = DependencyMode : : Equal ;
CPPUNIT_ASSERT_MESSAGE ( " equal constraint, direct match " , pkg . providesDependency ( dep ) ) ;
dep . mode = DependencyMode : : GreatherEqual ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater equal constraint, no match " , pkg . providesDependency ( dep ) ) ;
2021-01-25 00:24:31 +01:00
dep . mode = DependencyMode : : GreatherThan ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater constraint, no match " , ! pkg . providesDependency ( dep ) ) ;
2021-01-25 00:24:31 +01:00
dep . mode = DependencyMode : : LessEqual ;
CPPUNIT_ASSERT_MESSAGE ( " less equal constraint, match " , pkg . providesDependency ( dep ) ) ;
dep . mode = DependencyMode : : LessThan ;
CPPUNIT_ASSERT_MESSAGE ( " less constraint, no match " , ! pkg . providesDependency ( dep ) ) ;
dep . mode = DependencyMode : : Equal ;
pkg . version + = ' 0 ' ;
CPPUNIT_ASSERT_MESSAGE ( " equal constraint, no match " , ! pkg . providesDependency ( dep ) ) ;
dep . mode = DependencyMode : : GreatherEqual ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater equal constraint, direct match " , pkg . providesDependency ( dep ) ) ;
2021-01-25 00:24:31 +01:00
pkg . version = " 123.4 " ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater equal constraint, direct match " , pkg . providesDependency ( dep ) ) ;
2021-01-25 00:24:31 +01:00
dep . name = " foo " ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater equal constraint, indirect match " , pkg . providesDependency ( dep ) ) ;
2021-01-25 00:24:31 +01:00
Package pkg2 ;
pkg2 . name = " crypto++ " ;
pkg2 . version = " 5.6.5-1 " ;
const char * depStr = " crypto++=5.6.5-1 " ;
CPPUNIT_ASSERT_MESSAGE ( " name with plus signs " , pkg2 . providesDependency ( Dependency : : fromString ( depStr , 8 ) ) ) ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " equal constraint with explicitly specified pkgrel " , pkg2 . providesDependency ( Dependency : : fromString ( depStr , 16 ) ) ) ;
2021-01-25 00:24:31 +01:00
CPPUNIT_ASSERT_MESSAGE ( " equal constraint, default pkgrel should match " , pkg2 . providesDependency ( Dependency : : fromString ( depStr , 14 ) ) ) ;
Package pkg3 ;
pkg3 . name = " crypto++ " ;
pkg3 . version = " 5.6.5-2 " ;
CPPUNIT_ASSERT_MESSAGE ( " equal constraint, any pkgrel should match " , pkg3 . providesDependency ( Dependency : : fromString ( depStr , 14 ) ) ) ;
CPPUNIT_ASSERT_MESSAGE (
2021-07-03 19:59:57 +02:00
" equal constraint with explicitly specified pkgrel must not match " , ! pkg3 . providesDependency ( Dependency : : fromString ( depStr , 16 ) ) ) ;
2021-01-25 00:24:31 +01:00
depStr = " crypto++>=5.6.5-1 " ;
2021-07-13 00:41:49 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater equal constraint with explicitly specified pkgrel " , pkg2 . providesDependency ( Dependency : : fromString ( depStr , 17 ) ) ) ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_MESSAGE ( " greater equal constraint, default pkgrel should match " , pkg2 . providesDependency ( Dependency : : fromString ( depStr , 15 ) ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " greater equal constrainer, any pkgrel should match " , pkg3 . providesDependency ( Dependency : : fromString ( depStr , 15 ) ) ) ;
2021-01-25 00:24:31 +01:00
CPPUNIT_ASSERT_MESSAGE (
2021-07-03 19:59:57 +02:00
" greater equal constraint with explicitly specified pkgrel must match " , pkg3 . providesDependency ( Dependency : : fromString ( depStr , 17 ) ) ) ;
2021-01-25 00:24:31 +01:00
2021-02-08 22:12:31 +01:00
pkg3 . name = " sphinxbase " ;
pkg3 . version = " 5prealpha-11.1aBc " ;
depStr = " sphinxbase=5prealpha " ;
CPPUNIT_ASSERT_MESSAGE (
" equal constraint, any pkgrel should match (even strange one) " , pkg3 . providesDependency ( Dependency : : fromString ( depStr , 20 ) ) ) ;
2021-01-25 00:24:31 +01:00
pkg3 . name = " ffmpeg " ;
pkg3 . version = " 1:4.1-3 " ;
2021-02-08 22:12:31 +01:00
CPPUNIT_ASSERT_MESSAGE ( " real-world ffmpeg example (1) " , pkg3 . providesDependency ( Dependency : : fromString ( " ffmpeg<1:4.3 " ) ) ) ;
2021-01-25 00:24:31 +01:00
pkg3 . version = " 1:4.1-2 " ;
2021-02-08 22:12:31 +01:00
CPPUNIT_ASSERT_MESSAGE ( " real-world ffmpeg example (2) " , ! pkg3 . providesDependency ( Dependency : : fromString ( " ffmpeg>=1:4.1-3 " ) ) ) ;
2022-03-29 22:08:20 +02:00
pkg3 . name = " python-jinja " ;
pkg3 . version = " 1:3.0.3-1 " ;
CPPUNIT_ASSERT_MESSAGE ( " real-world python-jinja example (epoch equal) " , pkg3 . providesDependency ( Dependency : : fromString ( " python-jinja>=1:2.10.3 " ) ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " real-world python-jinja example (epoch absend) " , pkg3 . providesDependency ( Dependency : : fromString ( " python-jinja>=2.10.3 " ) ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " real-world python-jinja example (epoch higher) " , ! pkg3 . providesDependency ( Dependency : : fromString ( " python-jinja>=2:2.10.3 " ) ) ) ;
pkg3 . version = " 3.0.3-1 " ;
CPPUNIT_ASSERT_MESSAGE ( " real-world python-jinja example (epoch absend in package) " , ! pkg3 . providesDependency ( Dependency : : fromString ( " python-jinja>=1:2.10.3 " ) ) ) ;
pkg3 . version = " 3:3.0.3-1 " ;
CPPUNIT_ASSERT_MESSAGE ( " real-world python-jinja example (epoch higher in package) " , pkg3 . providesDependency ( Dependency : : fromString ( " python-jinja>=2:2.10.3 " ) ) ) ;
2021-01-25 00:24:31 +01:00
}
void DataTests : : testPackageSearch ( )
{
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
auto pkgs = m_config . findPackages ( " foo " sv ) ;
CPPUNIT_ASSERT_EQUAL ( 2 _st , pkgs . size ( ) ) ;
2021-12-05 23:40:51 +01:00
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " package from first db returned first, cached object returned " , m_pkg1 , pkgs . front ( ) . pkg ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " package from first db returned second, cached object returned " , m_pkg3 , pkgs . back ( ) . pkg ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " package id set as expected (1) " , m_pkgId1 , pkgs . front ( ) . id ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " package id set as expected (2) " , m_pkgId3 , pkgs . back ( ) . id ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " db set as expected (1) " , & m_config . databases . front ( ) , std : : get < Database * > ( pkgs . front ( ) . db ) ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " db set as expected (2) " , & m_config . databases . back ( ) , std : : get < Database * > ( pkgs . back ( ) . db ) ) ;
auto [ db , pkg , packageID ] = m_config . findPackage ( Dependency ( " foo " ) ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " expected package for dependency returned " , m_pkgId1 , packageID ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " find package returns the package from the first database " , & m_config . databases . front ( ) , std : : get < Database * > ( db ) ) ;
2022-03-01 00:43:06 +01:00
// FIXME: check whether package is actually (value) equivalent
2021-01-25 00:24:31 +01:00
pkgs = m_config . findPackages ( " bar " sv ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , pkgs . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( m_pkg2 , pkgs . front ( ) . pkg ) ;
pkgs = m_config . findPackages ( " db2/foo " sv ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , pkgs . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( m_pkg3 , pkgs . front ( ) . pkg ) ;
pkgs = m_config . findPackages ( " db2/bar " sv ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , pkgs . size ( ) ) ;
pkgs = m_config . findPackages ( Dependency ( " foo " , " 5.7-1 " , DependencyMode : : Any ) ) ;
CPPUNIT_ASSERT_EQUAL ( 3 _st , pkgs . size ( ) ) ;
pkgs = m_config . findPackages ( Dependency ( " foo " , " 5.8-1 " , DependencyMode : : GreatherEqual ) ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , pkgs . size ( ) ) ;
2021-12-05 23:40:51 +01:00
CPPUNIT_ASSERT_EQUAL ( m_pkgId2 , pkgs . front ( ) . id ) ;
2022-03-01 00:43:06 +01:00
// FIXME: check whether package is actually (value) equivalent
2021-01-25 00:24:31 +01:00
pkgs = m_config . findPackages ( Dependency ( " bar " , " 5.5-1 " , DependencyMode : : Equal ) ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , pkgs . size ( ) ) ;
2021-12-05 23:40:51 +01:00
CPPUNIT_ASSERT_EQUAL ( m_pkgId2 , pkgs . front ( ) . id ) ;
2022-03-01 00:43:06 +01:00
// FIXME: check whether package is actually (value) equivalent
2021-01-25 00:24:31 +01:00
pkgs = m_config . findPackages ( Dependency ( " bar " , " 5.8-1 " , DependencyMode : : Equal ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , pkgs . size ( ) ) ;
}
void DataTests : : testComputingFileName ( )
{
2021-12-05 23:40:51 +01:00
auto pkg = Package ( ) ;
2021-01-25 00:24:31 +01:00
pkg . name = " test " ;
pkg . version = " 1.2-3 " ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " packageInfo required for computing filename " , string ( ) , pkg . computeFileName ( ) ) ;
pkg . packageInfo = make_unique < PackageInfo > ( ) ;
pkg . packageInfo - > arch = " x86_64 " ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " file name computed from name, version and arch " , " test-1.2-3-x86_64.pkg.tar.zst " s , pkg . computeFileName ( ) ) ;
2021-07-07 20:13:22 +02:00
pkg . packageInfo - > fileName = " explicitly-specified-filename " ;
2021-07-03 19:59:57 +02:00
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " explicitly specified filename returned " , " explicitly-specified-filename " s , pkg . computeFileName ( ) ) ;
2021-01-25 00:24:31 +01:00
}
void DataTests : : testDetectingUnresolved ( )
{
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-02-09 11:59:23 +01:00
auto & db1 = m_config . databases [ 0 ] ;
2021-01-25 00:24:31 +01:00
CPPUNIT_ASSERT_EQUAL ( 0 _st , db1 . detectUnresolvedPackages ( m_config , { } , { } ) . size ( ) ) ;
// upgrade bar to 5.6, foo should be unresolvable
m_pkg2 - > version = " 5.6 " ;
2021-02-09 11:59:23 +01:00
auto removedPackages = DependencySet ( ) ;
2021-01-25 00:24:31 +01:00
removedPackages . add ( Dependency ( " bar " , " 5.5 " ) , m_pkg2 ) ;
2021-02-09 11:59:23 +01:00
const auto failures = db1 . detectUnresolvedPackages ( m_config , { m_pkg2 } , removedPackages ) ;
2021-01-25 00:24:31 +01:00
CPPUNIT_ASSERT_EQUAL ( 1 _st , failures . size ( ) ) ;
2021-12-05 23:40:51 +01:00
CPPUNIT_ASSERT_EQUAL ( m_pkgId1 , failures . begin ( ) - > first . id ) ;
2021-01-25 00:24:31 +01:00
}
void DataTests : : testComputingBuildOrder ( )
{
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
// order correctly changed according to dependencies
auto res = m_config . computeBuildOrder ( { " foo " , " bar " } , BuildOrderOptions : : None ) ;
CPPUNIT_ASSERT_EQUAL ( true , res . success ) ;
CPPUNIT_ASSERT_EQUAL ( 2 _st , res . order . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " bar " s , res . order [ 0 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( " foo " s , res . order [ 1 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . ignored . size ( ) ) ;
// unknown package ignored
2021-12-05 23:40:51 +01:00
const auto ignored = std : : vector < std : : string > { " baz " } ;
2021-01-25 00:24:31 +01:00
res = m_config . computeBuildOrder ( { " foo " , " bar " , ignored [ 0 ] } , BuildOrderOptions : : None ) ;
CPPUNIT_ASSERT_EQUAL ( false , res . success ) ;
CPPUNIT_ASSERT_EQUAL ( 2 _st , res . order . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " bar " s , res . order [ 0 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( " foo " s , res . order [ 1 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( ignored , res . ignored ) ;
// add cycle
2021-12-05 23:40:51 +01:00
auto & db = m_config . databases [ 0 ] ;
auto tar = std : : make_shared < Package > ( ) ;
2021-01-25 00:24:31 +01:00
tar - > name = " tar " ;
tar - > version = " 5.6-6 " ;
tar - > dependencies . emplace_back ( " foo " ) ;
m_pkg2 - > dependencies . emplace_back ( " tar " ) ; // let bar depend on tar
2021-12-05 23:40:51 +01:00
db . forceUpdatePackage ( tar ) ;
db . forceUpdatePackage ( m_pkg2 ) ;
2021-01-25 00:24:31 +01:00
// fail due to cycle
res = m_config . computeBuildOrder ( { " foo " , " bar " , " tar " } , BuildOrderOptions : : None ) ;
CPPUNIT_ASSERT_EQUAL ( false , res . success ) ;
CPPUNIT_ASSERT_EQUAL ( 3 _st , res . cycle . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " foo " s , res . cycle [ 0 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( " bar " s , res . cycle [ 1 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( " tar " s , res . cycle [ 2 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . order . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . ignored . size ( ) ) ;
// fail due to cycle even if package not in the specified list
res = m_config . computeBuildOrder ( { " foo " , " bar " } , BuildOrderOptions : : None ) ;
CPPUNIT_ASSERT_EQUAL ( false , res . success ) ;
CPPUNIT_ASSERT_EQUAL ( 3 _st , res . cycle . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " foo " s , res . cycle [ 0 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( " bar " s , res . cycle [ 1 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( " tar " s , res . cycle [ 2 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . order . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . ignored . size ( ) ) ;
// ignore cycle if not interested in that particular package
2021-12-05 23:40:51 +01:00
m_pkg2 - > packageInfo = std : : make_unique < PackageInfo > ( ) ;
tar - > packageInfo = std : : make_unique < PackageInfo > ( ) ;
2021-01-25 00:24:31 +01:00
tar - > dependencies . clear ( ) ;
tar - > dependencies . emplace_back ( " bar " ) ;
2021-12-05 23:40:51 +01:00
db . forceUpdatePackage ( tar ) ;
db . forceUpdatePackage ( m_pkg2 ) ;
2021-01-25 00:24:31 +01:00
res = m_config . computeBuildOrder ( { " foo " } , BuildOrderOptions : : None ) ;
CPPUNIT_ASSERT_EQUAL ( true , res . success ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . cycle . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , res . order . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( " foo " s , res . order [ 0 ] . pkg - > name ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , res . ignored . size ( ) ) ;
}
void DataTests : : setupTestDbs ( std : : size_t dbCount )
{
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
m_config . databases . reserve ( m_config . databases . size ( ) + dbCount ) ;
for ( std : : size_t i = 1 ; i < = dbCount ; + + i ) {
m_config . findOrCreateDatabase ( argsToString ( " db " , i ) , " x86_64 " ) ;
}
}
inline Database & DataTests : : db ( std : : size_t dbNum )
{
return m_config . databases [ dbNum - 1 ] ;
}
inline std : : vector < Database * > DataTests : : dbs ( std : : initializer_list < std : : size_t > dbNums )
{
std : : vector < Database * > res ;
res . reserve ( dbNums . size ( ) ) ;
for ( const auto dbNum : dbNums ) {
res . emplace_back ( & db ( dbNum ) ) ;
}
return res ;
}
void DataTests : : testComputingDatabaseOrder ( )
{
setupTestDbs ( ) ;
db ( 1 ) . dependencies = { " db2 " , " db3 " } ;
db ( 2 ) . dependencies = { " db4 " } ;
db ( 3 ) . dependencies = { " db5 " , " db2 " } ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 5 } ) , get < vector < Database * > > ( m_config . computeDatabaseDependencyOrder ( db ( 5 ) ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 4 } ) , get < vector < Database * > > ( m_config . computeDatabaseDependencyOrder ( db ( 4 ) ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 5 , 4 , 2 , 3 } ) , get < vector < Database * > > ( m_config . computeDatabaseDependencyOrder ( db ( 3 ) ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 4 , 2 } ) , get < vector < Database * > > ( m_config . computeDatabaseDependencyOrder ( db ( 2 ) ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 4 , 2 , 5 , 3 , 1 } ) , get < vector < Database * > > ( m_config . computeDatabaseDependencyOrder ( db ( 1 ) ) ) ) ;
db ( 4 ) . dependencies = { " db1 " } ;
db ( 5 ) . dependencies = { " db6 " } ;
CPPUNIT_ASSERT_EQUAL ( " cycle at db1 " s , get < string > ( m_config . computeDatabaseDependencyOrder ( db ( 1 ) ) ) ) ;
CPPUNIT_ASSERT_EQUAL (
" database \" db6 \" required by \" db5 \" does not exist (architecture x86_64) " s , get < string > ( m_config . computeDatabaseDependencyOrder ( db ( 3 ) ) ) ) ;
}
void DataTests : : testComputingDatabasesRequiringDatabase ( )
{
setupTestDbs ( ) ;
db ( 1 ) . dependencies = { " db2 " , " db3 " } ;
db ( 2 ) . dependencies = { " db4 " } ;
db ( 3 ) . dependencies = { " db5 " } ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 1 } ) , m_config . computeDatabasesRequiringDatabase ( db ( 1 ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 2 , 1 } ) , m_config . computeDatabasesRequiringDatabase ( db ( 2 ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 3 , 1 } ) , m_config . computeDatabasesRequiringDatabase ( db ( 3 ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 4 , 2 , 1 } ) , m_config . computeDatabasesRequiringDatabase ( db ( 4 ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( dbs ( { 5 , 3 , 1 } ) , m_config . computeDatabasesRequiringDatabase ( db ( 5 ) ) ) ;
}
void DataTests : : testUpdateCheck ( )
{
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
auto & db1 = m_config . databases . front ( ) ;
auto & db2 = m_config . databases . back ( ) ;
const auto result = db1 . checkForUpdates ( { & db2 } ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , result . versionUpdates . size ( ) ) ;
2021-12-05 23:40:51 +01:00
CPPUNIT_ASSERT_EQUAL ( m_pkgId1 , result . versionUpdates . front ( ) . oldVersion . id ) ;
CPPUNIT_ASSERT_EQUAL ( m_pkgId3 , result . versionUpdates . front ( ) . newVersion . id ) ;
2021-01-25 00:24:31 +01:00
CPPUNIT_ASSERT_EQUAL ( 0 _st , result . packageUpdates . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 _st , result . downgrades . size ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( 1 _st , result . orphans . size ( ) ) ;
2021-12-05 23:40:51 +01:00
CPPUNIT_ASSERT_EQUAL ( m_pkgId2 , result . orphans . front ( ) . id ) ;
2021-01-25 00:24:31 +01:00
}
void DataTests : : testLocatePackage ( )
{
const auto fakePkgPath = testFilePath ( " repo/foo/fake-0-any.pkg.tar.zst " ) ;
const auto syncthingTrayPkgPath = testFilePath ( " repo/foo/syncthingtray-0.6.2-1-x86_64.pkg.tar.xz " ) ;
const auto syncthingTrayStorageLocation = std : : filesystem : : canonical ( testFilePath ( " syncthingtray/syncthingtray-0.6.2-1-x86_64.pkg.tar.xz " ) ) ;
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
auto & db = m_config . databases . front ( ) ;
db . localPkgDir = std : : filesystem : : path ( fakePkgPath ) . parent_path ( ) ;
const auto emptyPkg = db . locatePackage ( std : : string ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( std : : string ( ) , emptyPkg . pathWithinRepo . string ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( std : : string ( ) , emptyPkg . storageLocation . string ( ) ) ;
CPPUNIT_ASSERT ( ! emptyPkg . exists ) ;
CPPUNIT_ASSERT ( ! emptyPkg . error . has_value ( ) ) ;
const auto missingPkg = db . locatePackage ( " missing-0-any.pkg.tar.zst " ) ;
CPPUNIT_ASSERT_EQUAL ( db . localPkgDir + " /missing-0-any.pkg.tar.zst " , missingPkg . pathWithinRepo . string ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( db . localPkgDir + " /does_not_exist " s , missingPkg . storageLocation . string ( ) ) ;
CPPUNIT_ASSERT ( ! missingPkg . exists ) ;
CPPUNIT_ASSERT ( ! missingPkg . error . has_value ( ) ) ;
const auto fakePkg = db . locatePackage ( " fake-0-any.pkg.tar.zst " ) ;
CPPUNIT_ASSERT_EQUAL ( fakePkgPath , fakePkg . pathWithinRepo . string ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( std : : string ( ) , fakePkg . storageLocation . string ( ) ) ;
CPPUNIT_ASSERT ( fakePkg . exists ) ;
CPPUNIT_ASSERT ( ! fakePkg . error . has_value ( ) ) ;
const auto syncthingPkg = db . locatePackage ( " syncthingtray-0.6.2-1-x86_64.pkg.tar.xz " ) ;
CPPUNIT_ASSERT_EQUAL ( syncthingTrayPkgPath , syncthingPkg . pathWithinRepo . string ( ) ) ;
CPPUNIT_ASSERT_EQUAL ( syncthingTrayStorageLocation , syncthingPkg . storageLocation ) ;
CPPUNIT_ASSERT ( fakePkg . exists ) ;
CPPUNIT_ASSERT ( ! fakePkg . error . has_value ( ) ) ;
}
void DataTests : : testAddingDepsAndProvidesFromOtherPackage ( )
{
const std : : unordered_set < Dependency > dependenciesToTakeOver = {
Dependency { " python2 " , " 2.18 " , DependencyMode : : LessThan } ,
Dependency { " python " , " 3.5 " , DependencyMode : : LessThan } ,
Dependency { " perl " , " 5.32 " , DependencyMode : : GreatherEqual } ,
} ;
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
m_pkg1 - > origin = PackageOrigin : : PackageContents ;
m_pkg1 - > dependencies . insert ( m_pkg1 - > dependencies . end ( ) , dependenciesToTakeOver . begin ( ) , dependenciesToTakeOver . end ( ) ) ;
m_pkg1 - > libdepends . emplace ( " foo " ) ;
m_pkg1 - > libprovides . emplace ( " bar " ) ;
Package pkg1 ;
CPPUNIT_ASSERT_MESSAGE ( " adding from itself always prevented " , ! pkg1 . addDepsAndProvidesFromOtherPackage ( pkg1 , true ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " not adding on version mismatch " , ! pkg1 . addDepsAndProvidesFromOtherPackage ( * m_pkg1 ) ) ;
CPPUNIT_ASSERT_MESSAGE ( " adding from other package forced " , pkg1 . addDepsAndProvidesFromOtherPackage ( * m_pkg1 , true ) ) ;
CPPUNIT_ASSERT_EQUAL ( PackageOrigin : : PackageContents , pkg1 . origin ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " libdeps taken over " , m_pkg1 - > libdepends , pkg1 . libdepends ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " libprovides taken over " , m_pkg1 - > libprovides , pkg1 . libprovides ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE (
" relevant deps taken over " , dependenciesToTakeOver , std : : unordered_set < Dependency > ( pkg1 . dependencies . begin ( ) , pkg1 . dependencies . end ( ) ) ) ;
pkg1 . version = m_pkg1 - > version ;
CPPUNIT_ASSERT_MESSAGE ( " adding from other package when version matches " , pkg1 . addDepsAndProvidesFromOtherPackage ( * m_pkg1 ) ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " no duplicate libdeps after 2nd run " , m_pkg1 - > libdepends , pkg1 . libdepends ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " no duplicate libprovides after 2nd run " , m_pkg1 - > libprovides , pkg1 . libprovides ) ;
CPPUNIT_ASSERT_EQUAL_MESSAGE ( " no duplicate deps after 2nd run " , dependenciesToTakeOver ,
std : : unordered_set < Dependency > ( pkg1 . dependencies . begin ( ) , pkg1 . dependencies . end ( ) ) ) ;
}
void DataTests : : testDependencyExport ( )
{
2021-12-05 23:40:51 +01:00
setupPackages ( ) ;
2021-01-25 00:24:31 +01:00
m_pkg2 - > provides . emplace_back ( " yet-another-dependency " ) ;
m_pkg2 - > libprovides . emplace ( " libfoo " ) ;
m_pkg2 - > libprovides . emplace ( " libbar " ) ;
DependencySet provides ;
std : : unordered_set < std : : string > libProvides ;
Package : : exportProvides ( m_pkg2 , provides , libProvides ) ;
CPPUNIT_ASSERT_EQUAL ( 3 _st , provides . size ( ) ) ;
CPPUNIT_ASSERT ( provides . provides ( " foo " , DependencyDetail ( ) ) ) ;
CPPUNIT_ASSERT ( provides . provides ( " bar " , DependencyDetail ( ) ) ) ;
CPPUNIT_ASSERT ( provides . provides ( " yet-another-dependency " , DependencyDetail ( ) ) ) ;
CPPUNIT_ASSERT_EQUAL ( 2 _st , libProvides . size ( ) ) ;
CPPUNIT_ASSERT ( libProvides . contains ( " libfoo " ) ) ;
CPPUNIT_ASSERT ( libProvides . contains ( " libbar " ) ) ;
}
void DataTests : : testMisc ( )
{
CPPUNIT_ASSERT_EQUAL ( " 123.4 " s , PackageVersion : : trimPackageVersion ( " 123.4 " s ) ) ;
CPPUNIT_ASSERT_EQUAL ( " 123 " s , PackageVersion : : trimPackageVersion ( " 123-4 " s ) ) ;
CPPUNIT_ASSERT_EQUAL ( " 123 " s , PackageVersion : : trimPackageVersion ( " 123 " s ) ) ;
}