From c2c58e5930a1c944eb2757d04dee0f1480034c2d Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Tue, 29 Jul 2008 15:19:28 +0200
Subject: [PATCH] Testsuite: added compile error testcases and discovered one
 new issue.

---
 TODO                                          |  5 +-
 src/lib-sieve/ext-encoded-character.c         |  2 +
 src/testsuite/tests/compile/errors.svtest     | 85 +++++++++++++++++++
 .../tests/compile/errors/address-part.sieve   | 17 ++++
 .../compile/errors/encoded-character.sieve    | 23 +++++
 .../tests/compile/errors/envelope.sieve       | 23 +++++
 src/testsuite/tests/compile/errors/keep.sieve | 14 +++
 src/testsuite/tests/compile/errors/size.sieve | 47 ++++++++++
 src/testsuite/tests/compile/errors/stop.sieve | 33 +++++++
 src/testsuite/tests/control-structures.svtest |  7 +-
 10 files changed, 250 insertions(+), 6 deletions(-)
 create mode 100644 src/testsuite/tests/compile/errors/address-part.sieve
 create mode 100644 src/testsuite/tests/compile/errors/encoded-character.sieve
 create mode 100644 src/testsuite/tests/compile/errors/envelope.sieve
 create mode 100644 src/testsuite/tests/compile/errors/keep.sieve
 create mode 100644 src/testsuite/tests/compile/errors/size.sieve
 create mode 100644 src/testsuite/tests/compile/errors/stop.sieve

diff --git a/TODO b/TODO
index 6deb57d78..adf050216 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,9 @@
 Next (in order of descending priority/precedence):
 * Full standards compliance review for the engine and all fully implemented 
   sieve extensions. Issues discovered so far:
-	- :matches : match values must only be changed when the test 
-	  matches.
+	- Encoded character processing must not raise an error on substitutions
+	  that are not syntactically valid.
+	- :matches : match values must only be changed when the test matches.
 	- If an address is not syntactically valid, then it will not be matched
 	  by tests specifying ":localpart" or ":domain".
 	- Fix/Report issues listed in 'doc/rfc/RFC Controversy.txt'
diff --git a/src/lib-sieve/ext-encoded-character.c b/src/lib-sieve/ext-encoded-character.c
index 334640611..08a43e4c6 100644
--- a/src/lib-sieve/ext-encoded-character.c
+++ b/src/lib-sieve/ext-encoded-character.c
@@ -258,6 +258,8 @@ bool arg_encoded_string_validate
 			}
 		}
 	} T_END;
+
+	if ( !result ) return FALSE;
 	
 	if ( newstr != NULL ) {
 		if ( strstart != strend )
diff --git a/src/testsuite/tests/compile/errors.svtest b/src/testsuite/tests/compile/errors.svtest
index 28e709856..028ce6b40 100644
--- a/src/testsuite/tests/compile/errors.svtest
+++ b/src/testsuite/tests/compile/errors.svtest
@@ -157,3 +157,88 @@ test "Require errors (FIXME: count only)" {
 		test_fail "wrong number of errors reported";
 	}	
 }
