[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gentoo-dev
Subject:    [gentoo-dev] A unit-testing prototype
From:       Donnie Berkholz <dberkholz () gentoo ! org>
Date:       2008-05-26 9:47:10
Message-ID: 20080526094710.GB11722 () comet
[Download RAW message or body]

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

["toolchain-funcs-shunit.sh" (application/x-sh)]

#!/bin/bash

oneTimeSetUp() {
	source /etc/init.d/functions.sh

	inherit() {
		local e
		for e in "$@" ; do
			source ../${e}.eclass
		done
	}
	inherit toolchain-funcs
}

suite() {
	suite_addTest test-tc-arch-kernel
	suite_addTest test-tc-arch
}

#
# TEST: tc-arch-kernel
#
test-tc-arch-kernel() {
	test-tc-arch-kernel-version() {
		KV=$1 ; shift
		for CHOST in "$@" ; do
			exp=${CHOST##*:}
			CHOST=${CHOST%%:*}
			actual=$(tc-arch-kernel)

			assertEquals \
				 "Failure for CHOST: ${CHOST} Expected: ${exp} != Actual: ${actual}" \
				"${actual}" "${exp:-${CHOST}}"
		done
	}
	test-tc-arch-kernel-version 2.6.0 \
		alpha arm{,eb}:arm avr32 bfin:blackfin cris hppa:parisc \
		i{3..6}86:i386 ia64 m68k mips{,eb}:mips nios2 powerpc:ppc powerpc64:ppc64 \
		s390{,x}:s390 sh{1..4}{,eb}:sh sparc{,64} vax x86_64
	test-tc-arch-kernel-version 2.6.30 \
		i{3..6}86:x86 x86_64:x86 \
		powerpc{,64}:powerpc
}


#
# TEST: tc-arch
#
test-tc-arch() {
	for CHOST in \
		alpha arm{,eb}:arm avr32:avr bfin cris hppa i{3..6}86:x86 ia64 m68k \
		mips{,eb}:mips nios2 powerpc:ppc powerpc64:ppc64 s390{,x}:s390 \
		sh{1..4}{,eb}:sh sparc{,64}:sparc vax x86_64:amd64
	do
		exp=${CHOST##*:}
		CHOST=${CHOST%%:*}
		actual=$(tc-arch)

		assertEquals \
			 "Failure for CHOST: ${CHOST} Expected: ${exp} != Actual: ${actual}" \
			"${actual}" "${exp:-${CHOST}}"
	done
}

# To make this work, edit shunit2 and set __SHUNIT_SHELL_FLAGS=''. It 
# doesn't allow unset variables to be used in expansions by default, 
# which makes a lot of our code fail. Much of our stuff relies on these 
# tests to check whether variables are set to some value or set at all.
. /usr/share/shunit2/shunit2

["x-modular-shunit.sh" (application/x-sh)]

#!/bin/bash

## Fix 2 failures by sourcing tests-common farther down

suite() {
	suite_addTest test-x-modular_specs_check
	suite_addTest test-x-modular_dri_check
	suite_addTest test-x-modular_server_supports_drivers_check
}

oneTimeSetUp() {
	source tests-common.sh

	inherit x-modular
}

#
# TEST: x-modular_specs_check
#
test-x-modular_specs_check() {
	DRIVER=yes PN=            LDFLAGS=          ; x-modular_specs_check; assertNotNull \
"LDFLAGS '${LDFLAGS}' don't contain '-Wl,-z,lazy'" "$(echo ${LDFLAGS} | grep \
'\-Wl,-z,lazy')"  DRIVER=    PN=xorg-server LDFLAGS=          ; \
x-modular_specs_check; assertNotNull "LDFLAGS '${LDFLAGS}' don't contain \
'-Wl,-z,lazy'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,lazy')"  DRIVER=    PN=            \
LDFLAGS=          ; x-modular_specs_check; assertNull "LDFLAGS '${LDFLAGS}' contain \
'-Wl,-z,lazy'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,lazy')"  DRIVER=yes PN=            \
LDFLAGS=-Wl,-z,now; x-modular_specs_check; assertNull "LDFLAGS '${LDFLAGS}' contain \
'-Wl,-z,now'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,now')"  DRIVER=    PN=xorg-server \
LDFLAGS=-Wl,-z,now; x-modular_specs_check; assertNull "LDFLAGS '${LDFLAGS}' contain \
'-Wl,-z,now'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,now')"  DRIVER=    PN=            \
LDFLAGS=-Wl,-z,now; x-modular_specs_check; assertNotNull "LDFLAGS '${LDFLAGS}' don't \
contain '-Wl,-z,now'" "$(echo ${LDFLAGS} | grep '\-Wl,-z,now')" }

#
# TEST: test-x-modular_dri_check
#
test-x-modular_dri_check() {
	DRIVER=    IUSE=    USE=    BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' \
IUSE='${IUSE}' USE='${USE}' BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=  \
IUSE=    USE=    BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' \
USE='${USE}' BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=    IUSE=dri \
USE=    BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=    IUSE=dri USE=    \
BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=    IUSE=    USE=dri \
BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=    IUSE=    USE=dri \
BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=    IUSE=dri USE=dri \
BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=    IUSE=dri USE=dri \
BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=    USE=    \
BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=    USE=    \
BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=dri USE=    \
BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=dri USE=    \
BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=    USE=dri \
BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=    USE=dri \
BUILT_WITH=   ; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=dri USE=dri \
BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check  DRIVER=yes IUSE=dri USE=dri \
BUILT_WITH=   ; assertFalse "DRIVER='${DRIVER}' IUSE='${IUSE}' USE='${USE}' \
BUILT_WITH='${BUILT_WITH}'" x-modular_dri_check }

#
# TEST: x-modular_server_supports_drivers_check
#
test-x-modular_server_supports_drivers_check() {
	DRIVER=    HAS_VER=   ; BUILT_WITH=yes; assertTrue  "DRIVER='${DRIVER}' \
HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=    HAS_VER=   ; BUILT_WITH=   ; \
assertTrue  "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=    HAS_VER=yes; BUILT_WITH=yes; \
assertTrue  "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=    HAS_VER=yes; BUILT_WITH=   ; \
assertTrue  "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=yes HAS_VER=   ; BUILT_WITH=yes; \
assertTrue  "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=yes HAS_VER=   ; BUILT_WITH=   ; \
assertTrue  "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=yes HAS_VER=yes; BUILT_WITH=yes; \
assertTrue  "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check  DRIVER=yes HAS_VER=yes; BUILT_WITH=   ; \
assertFalse "DRIVER='${DRIVER}' HAS_VER='${HAS_VER}' BUILT_WITH='${BUILT_WITH}'" \
x-modular_server_supports_drivers_check } 


# To make this work, edit shunit2 and set __SHUNIT_SHELL_FLAGS=''. It 
# doesn't allow unset variables to be used in expansions by default, 
# which makes a lot of our code fail. Much of our stuff relies on these 
# tests to check whether variables are set to some value or set at all.
. /usr/share/shunit2/shunit2


["tests-common.sh" (application/x-sh)]

#!/bin/bash

source /etc/init.d/functions.sh

# for has()/hasq() and others
source /usr/lib/portage/bin/isolated-functions.sh

inherit() {
	local e
	for e in "$@" ; do
		source ../${e}.eclass
	done
}

EXPORT_FUNCTIONS() {
	:
}

die() {
	return 1
}

# two scenarios, one that returns 0 and another that returns 1
built_with_use() {
	if [[ -n ${BUILT_WITH} ]]; then
		return 0
	else
		return 1
	fi
}

has_version() {
	if [[ -n ${HAS_VER} ]]; then
		return 0
	else
		return 1
	fi
}

# pulled from ebuild.sh, which is unsourceable
use() {
	useq ${1}
}

useq() {
	local u=$1
	local found=0

	# if we got something like '!flag', then invert the return value
	if [[ ${u:0:1} == "!" ]] ; then
		u=${u:1}
		found=1
	fi

	if hasq ${u} ${USE} ; then
		return ${found}
	else
		return $((!found))
	fi
}

-- 
gentoo-dev@lists.gentoo.org mailing list


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic