From e83f2e46a76badbbe27ed74b297e5bc7bf26f285 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sat, 2 Aug 2008 16:22:04 +0200
Subject: [PATCH] Testsuite: added circular include tests.

---
 .../plugins/include/ext-include-common.c      | 19 +++++-------
 src/testsuite/testsuite-common.c              | 15 ++++++++++
 src/testsuite/testsuite.c                     |  9 +++---
 tests/extensions/include/errors.svtest        | 30 +++++++++++++++++++
 .../include/errors/circular-1.sieve           |  5 ++++
 .../include/errors/circular-2.sieve           |  5 ++++
 .../include/errors/circular-3.sieve           |  5 ++++
 .../errors/included/circular-one.sieve        |  5 ++++
 .../errors/included/circular-three-2.sieve    |  3 ++
 .../errors/included/circular-three-3.sieve    |  3 ++
 .../errors/included/circular-three.sieve      |  7 +++++
 .../errors/included/circular-two-2.sieve      |  3 ++
 .../errors/included/circular-two.sieve        |  7 +++++
 .../{ => included}/variables-included1.sieve  |  0
 .../{ => included}/variables-included2.sieve  |  0
 .../{ => included}/variables-included3.sieve  |  0
 16 files changed, 101 insertions(+), 15 deletions(-)
 create mode 100644 tests/extensions/include/errors/circular-1.sieve
 create mode 100644 tests/extensions/include/errors/circular-2.sieve
 create mode 100644 tests/extensions/include/errors/circular-3.sieve
 create mode 100644 tests/extensions/include/errors/included/circular-one.sieve
 create mode 100644 tests/extensions/include/errors/included/circular-three-2.sieve
 create mode 100644 tests/extensions/include/errors/included/circular-three-3.sieve
 create mode 100644 tests/extensions/include/errors/included/circular-three.sieve
 create mode 100644 tests/extensions/include/errors/included/circular-two-2.sieve
 create mode 100644 tests/extensions/include/errors/included/circular-two.sieve
 rename tests/extensions/include/{ => included}/variables-included1.sieve (100%)
 rename tests/extensions/include/{ => included}/variables-included2.sieve (100%)
 rename tests/extensions/include/{ => included}/variables-included3.sieve (100%)

diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index bb02e59c4..cee2790ea 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -60,25 +60,22 @@ const char *ext_include_get_script_directory
 
         if (sieve_dir == NULL)
             sieve_dir = getenv("HOME");
-        if (sieve_dir == NULL) {
-            sieve_sys_error("include: sieve_dir and home not set "
-                   "(wanted script %s)", str_sanitize(script_name, 80));
-            return NULL;
-        }
 		break;
    	case EXT_INCLUDE_LOCATION_GLOBAL:
 		sieve_dir = getenv("SIEVE_GLOBAL_DIR");
-
-        if (sieve_dir == NULL) {
-            sieve_sys_warning("include: sieve_global_dir not set "
-                   "(wanted script %s)", str_sanitize(script_name, 80));
-            return NULL;
-        }
 		break;
 	default:
 		return NULL;
 	}
 
+	if (sieve_dir == NULL) {
+		sieve_sys_error("include: sieve_dir and home not set "	
+			"(wanted script %s)", str_sanitize(script_name, 80));
+		return NULL;
+	}
+
+	printf("SIEVE DIR: %s\n", sieve_dir);
+
 	return sieve_dir;
 }
 
diff --git a/src/testsuite/testsuite-common.c b/src/testsuite/testsuite-common.c
index 39a5f65ef..297ebf6e5 100644
--- a/src/testsuite/testsuite-common.c
+++ b/src/testsuite/testsuite-common.c
@@ -4,6 +4,7 @@
 #include "ostream.h"
 #include "hash.h"
 #include "mail-storage.h"
+#include "env-util.h"
 
 #include "mail-raw.h"
 #include "namespaces.h"