+
+/*
+ * Size test
+ */
+
+test "Size errors (FIXME: count only)" {
+    if test_compile "errors/size.sieve" {
+        test_fail "compile should have failed.";
+    }
+
+    if not test_error :count "eq" :comparator "i;ascii-numeric" "7" {
+        test_fail "wrong number of errors reported";
+    }
+}
+
+/*
+ * Envelope test
+ */
+
+test "Envelope errors (FIXME: count only)" {
+    if test_compile "errors/envelope.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";
+    }
+}
+
+/*
+ * Stop command
+ */
+
+test "Stop errors (FIXME: count only)" {
+    if test_compile "errors/stop.sieve" {
+        test_fail "compile should have failed.";
+    }
+
+    if not test_error :count "eq" :comparator "i;ascii-numeric" "8" {
+        test_fail "wrong number of errors reported";
+    }
+}
+
+/*
+ * Keep command
+ */
+
+test "Keep errors (FIXME: count only)" {
+    if test_compile "errors/keep.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";
+    }
+}
+
+/*
+ * ADDRESS-PART errors
+ */
+
+test "ADDRESS-PART errors (FIXME: count only)" {
+    if test_compile "errors/address-part.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";
+    }
+}
+
+/*
+ * Encoded-character errors
+ */
+
+test "Encoded-character errors (FIXME: count only)" {
+    if test_compile "errors/encoded-character.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";
+    }
+}
+
diff --git a/src/testsuite/tests/compile/errors/address-part.sieve b/src/testsuite/tests/compile/errors/address-part.sieve
new file mode 100644
index 000000000..0abc07d64
--- /dev/null
+++ b/src/testsuite/tests/compile/errors/address-part.sieve
@@ -0,0 +1,17 @@
+/*
+ * Address part errors
+ *
+ * Total errors: 2 (+1 = 3)
+ */
+
+# Duplicate address part (1)
+if address :all :comparator "i;octet" :domain "from" "STEPHAN" {
+
+	# Duplicate address part (2)
+	if address :domain :localpart :comparator "i;octet" "from" "drunksnipers.com" {
+		keep;
+	}
+
+	stop;
+}
+
diff --git a/src/testsuite/tests/compile/errors/encoded-character.sieve b/src/testsuite/tests/compile/errors/encoded-character.sieve
new file mode 100644
index 000000000..698eb0801
--- /dev/null
+++ b/src/testsuite/tests/compile/errors/encoded-character.sieve
@@ -0,0 +1,23 @@
+/*
+ * Encoded-character errors
+ *
+ * Total errors: 2 (+1 = 3)
+ */
+
+require "encoded-character";
+require "fileinto";
+
+# Invalid unicode character (1)
+fileinto "INBOX.${unicode:200000}";
+
+# Not an error
+#fileinto "INBOX.${unicode:200000";
+
+# Invalid unicode character (2)
+fileinto "INBOX.${Unicode:DF01}";
+
+# Not an error
+#fileinto "INBOX.${Unicode:DF01";
+
+
+
diff --git a/src/testsuite/tests/compile/errors/envelope.sieve b/src/testsuite/tests/compile/errors/envelope.sieve
new file mode 100644
index 000000000..71d85b4b3
--- /dev/null
+++ b/src/testsuite/tests/compile/errors/envelope.sieve
@@ -0,0 +1,23 @@
+/*
+ * Envelope test errors
+ *
+ * Total errors: 2 (+1 = 3)
+ */
+
+require "envelope";
+
+# Not an error 
+if envelope :is "to" "frop@rename-it.nl" {
+}
+
+# Unknown envelope part (1)
+if envelope :is "frop" "frop@rename-it.nl" {
+}
+
+# Not an error
+if envelope :is ["to","from"] "frop@rename-it.nl" {
+}
+
+# Unknown envelope part (2)
+if envelope :is ["to","frop"] "frop@rename-it.nl" {
+}
diff --git a/src/testsuite/tests/compile/errors/keep.sieve b/src/testsuite/tests/compile/errors/keep.sieve
new file mode 100644
index 000000000..bbce0d530
--- /dev/null
+++ b/src/testsuite/tests/compile/errors/keep.sieve
@@ -0,0 +1,14 @@
+/*
+ * Keep errors
+ *
+ * Total erors: 2 (+1 = 3)
+ */
+
+# Spurious string argument
+keep "frop";
+
+# Spurious test 
+keep true;
+
+# Not an error
+keep;
diff --git a/src/testsuite/tests/compile/errors/size.sieve b/src/testsuite/tests/compile/errors/size.sieve
new file mode 100644
index 000000000..71281ae7f
--- /dev/null
+++ b/src/testsuite/tests/compile/errors/size.sieve
@@ -0,0 +1,47 @@
+/*
+ * Size test errors
+ * 
+ * Total errors: 6 (+1 = 7)
+ */
+
+# Used as command (1)
+size :under 23;
+
+# Missing argument (2)
+if size {
+}
+
+# Missing :over/:under (3)
+if size 45 {
+	discard;
+}
+
+# No error
+if size :over 34K {
+	stop;
+}
+
+# No error
+if size :under 34M {
+	stop;
+}
+
+# Conflicting tags (4)
+if size :under :over 34 {
+	keep;
+}
+
+# Duplicate tags (5)
+if size :over :over 45M {
+	stop;
+}
+
+# Wrong argument order (6)
+if size 34M :over {
+	stop;
+}
+
+# No error; but worthy of a warning
+if size :under 0 {
+	stop;
+}
diff --git a/src/testsuite/tests/compile/errors/stop.sieve b/src/testsuite/tests/compile/errors/stop.sieve
new file mode 100644
index 000000000..75a3d76b3
--- /dev/null
+++ b/src/testsuite/tests/compile/errors/stop.sieve
@@ -0,0 +1,33 @@
+/*
+ * Stop command errors
+ *
+ * Total errors: 7 (+1 = 8)
+ */
+
+# Spurious string argument
+stop "frop";
+
+# Spurious number argument
+stop 13;
+
+# Spurious string list argument
+stop [ "frop", "frop" ];
+
+# Spurious test
+stop true;
+
+# Spurious test list
+stop ( true, false );
+
+# Spurious command block
+stop {
+  keep;
+}
+
+# Spurious argument and test
+stop "frop" true {
+  stop;
+}
+
+# Not an error
+stop;
diff --git a/src/testsuite/tests/control-structures.svtest b/src/testsuite/tests/control-structures.svtest
index 0dbb73b6c..8459df2fb 100644
--- a/src/testsuite/tests/control-structures.svtest
+++ b/src/testsuite/tests/control-structures.svtest
@@ -8,7 +8,7 @@ Subject: Test
 Test!
 .
 ;
-/*
+
 test "IF-true" {
 	if true {
 	} else {
@@ -38,7 +38,7 @@ test "ELSEIF-false" {
 		test_fail "executed wrong alternative (elsif)";	
 	} else {
 	}
-}*/
+}
 
 test "IF-address-true" {
 	if address :is "from" "stephan@rename-it.nl" {
@@ -47,7 +47,6 @@ test "IF-address-true" {
 	}
 }
 
-/*
 test "IF-address-false" {
 	if address :is "from" "tss@iki.fi" {
 		test_fail "executed wrong alternative";
@@ -147,4 +146,4 @@ test "STOP" {
 	stop;
 	test_fail "continued after stop";
 }
-*/
+
-- 
GitLab