diff --git a/Makefile.am b/Makefile.am index 70857e62a..fcd3405b5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = externals src scripts corepkgs doc +SUBDIRS = externals src scripts corepkgs doc tests EXTRA_DIST = substitute.mk nix.spec nix.spec.in include ./substitute.mk diff --git a/configure.ac b/configure.ac index 38057b1bb..cbca1aecb 100644 --- a/configure.ac +++ b/configure.ac @@ -151,5 +151,6 @@ AC_CONFIG_FILES([Makefile corepkgs/channels/Makefile doc/Makefile doc/manual/Makefile + tests/Makefile ]) AC_OUTPUT diff --git a/nix.spec.in b/nix.spec.in index 41765aa6c..0fe3fb64a 100644 --- a/nix.spec.in +++ b/nix.spec.in @@ -21,6 +21,7 @@ Nix is a software deployment system. %build ./configure --prefix=%{_prefix} make +make check %install rm -rf $RPM_BUILD_ROOT diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 42f17cf4e..fce427106 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -46,27 +46,34 @@ void checkStoreNotSymlink(Path path) } +static string getEnv(const string & key, const string & def = "") +{ + char * value = getenv(key.c_str()); + return value ? string(value) : def; +} + + /* Initialize and reorder arguments, then call the actual argument processor. */ static void initAndRun(int argc, char * * argv) { - char * root = getenv("NIX_ROOT"); - - if (root) { - if (chroot(root) != 0) + string root = getEnv("NIX_ROOT"); + if (root != "") { + if (chroot(root.c_str()) != 0) throw SysError(format("changing root to `%1%'") % root); } /* Setup Nix paths. */ - nixStore = canonPath(NIX_STORE_DIR); - nixDataDir = canonPath(NIX_DATA_DIR); - nixLogDir = canonPath(NIX_LOG_DIR); - nixStateDir = canonPath(NIX_STATE_DIR); - nixDBPath = canonPath(NIX_STATE_DIR) + "/db"; + nixStore = getEnv("NIX_STORE_DIR", canonPath(NIX_STORE_DIR)); + nixDataDir = getEnv("NIX_DATA_DIR", canonPath(NIX_DATA_DIR)); + nixLogDir = getEnv("NIX_LOG_DIR", canonPath(NIX_LOG_DIR)); + nixStateDir = getEnv("NIX_STATE_DIR", canonPath(NIX_STATE_DIR)); + nixDBPath = getEnv("NIX_DB_DIR", nixStateDir + "/db"); /* Check that the store directory and its parent are not symlinks. */ - checkStoreNotSymlink(nixStore); + if (getEnv("NIX_IGNORE_SYMLINK_STORE") != "1") + checkStoreNotSymlink(nixStore); /* Catch SIGINT. */ struct sigaction act, oact; @@ -77,8 +84,8 @@ static void initAndRun(int argc, char * * argv) throw SysError("installing handler for SIGINT"); /* Process the NIX_LOG_TYPE environment variable. */ - char * lt = getenv("NIX_LOG_TYPE"); - if (lt) setLogType(lt); + string lt = getEnv("NIX_LOG_TYPE"); + if (lt != "") setLogType(lt); /* Put the arguments in a vector. */ Strings args, remaining; diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 000000000..dc8c15e67 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,19 @@ +TEST_ROOT = $(shell pwd)/test-tmp + +TESTS_ENVIRONMENT = TEST_ROOT=$(TEST_ROOT) \ + NIX_STORE_DIR=$(TEST_ROOT)/store \ + NIX_DATA_DIR=$(TEST_ROOT)/data \ + NIX_LOG_DIR=$(TEST_ROOT)/log \ + NIX_STATE_DIR=$(TEST_ROOT)/state \ + NIX_DB_DIR=$(TEST_ROOT)/db \ + TOP=$(shell pwd)/.. \ + $(SHELL) -e -x + +simple.sh: simple.nix + +TESTS = init.sh simple.sh + +include ../substitute.mk + +EXTRA_DIST = \ + simple.nix.in simple.builder.sh diff --git a/tests/init.sh b/tests/init.sh new file mode 100644 index 000000000..87ab59f96 --- /dev/null +++ b/tests/init.sh @@ -0,0 +1,18 @@ +test -n "$TEST_ROOT" +if test -d "$TEST_ROOT"; then + chmod -R u+w "$TEST_ROOT" + rm -rf "$TEST_ROOT" +fi +mkdir "$TEST_ROOT" + +mkdir "$NIX_STORE_DIR" +mkdir "$NIX_DATA_DIR" +mkdir "$NIX_LOG_DIR" +mkdir "$NIX_STATE_DIR" +mkdir "$NIX_DB_DIR" + +# Initialise the database. +$TOP/src/nix-store/nix-store --init + +# Did anything happen? +test -e "$NIX_DB_DIR"/validpaths diff --git a/tests/simple.builder.sh b/tests/simple.builder.sh new file mode 100644 index 000000000..dcd9bdb64 --- /dev/null +++ b/tests/simple.builder.sh @@ -0,0 +1,11 @@ +echo "PATH=$PATH" + +# Verify that the PATH is empty. +if mkdir foo; then exit 1; fi + +# Set a PATH (!!! impure). +export PATH=/bin:/usr/bin:$PATH + +mkdir $out + +echo "Hello World!" > $out/hello \ No newline at end of file diff --git a/tests/simple.nix.in b/tests/simple.nix.in new file mode 100644 index 000000000..c2e944c7b --- /dev/null +++ b/tests/simple.nix.in @@ -0,0 +1,6 @@ +derivation { + name = "simple"; + system = "@system@"; + builder = "@shell@"; + args = ["-e" "-x" ./simple.builder.sh]; +} \ No newline at end of file diff --git a/tests/simple.sh b/tests/simple.sh new file mode 100644 index 000000000..68da000d1 --- /dev/null +++ b/tests/simple.sh @@ -0,0 +1,10 @@ +storeExpr=$($TOP/src/nix-instantiate/nix-instantiate simple.nix) + +echo "store expr is $storeExpr" + +outPath=$($TOP/src/nix-store/nix-store -qnfvvvvv "$storeExpr") + +echo "output path is $outPath" + +text=$(cat "$outPath"/hello) +if test "$text" != "Hello World!"; then exit 1; fi