Signed-off-by: Allan McRae <[email protected]>
---

I am getting annoyed at constantly missing bugs in makepkg patches!  So,
this is a really, really, really crappy attempt at getting a test suite up
and going for makepkg.  Essentially, stick a PKGBUILD in test/makepkg/tests
and run test/makepkg/mptest.

The test suite is controlled by an 'optional' mptest() function in the PKGBUILD.
In that function you can define the following variables:

files (array): 
  A list of file necessary for the test to run.  First entry is always the
  PKGBUILD.  The syntax 'test001::PKGBUILD' can be used, tell the test suite
  to copy file 'test001' to 'PKGBUILD'.

flags (string):
  Flags to pass to makepkg
  
tests (array):
  Lists of tests to run

files and tests have defaults (file to just copying the test file to 'PKGBUILD'
and tests to running 'pkg_exists')

The only tests available so far are:
  pkg_exists - checks all packages exist and have a .PKGINFO file
  pkg_has_file - checks a package has a file (not tested...)

Needed tests:
  pkginfo - checks pkginfo file is correct

Of course this needs a lot more structure and tests, but comments on the
direction this is heading would be appreciated.   All work on this is on
my mptest branch.


 test/makepkg/mptest        |  140 ++++++++++++++++++++++++++++++++++++++++++++
 test/makepkg/tests/test001 |    7 ++
 2 files changed, 147 insertions(+), 0 deletions(-)
 create mode 100755 test/makepkg/mptest
 create mode 100644 test/makepkg/tests/test001

diff --git a/test/makepkg/mptest b/test/makepkg/mptest
new file mode 100755
index 0000000..01e4b4a
--- /dev/null
+++ b/test/makepkg/mptest
@@ -0,0 +1,140 @@
+#!/bin/bash
+
+splitpkg_overrides=('pkgver' 'pkgrel' 'pkgdesc' 'arch' 'license' 'groups' \
+                    'depends' 'optdepends' 'provides' 'conflicts' 'replaces' \
+                    'backup' 'options' 'install' 'changelog')
+readonly -a splitpkg_overrides
+
+backup_package_variables() {
+       for var in ${splitpkg_overrid...@]}; do
+               indirect="${var}_backup"
+               eval "${indirect}=(\"\${$v...@]}\")"
+       done
+}
+
+restore_package_variables() {
+       for var in ${splitpkg_overrid...@]}; do
+               indirect="${var}_backup"
+               if [[ -n ${!indirect} ]]; then
+                       eval "${var}=(\"\${$indire...@]}\")"
+               else
+                       unset ${var}
+               fi
+       done
+}
+
+##
+# Performs necessary PKGBUILD variable overrides for a given split-package
+#
+# Usage: pasre_splitpkg_overrides <pkgname>
+##
+parse_splitpkg_overrides() {
+       if grep -q "package_$1()" ${files[0]#*::}; then
+               backup_package_variables
+               pkgfunc=$(sed -n "/^package_$1\(\)/,/^}/p" ${files[0]#*::})
+               for var in ${splitpkg_overrid...@]}; do
+                       eval $(echo $pkgfunc | grep -Eo 
"$var=(\"[^)]*\"|\([^)]*\)|[^ ]*)")
+               done
+       fi
+}
+
+##
+# Prepares for testing (including the running of makepkg)
+##
+prepare_test() {
+  # set default values
+  files=("$test::PKGBUILD")
+  flags=""
+  tests=('pkg_exists')
+
+  # override defaults
+  if [[ $(type -t mptest) = "function" ]]; then
+    mptest
+  fi
+  
+  for file in ${fil...@]}; do
+    cp ${file%%::*} ${testdir}/${file#*::}
+  done
+  
+  cd $testdir
+  ../../../../scripts/makepkg --config ../../../../etc/makepkg.conf $flags &> 
/dev/null
+  cd ..
+}
+
+##
+# Runs the requested tests
+##
+run_test() {
+  FAIL=0
+
+  cd $testdir
+  for i in ${tes...@]}; do
+    eval $i || FAIL=1
+  done
+  cd ..
+  
+  return $FAIL
+}
+
+##
+# Checks if all package are created including PKGINFO presence
+##
+pkg_exists() {
+       for pkg in ${pkgna...@]}; do
+               parse_splitpkg_overrides $pkg
+               if [[ $arch != "any" ]]; then
+                       arch=$CARCH
+               fi
+               if [[ ! -e $pkg-$pkgver-$pkgrel-$arch$PKGEXT ]] ;then
+                       return 1
+               fi
+               if ! bsdtar -tf $pkg-$pkgver-$pkgrel-$arch$PKGEXT -q .PKGINFO 
&> /dev/null; then
+                       return 1
+               fi
+               restore_package_variables               
+       done
+       
+       return 0
+}
+
+##
+# Checks for a file in a package
+#
+# Usage: pkg_has_file <pkgname> <file>
+##
+pkg_has_file() {
+       parse_splitpkg_overrides $1
+
+       if ! bsdtar -tf $pkg-$pkgver-$pkgrel-$arch$PKGEXT $2 &> /dev/null; then
+               return 1
+       fi
+       restore_package_variables
+
+       return 0        
+}
+
+
+##
+# RUN THE TESTS!
+##
+cd tests
+
+for test in test*; do
+  source ../../../etc/makepkg.conf
+  source $test
+  
+  testdir=$(mktemp -d $test.XXXXXXXX)
+  if ! prepare_test; then
+    echo "FAIL: $test"
+  else
+    if ! run_test; then
+      echo "FAIL: $test"
+    else
+      echo "PASS: $test"
+    fi
+  fi
+  
+  # cleanup 
+  unset mptest files flags tests
+  rm -rf $testdir
+done
\ No newline at end of file
diff --git a/test/makepkg/tests/test001 b/test/makepkg/tests/test001
new file mode 100644
index 0000000..dfe6ec6
--- /dev/null
+++ b/test/makepkg/tests/test001
@@ -0,0 +1,7 @@
+# test001: Minimal working PKGBUILD
+
+pkgname=NAME
+pkgver=1
+pkgrel=1
+arch=('any')
+
-- 
1.7.1



Reply via email to