@@ -301,6 +302,8 @@ static void _testsuite_script_verror
 
 	msg.location = p_strdup(pool, location);
 	msg.message = p_strdup_vprintf(pool, fmt, args);
+
+//	printf("error: %s: %s.\n", location, t_strdup_vprintf(fmt, args));
 	
 	array_append(&_testsuite_script_errors, &msg, 1);	
 }
@@ -370,9 +373,21 @@ static void testsuite_script_init(void)
 bool testsuite_script_compile(const char *script_path)
 {
 	struct sieve_binary *sbin;
+	const char *sieve_dir;
 
 	testsuite_script_clear_messages();
 
+	    /* Initialize environment */
+    sieve_dir = strrchr(script_path, '/');
+    if ( sieve_dir == NULL )
+        sieve_dir= "./";
+    else
+        sieve_dir = t_strdup_until(script_path, sieve_dir+1);
+
+    /* Currently needed for include (FIXME) */
+    env_put(t_strconcat("SIEVE_DIR=", sieve_dir, "included", NULL));
+    env_put(t_strconcat("SIEVE_GLOBAL_DIR=", sieve_dir, "included-global", NULL));
+
     if ( (sbin = sieve_compile(script_path, test_script_ehandler)) == NULL )
         return FALSE;
 
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 99f9fd9a6..e21786f1e 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -61,7 +61,6 @@ static void testsuite_bin_init(void)
 	
 	testsuite_init();
 }
-
 static void testsuite_bin_deinit(void)
 {
 	testsuite_deinit();
@@ -216,11 +215,13 @@ int main(int argc, char **argv)
 	/* Initialize environment */
 	sieve_dir = strrchr(scriptfile, '/');
     if ( sieve_dir == NULL )
-        sieve_dir="./";
+        sieve_dir= "./";
 	else
-		sieve_dir = t_strdup_until(scriptfile, sieve_dir);
+		sieve_dir = t_strdup_until(scriptfile, sieve_dir+1);
 
-	env_put(t_strconcat("SIEVE_DIR=", sieve_dir, NULL));
+	/* Currently needed for include (FIXME) */
+	env_put(t_strconcat("SIEVE_DIR=", sieve_dir, "included", NULL));
+	env_put(t_strconcat("SIEVE_GLOBAL_DIR=", sieve_dir, "included-global", NULL));
 	
 	/* Compile sieve script */
 	sbin = _compile_sieve_script(scriptfile);
diff --git a/tests/extensions/include/errors.svtest b/tests/extensions/include/errors.svtest
index c58a5f49b..dc0c9814b 100644
--- a/tests/extensions/include/errors.svtest
+++ b/tests/extensions/include/errors.svtest
@@ -17,6 +17,36 @@ test "Generic" {
 	}
 }
 
+test "Circular - direct" {
+	if test_compile "errors/circular-1.sieve" {
+		test_fail "compile should have failed";
+	}
+
+	if not test_error :count "eq" :comparator "i;ascii-numeric" "3" {
+		test_fail "wrong number of errors reported";
+	}
+}
+
+test "Circular - one intermittent" {
+	if test_compile "errors/circular-2.sieve" {
+		test_fail "compile should have failed";
+	}
+
+	if not test_error :count "eq" :comparator "i;ascii-numeric" "4" {
+		test_fail "wrong number of errors reported";
+	}
+}
+
+test "Circular - two intermittent" {
+	if test_compile "errors/circular-3.sieve" {
+		test_fail "compile should have failed";
+	}
+
+	if not test_error :count "eq" :comparator "i;ascii-numeric" "5" {
+		test_fail "wrong number of errors reported";
+	}
+}
+
 /*
  * Using import/export without variables required
  */
