diff --git a/substitute.mk b/substitute.mk index 848029a024..7d3f6d863c 100644 --- a/substitute.mk +++ b/substitute.mk @@ -1,5 +1,6 @@ %: %.in Makefile sed \ + -e "s^@extra1\@^$(extra1)^g" \ -e "s^@prefix\@^$(prefix)^g" \ -e "s^@bindir\@^$(bindir)^g" \ -e "s^@sysconfdir\@^$(sysconfdir)^g" \ diff --git a/tests/Makefile.am b/tests/Makefile.am index ba45a3ad8f..d540290b49 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,5 +1,7 @@ TEST_ROOT = $(shell pwd)/test-tmp +extra1 = $(TEST_ROOT)/shared + TESTS_ENVIRONMENT = TEST_ROOT=$(TEST_ROOT) \ NIX_STORE_DIR=$(TEST_ROOT)/store \ NIX_DATA_DIR=$(TEST_ROOT)/data \ @@ -7,19 +9,23 @@ TESTS_ENVIRONMENT = TEST_ROOT=$(TEST_ROOT) \ NIX_STATE_DIR=$(TEST_ROOT)/state \ NIX_DB_DIR=$(TEST_ROOT)/db \ TOP=$(shell pwd)/.. \ + SHARED=$(extra1) \ $(SHELL) -e -x simple.sh: simple.nix dependencies.sh: dependencies.nix locking.sh: locking.nix +parallel.sh: parallel.nix -TESTS = init.sh simple.sh dependencies.sh locking.sh +TESTS = init.sh simple.sh dependencies.sh parallel.sh +#locking.sh parallel.sh -XFAIL_TESTS = +XFAIL_TESTS = parallel.sh include ../substitute.mk EXTRA_DIST = $(TESTS) \ simple.nix.in simple.builder.sh \ dependencies.nix.in dependencies.builder*.sh \ - locking.nix.in locking.builder.sh \ No newline at end of file + locking.nix.in locking.builder.sh \ + parallel.nix.in parallel.builder.sh diff --git a/tests/parallel.builder.sh b/tests/parallel.builder.sh new file mode 100644 index 0000000000..d6d0bedf45 --- /dev/null +++ b/tests/parallel.builder.sh @@ -0,0 +1,32 @@ +echo "DOING $text" + + +export PATH=/bin:/usr/bin:$PATH + + +# increase counter +while ! ln -s x $shared.lock; do + sleep 1 +done +test -f $shared.cur || echo 0 > $shared.cur +test -f $shared.max || echo 0 > $shared.max +new=$(($(cat $shared.cur) + 1)) +if test $new -gt $(cat $shared.max); then + echo $new > $shared.max +fi +echo $new > $shared.cur +rm $shared.lock + + +echo -n $(cat $inputs)$text > $out + +sleep 3 + + +# decrease counter +while ! ln -s x $shared.lock; do + sleep 1 +done +test -f $shared.cur || echo 0 > $shared.cur +echo $(($(cat $shared.cur) - 1)) > $shared.cur +rm $shared.lock diff --git a/tests/parallel.nix.in b/tests/parallel.nix.in new file mode 100644 index 0000000000..41d6776d1b --- /dev/null +++ b/tests/parallel.nix.in @@ -0,0 +1,19 @@ +let { + + mkDrv = text: inputs: derivation { + name = "parallel"; + system = "@system@"; + builder = "@shell@"; + args = ["-e" "-x" ./parallel.builder.sh]; + shared = "@extra1@"; + inherit text inputs; + }; + + a = mkDrv "a" []; + b = mkDrv "b" [a]; + c = mkDrv "c" [b]; + d = mkDrv "d" [c]; + e = mkDrv "e" [b c d]; + + body = e; +} \ No newline at end of file diff --git a/tests/parallel.sh b/tests/parallel.sh new file mode 100644 index 0000000000..7040f7ad91 --- /dev/null +++ b/tests/parallel.sh @@ -0,0 +1,20 @@ +storeExpr=$($TOP/src/nix-instantiate/nix-instantiate parallel.nix) + +echo "store expr is $storeExpr" + +for i in $(seq 1 5); do + echo "WORKER $i" + $TOP/src/nix-store/nix-store -rvvB "$storeExpr" & +done + +sleep 5 + +outPath=$($TOP/src/nix-store/nix-store -qnfvvvvv "$storeExpr") + +echo "output path is $outPath" + +text=$(cat "$outPath") +if test "$text" != "aabcade"; then exit 1; fi + +if test "$(cat $SHARED.cur)" != 0; then exit 1; fi +if test "$(cat $SHARED.max)" != 3; then exit 1; fi