tests: Fix the two Python XFAIL tests.
authorBen Pfaff <blp@nicira.com>
Fri, 13 May 2011 21:20:10 +0000 (14:20 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 24 May 2011 18:32:22 +0000 (11:32 -0700)
OVS has two Python tests that have always failed, for reasons not
understood, since they were added to the tree.  This commit fixes them.

One problem was that Python was assuming that stdout was encoded in ASCII.
Apparently the only way to "fix" this at runtime is to set PYTHONIOENCODING
to utf_8 in the environment, so this change does that.

Second, it appears that Python really doesn't like to print invalid UTF-8,
so this avoids doing that in python/ovs/json.py, instead just printing
the hexadecimal values of the invalid bytes.  For consistency, it makes
the same change to the C version.

Third, the C version of test-ovsdb doesn't check UTF-8 for consistency, it
just sends it blindly to the OVSDB server, but Python does check it and so
it bails out earlier.  This commit changes the Python version of the
"no invalid UTF-8 sequences in strings" to allow for the slight difference
in output that occurs for that reason.

Finally, test-ovsdb.py needs to convert error messages to Unicode
explicitly before printing them in the "parse-atoms" function.  I don't
really understand why, but now it works.

lib/ovsdb-data.c
python/ovs/json.py
tests/atlocal.in
tests/ovsdb-data.at
tests/test-ovsdb.py

index 150ae618ef83106ea4fc6bc8754f0990a0f118dc..54ce72cf719c03baf3b3303df5f685f9fee8087c 100644 (file)
@@ -690,8 +690,7 @@ check_string_constraints(const char *s,
         struct ovsdb_error *error;
 
         error = ovsdb_error("constraint violation",
-                            "\"%s\" is not a valid UTF-8 string: %s",
-                            s, msg);
+                            "not a valid UTF-8 string: %s", msg);
         free(msg);
         return error;
     }
index 1e26a62909240903acd476a61764f01782c49034..f8b02d18004cbb640e303f8997269abf7704f9c6 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2010 Nicira Networks
+# Copyright (c) 2010, 2011 Nicira Networks
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -114,9 +114,7 @@ def from_string(s):
         s = unicode(s, 'utf-8')
     except UnicodeDecodeError, e:
         seq = ' '.join(["0x%2x" % ord(c) for c in e.object[e.start:e.end]])
-        raise Error("\"%s\" is not a valid UTF-8 string: "
-                    "invalid UTF-8 sequence %s" % (s, seq),
-                    tag="constraint violation")
+        return ("not a valid UTF-8 string: invalid UTF-8 sequence %s" % seq)
     p = Parser(check_trailer=True)
     p.feed(s)
     return p.finish()
index f1c045766e331f43dd560b8eee980ebe364153be..9c9f654cc645235c31fe451e2d252aa7b9974b54 100644 (file)
@@ -6,3 +6,6 @@ PYTHON='@PYTHON@'
 
 PYTHONPATH=$PYTHONPATH:$abs_top_srcdir/python
 export PYTHONPATH
+
+PYTHONIOENCODING=utf_8
+export PYTHONIOENCODING
index d45e07bfaf9f61565995d3abb646d3036f2c3ddf..b74e682176e38caba7b8daa78aed048536f262bc 100644 (file)
@@ -231,14 +231,28 @@ OVSDB_CHECK_POSITIVE_CPY([real not acceptable integer JSON atom],
 
 dnl <C0> is not allowed anywhere in a UTF-8 string.
 dnl <ED A0 80> is a surrogate and not allowed in UTF-8.
-OVSDB_CHECK_POSITIVE_CPY([no invalid UTF-8 sequences in strings],
+OVSDB_CHECK_POSITIVE([no invalid UTF-8 sequences in strings],
   [parse-atoms '[["string"]]' \
      '@<:@"m4_esyscmd([printf "\300"])"@:>@' \
      '@<:@"m4_esyscmd([printf "\355\240\200"])"@:>@' \
 ],
-  [constraint violation: "m4_esyscmd([printf "\300"])" is not a valid UTF-8 string: invalid UTF-8 sequence 0xc0
-constraint violation: "m4_esyscmd([printf "\355\240\200"])" is not a valid UTF-8 string: invalid UTF-8 sequence 0xed 0xa0],
-  [], [], [xfail])
+  [constraint violation: not a valid UTF-8 string: invalid UTF-8 sequence 0xc0
+constraint violation: not a valid UTF-8 string: invalid UTF-8 sequence 0xed 0xa0])
+
+dnl Python won't let invalid UTF-8 (its idea of invalid UTF-8, anyway) into it
+dnl at all, so this test never gets as far as a constraint violation.  It's
+dnl just a JSON parse error.
+dnl
+dnl <C0> is not allowed anywhere in a UTF-8 string.
+dnl (<ED A0 80> is not allowed in UTF-8 but Python doesn't care.)
+dnl <ED 80 7F> is not allowed in UTF-8.
+OVSDB_CHECK_POSITIVE_PY([no invalid UTF-8 sequences in strings - Python],
+  [parse-atoms '[["string"]]' \
+     '@<:@"m4_esyscmd([printf "\300"])"@:>@' \
+     '@<:@"m4_esyscmd([printf "\355\200\177"])"@:>@' \
+],
+  ["not a valid UTF-8 string: invalid UTF-8 sequence 0xc0"
+"not a valid UTF-8 string: invalid UTF-8 sequence 0xed 0x80"])
 
 OVSDB_CHECK_NEGATIVE([real not acceptable integer string atom],
   [[parse-atom-strings '["integer"]' '0.5' ]],
@@ -452,8 +466,7 @@ OVSDB_CHECK_POSITIVE_CPY([strings at least 2 characters long],
 constraint violation: "a" length 1 is less than minimum allowed length 2
 "ab"
 "abc"
-constraint violation: "𝄞" length 1 is less than minimum allowed length 2]],
-  [], [], [xfail])
+constraint violation: "𝄞" length 1 is less than minimum allowed length 2]])
 
 OVSDB_CHECK_POSITIVE_CPY([strings no more than 2 characters long],
   [[parse-atoms '{"type": "string", "maxLength": 2}' \
index 2eafe99f7c730eb215f2dec7ab51f6aa29d24036..ea45f9aed8adcd26b2eb8dc96e01cc5d96ea7e0a 100644 (file)
@@ -98,7 +98,7 @@ def do_parse_atoms(type_string, *atom_strings):
             atom = data.Atom.from_json(base, atom_json)
             print ovs.json.to_string(atom.to_json())
         except error.Error, e:
-            print e
+            print unicode(e)
 
 def do_parse_data(type_string, *data_strings):
     type_json = unbox_json(ovs.json.from_string(type_string))
@@ -290,10 +290,6 @@ The following options are also available:
     sys.exit(0)
 
 def main(argv):
-    # Make stdout and stderr UTF-8, even if they are redirected to a file.
-    sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
-    sys.stderr = codecs.getwriter("utf-8")(sys.stderr)
-
     try:
         options, args = getopt.gnu_getopt(argv[1:], 't:h',
                                           ['timeout',