diff --git a/tests/extensions/include/errors/circular-1.sieve b/tests/extensions/include/errors/circular-1.sieve
new file mode 100644
index 000000000..9526ff747
--- /dev/null
+++ b/tests/extensions/include/errors/circular-1.sieve
@@ -0,0 +1,5 @@
+require "include";
+
+discard;
+
+include "circular-one.sieve";
diff --git a/tests/extensions/include/errors/circular-2.sieve b/tests/extensions/include/errors/circular-2.sieve
new file mode 100644
index 000000000..59fca94c1
--- /dev/null
+++ b/tests/extensions/include/errors/circular-2.sieve
@@ -0,0 +1,5 @@
+require "include";
+
+discard;
+
+include "circular-two.sieve";
diff --git a/tests/extensions/include/errors/circular-3.sieve b/tests/extensions/include/errors/circular-3.sieve
new file mode 100644
index 000000000..1ad95b6b6
--- /dev/null
+++ b/tests/extensions/include/errors/circular-3.sieve
@@ -0,0 +1,5 @@
+require "include";
+
+discard;
+
+include "circular-three";
diff --git a/tests/extensions/include/errors/included/circular-one.sieve b/tests/extensions/include/errors/included/circular-one.sieve
new file mode 100644
index 000000000..91978fede
--- /dev/null
+++ b/tests/extensions/include/errors/included/circular-one.sieve
@@ -0,0 +1,5 @@
+require "include";
+
+keep;
+
+include "circular-one.sieve";
diff --git a/tests/extensions/include/errors/included/circular-three-2.sieve b/tests/extensions/include/errors/included/circular-three-2.sieve
new file mode 100644
index 000000000..323751053
--- /dev/null
+++ b/tests/extensions/include/errors/included/circular-three-2.sieve
@@ -0,0 +1,3 @@
+require "include";
+
+include "circular-three-3.sieve";
diff --git a/tests/extensions/include/errors/included/circular-three-3.sieve b/tests/extensions/include/errors/included/circular-three-3.sieve
new file mode 100644
index 000000000..4c062cdb3
--- /dev/null
+++ b/tests/extensions/include/errors/included/circular-three-3.sieve
@@ -0,0 +1,3 @@
+require "include";
+
+include "circular-three.sieve";
diff --git a/tests/extensions/include/errors/included/circular-three.sieve b/tests/extensions/include/errors/included/circular-three.sieve
new file mode 100644
index 000000000..14c3c7f7b
--- /dev/null
+++ b/tests/extensions/include/errors/included/circular-three.sieve
@@ -0,0 +1,7 @@
+require "include";
+
+keep;
+
+include "circular-three-2.sieve";
+
+
diff --git a/tests/extensions/include/errors/included/circular-two-2.sieve b/tests/extensions/include/errors/included/circular-two-2.sieve
new file mode 100644
index 000000000..d529214d4
--- /dev/null
+++ b/tests/extensions/include/errors/included/circular-two-2.sieve
@@ -0,0 +1,3 @@
+require "include";
+
+include "circular-two.sieve";
diff --git a/tests/extensions/include/errors/included/circular-two.sieve b/tests/extensions/include/errors/included/circular-two.sieve
new file mode 100644
index 000000000..340ff9e08
--- /dev/null
+++ b/tests/extensions/include/errors/included/circular-two.sieve
@@ -0,0 +1,7 @@
+require "include";
+
+keep;
+
+include "circular-two-2.sieve";
+
+
diff --git a/tests/extensions/include/variables-included1.sieve b/tests/extensions/include/included/variables-included1.sieve
similarity index 100%
rename from tests/extensions/include/variables-included1.sieve
rename to tests/extensions/include/included/variables-included1.sieve
diff --git a/tests/extensions/include/variables-included2.sieve b/tests/extensions/include/included/variables-included2.sieve
similarity index 100%
rename from tests/extensions/include/variables-included2.sieve
rename to tests/extensions/include/included/variables-included2.sieve
diff --git a/tests/extensions/include/variables-included3.sieve b/tests/extensions/include/included/variables-included3.sieve
similarity index 100%
rename from tests/extensions/include/variables-included3.sieve
rename to tests/extensions/include/included/variables-included3.sieve
-- 
GitLab