From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([69.77.167.62] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1K0ZIR-0004J9-Ia for garchives@archives.gentoo.org; Mon, 26 May 2008 09:47:15 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id AF009E0430; Mon, 26 May 2008 09:47:13 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 5540EE0430 for ; Mon, 26 May 2008 09:47:13 +0000 (UTC) Received: from gentoo.org (c-71-193-142-160.hsd1.or.comcast.net [71.193.142.160]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTP id 60CC167BAD for ; Mon, 26 May 2008 09:47:12 +0000 (UTC) Date: Mon, 26 May 2008 02:47:10 -0700 From: Donnie Berkholz To: gentoo-dev@lists.gentoo.org Subject: [gentoo-dev] A unit-testing prototype Message-ID: <20080526094710.GB11722@comet> Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z" Content-Disposition: inline User-Agent: Mutt/1.5.17 (2007-11-01) X-Archives-Salt: 725faaa9-b795-4ae6-84f5-790c3d56a484 X-Archives-Hash: 2d7c88da058e7363f1079cfe1dd030fc --Nq2Wo0NMKNjxTN9z Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi everyone, A while back, vapier added some tests for the toolchain-funcs eclass to /usr/portage/eclass/tests/. I really like the idea, and I recently discovered an xUnit-style unit-testing framework for shell scripts called ShUnit2. I played with it a little and made a couple of prototypes. Take a look and see what you think. To get started: layman -f -o http://gechi-overlay.sf.net/layman.xml -a gechi emerge shunit2 sed -i -e "/^__SHUNIT_SHELL_FLAGS/s:u::g" /usr/share/shunit2/shunit2 Download the attached files to /usr/portage/eclass/tests, make 'em executable and run 'em. The output looks something like this: donnie@comet $ ./toolchain-funcs-shunit.sh # # Performing tests # test-tc-arch-kernel test-tc-arch # # Test report # tests passed: 71 100% tests failed: 0 0% tests skipped: 0 0% tests total: 71 100% donnie@comet $ ./x-modular-shunit.sh # # Performing tests # test-x-modular_specs_check test-x-modular_dri_check ASSERT:DRIVER='yes' IUSE='dri' USE='dri' BUILT_WITH='yes' test-x-modular_server_supports_drivers_check ASSERT:DRIVER='yes' HAS_VER='yes' BUILT_WITH='yes' # # Test report # tests passed: 28 93% tests failed: 2 7% tests skipped: 0 0% tests total: 30 100% What do you think? Thanks, Donnie --Nq2Wo0NMKNjxTN9z Content-Type: application/x-sh Content-Disposition: attachment; filename="toolchain-funcs-shunit.sh" Content-Transfer-Encoding: quoted-printable #!/bin/bash=0A=0AoneTimeSetUp() {=0A source /etc/init.d/functions.sh=0A=0A = inherit() {=0A local e=0A for e in "$@" ; do=0A source ../${e}.eclass= =0A done=0A }=0A inherit toolchain-funcs=0A}=0A=0Asuite() {=0A suite_addTe= st test-tc-arch-kernel=0A suite_addTest test-tc-arch=0A}=0A=0A#=0A# TEST: t= c-arch-kernel=0A#=0Atest-tc-arch-kernel() {=0A test-tc-arch-kernel-version(= ) {=0A KV=3D$1 ; shift=0A for CHOST in "$@" ; do=0A exp=3D${CHOST##*:}= =0A CHOST=3D${CHOST%%:*}=0A actual=3D$(tc-arch-kernel)=0A=0A assertEq= uals \=0A "Failure for CHOST: ${CHOST} Expected: ${exp} !=3D Actual: ${= actual}" \=0A "${actual}" "${exp:-${CHOST}}"=0A done=0A }=0A test-tc-ar= ch-kernel-version 2.6.0 \=0A alpha arm{,eb}:arm avr32 bfin:blackfin cris h= ppa:parisc \=0A i{3..6}86:i386 ia64 m68k mips{,eb}:mips nios2 powerpc:ppc = powerpc64:ppc64 \=0A s390{,x}:s390 sh{1..4}{,eb}:sh sparc{,64} vax x86_64= =0A test-tc-arch-kernel-version 2.6.30 \=0A i{3..6}86:x86 x86_64:x86 \=0A = powerpc{,64}:powerpc=0A}=0A=0A=0A#=0A# TEST: tc-arch=0A#=0Atest-tc-arch() = {=0A for CHOST in \=0A alpha arm{,eb}:arm avr32:avr bfin cris hppa i{3..6}= 86:x86 ia64 m68k \=0A mips{,eb}:mips nios2 powerpc:ppc powerpc64:ppc64 s39= 0{,x}:s390 \=0A sh{1..4}{,eb}:sh sparc{,64}:sparc vax x86_64:amd64=0A do= =0A exp=3D${CHOST##*:}=0A CHOST=3D${CHOST%%:*}=0A actual=3D$(tc-arch)=0A= =0A assertEquals \=0A "Failure for CHOST: ${CHOST} Expected: ${exp} != =3D Actual: ${actual}" \=0A "${actual}" "${exp:-${CHOST}}"=0A done=0A}=0A= =0A# To make this work, edit shunit2 and set __SHUNIT_SHELL_FLAGS=3D''. It = =0A# doesn't allow unset variables to be used in expansions by default, =0A= # which makes a lot of our code fail. Much of our stuff relies on these =0A= # tests to check whether variables are set to some value or set at all.=0A.= /usr/share/shunit2/shunit2=0A --Nq2Wo0NMKNjxTN9z Content-Type: application/x-sh Content-Disposition: attachment; filename="x-modular-shunit.sh" Content-Transfer-Encoding: quoted-printable #!/bin/bash=0A=0A## Fix 2 failures by sourcing tests-common farther down=0A= =0Asuite() {=0A suite_addTest test-x-modular_specs_check=0A suite_addTest t= est-x-modular_dri_check=0A suite_addTest test-x-modular_server_supports_dri= vers_check=0A}=0A=0AoneTimeSetUp() {=0A source tests-common.sh=0A=0A inheri= t x-modular=0A}=0A=0A#=0A# TEST: x-modular_specs_check=0A#=0Atest-x-modular= _specs_check() {=0A DRIVER=3Dyes PN=3D LDFLAGS=3D ; x-m= odular_specs_check; assertNotNull "LDFLAGS '${LDFLAGS}' don't contain '-Wl,= -z,lazy'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,lazy')"=0A DRIVER=3D PN=3Dx= org-server LDFLAGS=3D ; x-modular_specs_check; assertNotNull "LDFL= AGS '${LDFLAGS}' don't contain '-Wl,-z,lazy'" "$(echo ${LDFLAGS} | grep '\-= Wl,-z,lazy')"=0A DRIVER=3D PN=3D LDFLAGS=3D ; x-modu= lar_specs_check; assertNull "LDFLAGS '${LDFLAGS}' contain '-Wl,-z,lazy'" "$= (echo ${LDFLAGS} | grep '\-Wl,-z,lazy')"=0A DRIVER=3Dyes PN=3D L= DFLAGS=3D-Wl,-z,now; x-modular_specs_check; assertNull "LDFLAGS '${LDFLAGS}= ' contain '-Wl,-z,now'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,now')"=0A DRIVER= =3D PN=3Dxorg-server LDFLAGS=3D-Wl,-z,now; x-modular_specs_check; assert= Null "LDFLAGS '${LDFLAGS}' contain '-Wl,-z,now'" "$(echo ${LDFLAGS} | grep = '\-Wl,-z,now')"=0A DRIVER=3D PN=3D LDFLAGS=3D-Wl,-z,now; x-mo= dular_specs_check; assertNotNull "LDFLAGS '${LDFLAGS}' don't contain '-Wl,-= z,now'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,now')"=0A}=0A=0A#=0A# TEST: test= -x-modular_dri_check=0A#=0Atest-x-modular_dri_check() {=0A DRIVER=3D IUS= E=3D USE=3D BUILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIVER}' IUSE= =3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_che= ck=0A DRIVER=3D IUSE=3D USE=3D BUILT_WITH=3D ; assertTrue "DRIV= ER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH= }'" x-modular_dri_check=0A DRIVER=3D IUSE=3Ddri USE=3D BUILT_WITH=3Dy= es; assertTrue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT= _WITH=3D'${BUILT_WITH}'" x-modular_dri_check=0A DRIVER=3D IUSE=3Ddri USE= =3D BUILT_WITH=3D ; assertTrue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}'= USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_check=0A DRIVER= =3D IUSE=3D USE=3Ddri BUILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIV= ER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modula= r_dri_check=0A DRIVER=3D IUSE=3D USE=3Ddri BUILT_WITH=3D ; assertTr= ue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${B= UILT_WITH}'" x-modular_dri_check=0A DRIVER=3D IUSE=3Ddri USE=3Ddri BUILT= _WITH=3Dyes; assertTrue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${US= E}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_check=0A DRIVER=3D IUSE= =3Ddri USE=3Ddri BUILT_WITH=3D ; assertTrue "DRIVER=3D'${DRIVER}' IUSE= =3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_che= ck=0A DRIVER=3Dyes IUSE=3D USE=3D BUILT_WITH=3Dyes; assertTrue "DRIV= ER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH= }'" x-modular_dri_check=0A DRIVER=3Dyes IUSE=3D USE=3D BUILT_WITH=3D = ; assertTrue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT= _WITH=3D'${BUILT_WITH}'" x-modular_dri_check=0A DRIVER=3Dyes IUSE=3Ddri USE= =3D BUILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}'= USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_check=0A DRIVER= =3Dyes IUSE=3Ddri USE=3D BUILT_WITH=3D ; assertTrue "DRIVER=3D'${DRIV= ER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modula= r_dri_check=0A DRIVER=3Dyes IUSE=3D USE=3Ddri BUILT_WITH=3Dyes; assertTr= ue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${B= UILT_WITH}'" x-modular_dri_check=0A DRIVER=3Dyes IUSE=3D USE=3Ddri BUILT= _WITH=3D ; assertTrue "DRIVER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${US= E}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_check=0A DRIVER=3Dyes IUSE= =3Ddri USE=3Ddri BUILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIVER}' IUSE= =3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_dri_che= ck=0A DRIVER=3Dyes IUSE=3Ddri USE=3Ddri BUILT_WITH=3D ; assertFalse "DRIV= ER=3D'${DRIVER}' IUSE=3D'${IUSE}' USE=3D'${USE}' BUILT_WITH=3D'${BUILT_WITH= }'" x-modular_dri_check=0A}=0A=0A#=0A# TEST: x-modular_server_supports_driv= ers_check=0A#=0Atest-x-modular_server_supports_drivers_check() {=0A DRIVER= =3D HAS_VER=3D ; BUILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIVER}' H= AS_VER=3D'${HAS_VER}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_server_suppor= ts_drivers_check=0A DRIVER=3D HAS_VER=3D ; BUILT_WITH=3D ; assertTru= e "DRIVER=3D'${DRIVER}' HAS_VER=3D'${HAS_VER}' BUILT_WITH=3D'${BUILT_WITH}= '" x-modular_server_supports_drivers_check=0A DRIVER=3D HAS_VER=3Dyes; B= UILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIVER}' HAS_VER=3D'${HAS_VER}' B= UILT_WITH=3D'${BUILT_WITH}'" x-modular_server_supports_drivers_check=0A DRI= VER=3D HAS_VER=3Dyes; BUILT_WITH=3D ; assertTrue "DRIVER=3D'${DRIVER}= ' HAS_VER=3D'${HAS_VER}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_server_sup= ports_drivers_check=0A DRIVER=3Dyes HAS_VER=3D ; BUILT_WITH=3Dyes; assert= True "DRIVER=3D'${DRIVER}' HAS_VER=3D'${HAS_VER}' BUILT_WITH=3D'${BUILT_WI= TH}'" x-modular_server_supports_drivers_check=0A DRIVER=3Dyes HAS_VER=3D = ; BUILT_WITH=3D ; assertTrue "DRIVER=3D'${DRIVER}' HAS_VER=3D'${HAS_VER}= ' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_server_supports_drivers_check=0A = DRIVER=3Dyes HAS_VER=3Dyes; BUILT_WITH=3Dyes; assertTrue "DRIVER=3D'${DRIV= ER}' HAS_VER=3D'${HAS_VER}' BUILT_WITH=3D'${BUILT_WITH}'" x-modular_server_= supports_drivers_check=0A DRIVER=3Dyes HAS_VER=3Dyes; BUILT_WITH=3D ; ass= ertFalse "DRIVER=3D'${DRIVER}' HAS_VER=3D'${HAS_VER}' BUILT_WITH=3D'${BUILT= _WITH}'" x-modular_server_supports_drivers_check=0A} =0A=0A=0A# To make thi= s work, edit shunit2 and set __SHUNIT_SHELL_FLAGS=3D''. It =0A# doesn't all= ow unset variables to be used in expansions by default, =0A# which makes a = lot of our code fail. Much of our stuff relies on these =0A# tests to check= whether variables are set to some value or set at all.=0A. /usr/share/shun= it2/shunit2=0A --Nq2Wo0NMKNjxTN9z Content-Type: application/x-sh Content-Disposition: attachment; filename="tests-common.sh" Content-Transfer-Encoding: quoted-printable #!/bin/bash=0A=0Asource /etc/init.d/functions.sh=0A=0A# for has()/hasq() an= d others=0Asource /usr/lib/portage/bin/isolated-functions.sh=0A=0Ainherit()= {=0A local e=0A for e in "$@" ; do=0A source ../${e}.eclass=0A done=0A}= =0A=0AEXPORT_FUNCTIONS() {=0A :=0A}=0A=0Adie() {=0A return 1=0A}=0A=0A# two= scenarios, one that returns 0 and another that returns 1=0Abuilt_with_use(= ) {=0A if [[ -n ${BUILT_WITH} ]]; then=0A return 0=0A else=0A return 1=0A= fi=0A}=0A=0Ahas_version() {=0A if [[ -n ${HAS_VER} ]]; then=0A return 0= =0A else=0A return 1=0A fi=0A}=0A=0A# pulled from ebuild.sh, which is unso= urceable=0Ause() {=0A useq ${1}=0A}=0A=0Auseq() {=0A local u=3D$1=0A local = found=3D0=0A=0A # if we got something like '!flag', then invert the return = value=0A if [[ ${u:0:1} =3D=3D "!" ]] ; then=0A u=3D${u:1}=0A found=3D1= =0A fi=0A=0A if hasq ${u} ${USE} ; then=0A return ${found}=0A else=0A ret= urn $((!found))=0A fi=0A}=0A --Nq2Wo0NMKNjxTN9z-- -- gentoo-dev@lists.gentoo.org mailing list