2016-08-22 14:08:25 +00:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2016-09-22 08:28:01 +00:00
try :
import unittest2 as unittest
except ImportError :
import unittest
2016-08-22 14:08:25 +00:00
import os
2017-09-05 08:01:21 +00:00
import six
2016-08-22 14:08:25 +00:00
import sys
2017-09-21 07:41:43 +00:00
import mock
2016-08-22 14:08:25 +00:00
sys . path . insert ( 0 , os . path . join ( os . path . dirname ( __file__ ) , ' .. ' ) )
from pungi import checks
from tests . helpers import load_config , PKGSET_REPOS
2016-12-07 14:57:35 +00:00
class ConfigTestCase ( unittest . TestCase ) :
def assertValidation ( self , cfg , errors = [ ] , warnings = [ ] ) :
actual_errors , actual_warnings = checks . validate ( cfg )
self . assertItemsEqual ( errors , actual_errors )
self . assertEqual ( warnings , actual_warnings )
class PkgsetConfigTestCase ( ConfigTestCase ) :
2016-08-22 14:08:25 +00:00
def test_validate_minimal_pkgset_koji ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
def test_validate_minimal_pkgset_repos ( self ) :
cfg = load_config (
pkgset_source = ' repos ' ,
pkgset_repos = { ' x86_64 ' : ' /first ' , ' ppc64 ' : ' /second ' } ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
def test_pkgset_mismatch_repos ( self ) :
cfg = load_config (
pkgset_source = ' repos ' ,
pkgset_koji_tag = ' f25 ' ,
pkgset_koji_inherit = False ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2016-08-22 14:08:25 +00:00
[ checks . REQUIRES . format ( ' pkgset_source ' , ' repos ' , ' pkgset_repos ' ) ,
checks . CONFLICTS . format ( ' pkgset_source ' , ' repos ' , ' pkgset_koji_tag ' ) ,
checks . CONFLICTS . format ( ' pkgset_source ' , ' repos ' , ' pkgset_koji_inherit ' ) ] )
def test_pkgset_mismatch_koji ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
pkgset_repos = { ' whatever ' : ' /foo ' } ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2017-11-07 13:05:50 +00:00
[ checks . CONFLICTS . format ( ' pkgset_source ' , ' koji ' , ' pkgset_repos ' ) ] )
2016-08-22 14:08:25 +00:00
2017-06-27 11:48:02 +00:00
def test_pkgset_multiple_koji_tags ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
pkgset_koji_tag = [ ' f25 ' , ' f25-extra ' ] ,
pkgset_koji_inherit = False ,
)
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class ReleaseConfigTestCase ( ConfigTestCase ) :
2019-06-03 06:55:40 +00:00
def test_set_release_is_layered ( self ) :
2016-08-22 14:08:25 +00:00
cfg = load_config (
PKGSET_REPOS ,
release_is_layered = True
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2019-06-03 06:55:40 +00:00
warnings = [
" WARNING: Config option release_is_layered was removed and has no effect; remove it. It ' s layered if there ' s configuration for base product. " ] )
2016-08-22 14:08:25 +00:00
2019-06-03 06:55:40 +00:00
def test_only_config_base_product_name ( self ) :
2016-08-22 14:08:25 +00:00
cfg = load_config (
PKGSET_REPOS ,
base_product_name = ' Prod ' ,
2019-06-03 06:55:40 +00:00
)
self . assertValidation (
cfg ,
[ checks . REQUIRES . format ( ' base_product_name ' , ' Prod ' , ' base_product_short ' ) ,
checks . REQUIRES . format ( ' base_product_name ' , ' Prod ' , ' base_product_version ' ) ,
checks . CONFLICTS . format ( ' base_product_short ' , None , ' base_product_name ' ) ,
checks . CONFLICTS . format ( ' base_product_version ' , None , ' base_product_name ' ) ] )
def test_only_config_base_product_short ( self ) :
cfg = load_config (
PKGSET_REPOS ,
2016-08-22 14:08:25 +00:00
base_product_short = ' bp ' ,
2019-06-03 06:55:40 +00:00
)
self . assertValidation (
cfg ,
[ checks . REQUIRES . format ( ' base_product_short ' , ' bp ' , ' base_product_name ' ) ,
checks . REQUIRES . format ( ' base_product_short ' , ' bp ' , ' base_product_version ' ) ,
checks . CONFLICTS . format ( ' base_product_name ' , None , ' base_product_short ' ) ,
checks . CONFLICTS . format ( ' base_product_version ' , None , ' base_product_short ' ) ] )
def test_only_config_base_product_version ( self ) :
cfg = load_config (
PKGSET_REPOS ,
2016-08-22 14:08:25 +00:00
base_product_version = ' 1.0 ' ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2019-06-03 06:55:40 +00:00
[ checks . REQUIRES . format ( ' base_product_version ' , ' 1.0 ' , ' base_product_name ' ) ,
checks . REQUIRES . format ( ' base_product_version ' , ' 1.0 ' , ' base_product_short ' ) ,
checks . CONFLICTS . format ( ' base_product_name ' , None , ' base_product_version ' ) ,
checks . CONFLICTS . format ( ' base_product_short ' , None , ' base_product_version ' ) ] )
2016-08-22 14:08:25 +00:00
2018-11-01 09:07:38 +00:00
class ImageNameConfigTestCase ( ConfigTestCase ) :
def test_image_name_simple_string ( self ) :
cfg = load_config (
PKGSET_REPOS ,
image_name_format = " foobar " ,
)
self . assertValidation ( cfg , [ ] )
def test_image_name_variant_mapping ( self ) :
cfg = load_config (
PKGSET_REPOS ,
image_name_format = { " ^Server$ " : " foobar " } ,
)
self . assertValidation ( cfg , [ ] )
2016-12-07 14:57:35 +00:00
class RunrootConfigTestCase ( ConfigTestCase ) :
2019-06-24 08:18:55 +00:00
def test_set_runroot_true ( self ) :
2016-08-22 14:08:25 +00:00
cfg = load_config (
PKGSET_REPOS ,
runroot = True ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2019-07-02 07:39:00 +00:00
warnings = [ " WARNING: Config option runroot was removed and has no effect; remove it. Please specify ' runroot_method ' if you want to enable runroot, otherwise run things locally. " ] )
2016-08-22 14:08:25 +00:00
2019-06-24 08:18:55 +00:00
def test_set_runroot_false ( self ) :
2016-08-22 14:08:25 +00:00
cfg = load_config (
PKGSET_REPOS ,
runroot = False ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2019-07-02 07:39:00 +00:00
warnings = [ " WARNING: Config option runroot was removed and has no effect; remove it. Please specify ' runroot_method ' if you want to enable runroot, otherwise run things locally. " ] )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class BuildinstallConfigTestCase ( ConfigTestCase ) :
2016-08-22 14:08:25 +00:00
def test_bootable_without_method ( self ) :
cfg = load_config (
PKGSET_REPOS ,
bootable = True ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
[ checks . REQUIRES . format ( ' bootable ' , ' True ' , ' buildinstall_method ' ) ] )
2016-08-22 14:08:25 +00:00
def test_non_bootable_with_method ( self ) :
cfg = load_config (
PKGSET_REPOS ,
bootable = False ,
buildinstall_method = ' lorax ' ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
[ checks . CONFLICTS . format ( ' bootable ' , ' False ' , ' buildinstall_method ' ) ] )
2016-08-22 14:08:25 +00:00
def test_buildinstall_method_without_bootable ( self ) :
cfg = load_config (
PKGSET_REPOS ,
buildinstall_method = ' lorax ' ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
[ checks . CONFLICTS . format ( ' bootable ' , ' False ' , ' buildinstall_method ' ) ] )
2016-08-22 14:08:25 +00:00
def test_buildinstall_with_lorax_options ( self ) :
cfg = load_config (
PKGSET_REPOS ,
bootable = True ,
buildinstall_method = ' buildinstall ' ,
lorax_options = [ ( ' ^Server$ ' , { } ) ]
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
[ checks . CONFLICTS . format ( ' buildinstall_method ' , ' buildinstall ' , ' lorax_options ' ) ] )
2016-08-22 14:08:25 +00:00
def test_lorax_with_lorax_options ( self ) :
cfg = load_config (
PKGSET_REPOS ,
bootable = True ,
buildinstall_method = ' lorax ' ,
lorax_options = [ ]
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
def test_lorax_options_without_bootable_and_method ( self ) :
cfg = load_config (
PKGSET_REPOS ,
lorax_options = [ ( ' ^Server$ ' , { } ) ] ,
buildinstall_kickstart = ' foo ' ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
2016-08-22 14:08:25 +00:00
[ checks . CONFLICTS . format ( ' buildinstall_method ' , ' None ' , ' lorax_options ' ) ,
2016-12-07 14:57:35 +00:00
checks . CONFLICTS . format ( ' buildinstall_method ' , ' None ' , ' buildinstall_kickstart ' ) ] )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class CreaterepoConfigTestCase ( ConfigTestCase ) :
2016-08-22 14:08:25 +00:00
def test_validate_minimal_pkgset_koji ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
pkgset_koji_tag = " f25 " ,
product_id_allow_missing = True ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation (
cfg ,
[ checks . CONFLICTS . format ( ' product_id ' , ' None ' , ' product_id_allow_missing ' ) ] )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class GatherConfigTestCase ( ConfigTestCase ) :
2017-09-21 07:41:43 +00:00
def test_dnf_backend_is_default_on_py3 ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
pkgset_koji_tag = ' f27 ' ,
)
with mock . patch ( ' six.PY2 ' , new = False ) :
self . assertValidation ( cfg , [ ] )
self . assertEqual ( cfg [ ' gather_backend ' ] , ' dnf ' )
def test_yum_backend_is_default_on_py2 ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
pkgset_koji_tag = ' f27 ' ,
)
with mock . patch ( ' six.PY2 ' , new = True ) :
self . assertValidation ( cfg , [ ] )
self . assertEqual ( cfg [ ' gather_backend ' ] , ' yum ' )
def test_yum_backend_is_rejected_on_py3 ( self ) :
cfg = load_config (
pkgset_source = ' koji ' ,
pkgset_koji_tag = ' f27 ' ,
gather_backend = ' yum ' ,
)
with mock . patch ( ' six.PY2 ' , new = False ) :
self . assertValidation (
cfg ,
[ " Failed validation in gather_backend: ' yum ' is not one of [ ' dnf ' ] " ] )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class OSBSConfigTestCase ( ConfigTestCase ) :
2016-08-22 14:08:25 +00:00
def test_validate ( self ) :
cfg = load_config (
PKGSET_REPOS ,
osbs = { " ^Server$ " : {
' url ' : ' http://example.com ' ,
' target ' : ' f25-build ' ,
2017-04-24 07:55:24 +00:00
' git_branch ' : ' f25 ' ,
2016-08-22 14:08:25 +00:00
} }
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
def test_validate_bad_conf ( self ) :
cfg = load_config (
PKGSET_REPOS ,
osbs = ' yes please '
)
2016-12-07 14:57:35 +00:00
self . assertNotEqual ( checks . validate ( cfg ) , ( [ ] , [ ] ) )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class OstreeConfigTestCase ( ConfigTestCase ) :
2016-08-22 14:08:25 +00:00
def test_validate ( self ) :
cfg = load_config (
PKGSET_REPOS ,
ostree = [
( " ^Atomic$ " , {
" x86_64 " : {
" treefile " : " fedora-atomic-docker-host.json " ,
" config_url " : " https://git.fedorahosted.org/git/fedora-atomic.git " ,
2017-03-27 21:53:08 +00:00
" repo " : " Everything " ,
2017-03-29 13:49:21 +00:00
" ostree_repo " : " /mnt/koji/compose/atomic/Rawhide/ " ,
" version " : ' !OSTREE_VERSION_FROM_LABEL_DATE_TYPE_RESPIN ' ,
2016-08-22 14:08:25 +00:00
}
} )
]
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
def test_validate_bad_conf ( self ) :
cfg = load_config (
PKGSET_REPOS ,
ostree = ' yes please '
)
2016-12-07 14:57:35 +00:00
self . assertNotEqual ( checks . validate ( cfg ) , ( [ ] , [ ] ) )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class OstreeInstallerConfigTestCase ( ConfigTestCase ) :
2016-08-22 14:08:25 +00:00
def test_validate ( self ) :
cfg = load_config (
PKGSET_REPOS ,
ostree_installer = [
( " ^Atomic$ " , {
" x86_64 " : {
2017-03-27 21:53:08 +00:00
" repo " : " Everything " ,
2016-08-22 14:08:25 +00:00
" release " : None ,
" installpkgs " : [ " fedora-productimg-atomic " ] ,
" add_template " : [ " /spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl " ] ,
" add_template_var " : [
" ostree_osname=fedora-atomic " ,
" ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host " ,
] ,
" add_arch_template " : [ " /spin-kickstarts/atomic-installer/lorax-embed-repo.tmpl " ] ,
2016-11-17 15:15:03 +00:00
" rootfs_size " : " 3 " ,
2016-08-22 14:08:25 +00:00
" add_arch_template_var " : [
" ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/ " ,
" ostree_osname=fedora-atomic " ,
" ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host " ,
]
}
} )
]
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
def test_validate_bad_conf ( self ) :
cfg = load_config (
PKGSET_REPOS ,
ostree_installer = [
( " ^Atomic$ " , {
" x86_64 " : {
2017-03-27 21:53:08 +00:00
" repo " : " Everything " ,
2016-08-22 14:08:25 +00:00
" release " : None ,
" installpkgs " : [ " fedora-productimg-atomic " ] ,
" add_template " : [ " /spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl " ] ,
" add_template_var " : [
" ostree_osname=fedora-atomic " ,
" ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host " ,
] ,
" add_arch_template " : 15 ,
" add_arch_template_var " : [
" ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/ " ,
" ostree_osname=fedora-atomic " ,
" ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host " ,
]
}
} )
]
)
2016-12-07 14:57:35 +00:00
self . assertNotEqual ( checks . validate ( cfg ) , ( [ ] , [ ] ) )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class LiveMediaConfigTestCase ( ConfigTestCase ) :
2018-11-21 09:56:22 +00:00
@mock.patch ( " pungi.util.resolve_git_url " )
def test_global_config_validation ( self , resolve_git_url ) :
2016-08-22 14:08:25 +00:00
cfg = load_config (
PKGSET_REPOS ,
live_media_ksurl = ' git://example.com/repo.git#HEAD ' ,
live_media_target = ' f24 ' ,
live_media_release = ' RRR ' ,
live_media_version = ' Rawhide ' ,
)
2018-11-21 09:56:22 +00:00
resolve_git_url . side_effect = lambda x : x . replace ( " HEAD " , " CAFE " )
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2018-11-21 09:56:22 +00:00
self . assertEqual ( cfg [ " live_media_ksurl " ] , " git://example.com/repo.git#CAFE " )
2016-08-22 14:08:25 +00:00
def test_global_config_null_release ( self ) :
cfg = load_config (
PKGSET_REPOS ,
live_media_release = None ,
)
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class TestSuggestions ( ConfigTestCase ) :
2016-08-19 08:09:40 +00:00
def test_with_a_typo ( self ) :
2016-08-22 14:08:25 +00:00
cfg = load_config ( PKGSET_REPOS ,
product_pid = None )
2016-12-07 14:57:35 +00:00
self . assertValidation ( cfg , [ ] , [ checks . UNKNOWN_SUGGEST . format ( ' product_pid ' , ' product_id ' ) ] )
2016-08-22 14:08:25 +00:00
2016-12-07 14:57:35 +00:00
class TestRegexValidation ( ConfigTestCase ) :
2016-10-12 07:38:59 +00:00
def test_incorrect_regular_expression ( self ) :
cfg = load_config ( PKGSET_REPOS ,
multilib = [ ( ' ^*$ ' , { ' * ' : [ ] } ) ] )
2017-09-05 08:01:21 +00:00
msg = ' Failed validation in multilib.0.0: incorrect regular expression: nothing to repeat '
if six . PY3 :
msg + = ' at position 1 '
self . assertValidation ( cfg , [ msg ] , [ ] )
2016-10-12 07:38:59 +00:00
2017-01-26 08:19:12 +00:00
class RepoclosureTestCase ( ConfigTestCase ) :
def test_invalid_backend ( self ) :
cfg = load_config (
PKGSET_REPOS ,
repoclosure_backend = ' fnd ' , # Intentionally with a typo
)
2017-12-04 11:30:18 +00:00
options = [ ' yum ' , ' dnf ' ] if six . PY2 else [ ' dnf ' ]
2017-01-26 08:19:12 +00:00
self . assertValidation (
cfg ,
2017-12-04 11:30:18 +00:00
[ " Failed validation in repoclosure_backend: ' fnd ' is not one of %s " % options ] )
2017-01-26 08:19:12 +00:00
2018-04-10 12:27:55 +00:00
class VariantAsLookasideTestCase ( ConfigTestCase ) :
def test_empty ( self ) :
variant_as_lookaside = [ ]
cfg = load_config (
PKGSET_REPOS ,
variant_as_lookaside = variant_as_lookaside ,
)
self . assertValidation ( cfg )
def test_basic ( self ) :
variant_as_lookaside = [
( " Client " , " Base " ) ,
( " Server " , " Client " ) ,
( " Everything " , " Spin " ) ,
]
cfg = load_config (
PKGSET_REPOS ,
variant_as_lookaside = variant_as_lookaside ,
)
self . assertValidation ( cfg )
2018-05-15 11:30:00 +00:00
class SkipPhasesTestCase ( ConfigTestCase ) :
def test_empty ( self ) :
skip_phases = [ ]
cfg = load_config (
PKGSET_REPOS ,
skip_phases = skip_phases ,
)
self . assertValidation ( cfg )
def test_basic ( self ) :
skip_phases = [
" buildinstall " ,
" gather " ,
]
cfg = load_config (
PKGSET_REPOS ,
skip_phases = skip_phases ,
)
self . assertValidation ( cfg )
def test_bad_phase_name ( self ) :
skip_phases = [
" gather " ,
" non-existing-phase_name " ,
]
cfg = load_config (
PKGSET_REPOS ,
skip_phases = skip_phases ,
)
self . assertNotEqual ( checks . validate ( cfg ) , ( [ ] , [ ] ) )
2016-08-22 14:08:25 +00:00
if __name__ == ' __main__ ' :
unittest . main ( )