# file : tests/ci.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file .include common.testscript project.testscript # bdep-ci requirements for the minimum supported git version are higher then # the default 2.1.0 (see bdep/ci.cxx for details). # +if! ($git_version_major > 2 || \ $git_version_major == 2 && $git_version_minor >= 11) exit end # Server to use for the CI request submissions simulation. # # Note that the empty config.bdep.test.repository value is used to suppress # these tests (which require network access). # server = ($config.bdep.test.repository == [null] \ ? ($build.version.stage \ ? 'https://stage.build2.org' \ : 'https://ci.cppget.org') \ : "$config.bdep.test.repository") +if ("$server" == '') exit end # Create the remote repository. # +mkdir --no-cleanup prj.git +git -C prj.git init --bare 2>! >&2 &prj.git/*** # Adjust the local repository and push it to the remote one. # +sed -i -e 's/^(version:) .*$/\1 1.0.1/' prj/manifest g = git -C prj 2>! >&2 +$g config user.name 'Test Script' +$g config user.email 'testscript@example.com' +$g remote add origin $~/prj.git +$g add '*' +$g commit -m 'Create' +$g push --set-upstream origin master # Repository the CI-ed packages come from. # repository='http://example.com/prj.git' test.arguments += --yes --repository "$repository" --server "$server" \ --simulate 'success' cxx = cc config.cxx="$recall($cxx.path)" new += 2>! init += $cxx -d prj 2>! &prj/**/bootstrap/*** windows = ($cxx.target.class == 'windows') # Normally we disable the progress indication that complicates stderr output # validation. When testing the progress indication specifically we need to # handle curl's progress carefully, as it is not always terminated with the # newline character on Windows. # : single-pkg : { : single-cfg : { $clone_root_prj; $init -C @cfg &prj-cfg/***; $* --no-progress 2>>~%EOE% %CI request is queued.*% %reference: .+% EOE } : progress : { $clone_root_prj; $init -C @cfg &prj-cfg/***; $* 2>>~"%EOE%" submitting to $server %.* %.*CI request is queued.*% %reference: .+% EOE } : no-cfg : { $new prj &prj/***; $* 2>>~%EOE% != 0 %error: no default configuration in project .+% % info: use .+% EOE } : multi-cfg : { $clone_root_prj; $init -C @cfg1 &prj-cfg1/***; $init -C @cfg2 &prj-cfg2/***; $* --all 2>'error: multiple configurations specified for ci' != 0 } : no-commits : { $new prj &prj/***; $init -C @cfg &prj-cfg/***; $* 2>>~%EOE% != 0 error: no commits in project repository % info: run .+% EOE } : invalid-repo : { test.arguments += --repository "$repository#frag" $clone_root_prj; $init -C @cfg &prj-cfg/***; $* 2>>"EOE" != 0 error: remote git repository URL '$repository#frag' already has fragment EOE } : overrides : { +$clone_root_prj +$init -C @cfg &prj-cfg/*** : valid : : Here we only test that bdep-ci does not fail for valid overrides. It : seems to be impossible to verify the submitted overrides manifest. : { $clone_prj; cat <=overrides.manifest; : 1 builds: all EOI $* --overrides-file overrides.manifest \ --build-email 'foo@example.com' \ --override 'build-error-email: error@example.com' \ --override 'builds: &gcc' \ --override 'build-include: linux*' \ --override 'build-exclude: *' 2>>~"%EOE%" submitting to $server %.* %.*CI request is queued.*% %reference: .+% EOE } : invalid-option : { +$clone_prj : overrides-file : { +$clone_prj : reading : { $clone_prj; $* --overrides-file overrides.manifest 2>>~%EOE% != 0 %error: invalid value 'overrides.manifest' for option '--overrides-file': unable to read: .+% EOE } : parsing : { $clone_prj; cat <=overrides.manifest; builds: all EOI $* --overrides-file overrides.manifest 2>>EOE != 0 error: invalid value 'overrides.manifest' for option '--overrides-file': unable to parse: 1:1: error: format version pair expected EOE } } : override : { $clone_prj; $* --override 'all' 2>>EOE != 0 error: invalid value 'all' for option '--override': missing ':' EOE } : override-pair : : Each override option is valid by its own, but the resulting overrides : manifest is invalid. : { $clone_prj; $* --override 'builds: all' --override 'builds: default : &gcc' 2>>EOE != 0 error: invalid overrides: invalid package builds in 'default : &gcc': unexpected underlying class set EOE } : overrides : : This is a fake option (see ci.cli for details). : { $clone_prj; $* --overrides 'all' 2>>EOE != 0 error: unknown option '--overrides' EOE } } } } : multi-pkg : { # Create the remote repository. # +mkdir --no-cleanup prj.git +git -C prj.git init --bare 2>! >&2 &prj.git/*** # Create the local repository and push it to the remote one. # +$new -t empty prj &prj/*** +$new --package -t lib libprj -d prj +$new --package -t exe prj -d prj +sed -i -e 's/^(version:) .*$/\1 1.0.1/' prj/libprj/manifest +sed -i -e 's/^(version:) .*$/\1 1.0.1/' prj/prj/manifest +$g config user.name 'Test Script' +$g config user.email 'testscript@example.com' +$g remote add origin $~/prj.git +$g add '*' +$g commit -m 'Create' +$g push --set-upstream origin master test.options += --no-progress : both : { $clone_prj; $init -C @cfg &prj-cfg/***; $* 2>>~%EOE% %CI request is queued.*% %reference: .+% EOE } : single : { $clone_prj; $init -C @cfg &prj-cfg/***; # CI the single libprj package rather than the whole prj project. # test.arguments = $regex.apply($test.arguments, '^(prj)$', '\1/libprj'); $* 2>>~%EOE% %CI request is queued.*% %reference: .+% EOE } : prompt : { $clone_prj; $init -C @cfg &prj-cfg/***; # Suppress the --yes option. # test.arguments = $regex.apply($test.arguments, '^(--yes)$', ''); $* <'y' 2>>~"%EOE%" submitting: to: $server % in: $repository#master@.{40}% package: libprj version: 1.0.1 package: prj version: 1.0.1 %continue\\?.+ CI request is queued.*% %reference: .+% EOE } }