about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac1
-rw-r--r--nix.spec.in1
-rw-r--r--src/libmain/shared.cc31
-rw-r--r--tests/Makefile.am19
-rw-r--r--tests/init.sh18
-rw-r--r--tests/simple.builder.sh11
-rw-r--r--tests/simple.nix.in6
-rw-r--r--tests/simple.sh10
9 files changed, 86 insertions, 13 deletions
diff --git a/Makefile.am b/Makefile.am
index 70857e62adc2..fcd3405b55dd 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 38057b1bbe91..cbca1aecb411 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 41765aa6c424..0fe3fb64a85b 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 42f17cf4edea..fce42710610e 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 000000000000..dc8c15e67134
--- /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 000000000000..87ab59f964bf
--- /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 000000000000..dcd9bdb64ad0
--- /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 000000000000..c2e944c7bb85
--- /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 000000000000..68da000d19f4
--- /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