chiark / gitweb /
Infrastructure: Switch testing over to Autotest.
[mLib] / codec / tests.at
diff --git a/codec/tests.at b/codec/tests.at
new file mode 100644 (file)
index 0000000..cf51618
--- /dev/null
@@ -0,0 +1,180 @@
+### -*-autotest-*-
+###
+### Test script for utilities
+###
+### (c) 2009 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the mLib utilities library.
+###
+### mLib is free software; you can redistribute it and/or modify
+### it under the terms of the GNU Library General Public License as
+### published by the Free Software Foundation; either version 2 of the
+### License, or (at your option) any later version.
+###
+### mLib is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU Library General Public License for more details.
+###
+### You should have received a copy of the GNU Library General Public
+### License along with mLib; if not, write to the Free
+### Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+### MA 02111-1307, USA.
+
+###--------------------------------------------------------------------------
+### Useful macros.
+
+m4_define([NEWLINE], [
+])
+
+## CODEC_TESTENCODE(codec, raw-data, encoding, [options])
+##
+## Check that CODEC encodes RAW-DATA as ENCODING, and that it can decode
+## ENCODING as RAW-DATA, using OPTIONS.
+m4_define([CODEC_TESTENCODE], [
+  printf '%s' '$2' >in
+  printf '%s\n' '$3' >expout
+  AT_CHECK([BUILDDIR/bincode $4 $1 in], [0], [expout])
+  mv in expout
+  printf '%s' '$3' >in
+  AT_CHECK([BUILDDIR/bincode -d $4 $1 in], [0], [expout])
+])
+
+## CODEC_TESTDECODE(codec, encoding, [raw-data],
+##                 [options], [exp-status], [exp-stderr])
+##
+## Check that CODEC decodes ENCODING as RAW-DATA, given the OPTIONS, or that
+## it reports EXP-STATUS and produces EXP-STDERR.
+m4_define([CODEC_TESTDECODE], [
+  printf '%s' '$2' >in
+  printf '%s' '$3' >expout
+  AT_CHECK([BUILDDIR/bincode -d $4 $1 in], [$5], [expout],
+          m4_if([$6], [], [], [bincode: decoding error: $6[]NEWLINE]))
+])
+
+###--------------------------------------------------------------------------
+### base64
+AT_SETUP([codec: base64])
+AT_KEYWORDS([codec base64])
+
+## Test vectors from RFC4648.
+CODEC_TESTENCODE([base64],     [],             [])
+CODEC_TESTENCODE([base64],     [f],            [Zg==])
+CODEC_TESTENCODE([base64],     [fo],           [Zm8=])
+CODEC_TESTENCODE([base64],     [foo],          [Zm9v])
+CODEC_TESTENCODE([base64],     [foob],         [Zm9vYg==])
+CODEC_TESTENCODE([base64],     [fooba],        [Zm9vYmE=])
+CODEC_TESTENCODE([base64],     [foobar],       [Zm9vYmFy])
+
+## Test vectors for Base64-URL.
+CODEC_TESTENCODE([base64url],  [fooba],        [Zm9vYmE=])
+CODEC_TESTENCODE([base64],     [fooba?],       [Zm9vYmE/])
+CODEC_TESTENCODE([base64url],  [fooba?],       [Zm9vYmE_])
+CODEC_TESTENCODE([file64],     [fooba?],       [Zm9vYmE%])
+CODEC_TESTENCODE([base64],     [fooba~],       [Zm9vYmF+])
+CODEC_TESTENCODE([base64url],  [fooba~],       [Zm9vYmF-])
+CODEC_TESTENCODE([file64],     [fooba~],       [Zm9vYmF+])
+
+## Some noeqpad tests.
+CODEC_TESTENCODE([base64],     [f],            [Zg],           [-fnoeqpad])
+CODEC_TESTENCODE([base64],     [foo],          [Zm9v],         [-fnoeqpad])
+CODEC_TESTENCODE([base64],     [foob],         [Zm9vYg],       [-fnoeqpad])
+
+## Test for pad-character errors.
+CODEC_TESTDECODE([base64],     [Zg],           [f],            [],
+                [1], [Invalid padding character])
+CODEC_TESTDECODE([base64],     [Zg],           [f],            [-figneqpad])
+CODEC_TESTDECODE([base64],     [Zg=],          [f],            [-figneqpad])
+CODEC_TESTDECODE([base64],     [Zg==],         [f],            [-figneqpad])
+CODEC_TESTDECODE([base64],     [Zg],           [f],            [-fnoeqpad])
+CODEC_TESTDECODE([base64],     [Zg=],          [],             [-fnoeqpad],
+                [1], [Invalid character])
+CODEC_TESTDECODE([base64],     [Zg],           [f],            [-figneqmid])
+CODEC_TESTDECODE([base64],     [Z==g=],        [f],            [-figneqmid])
+
+## Test for other crappy characters.
+CODEC_TESTDECODE([base64],     [Z:g=:=],       [],             [],
+                [1], [Invalid character])
+CODEC_TESTDECODE([base64],     [Z:g=:=],       [f],            [-figninvch])
+CODEC_TESTDECODE([base64],     [Z:g=:==],      [],             [-figninvch],
+                [1], [Invalid padding character])
+
+## Test for incorrect padding bits.
+CODEC_TESTDECODE([base64],     [Zh==],         [],             [],
+                [1], [Nonzero padding bits])
+CODEC_TESTDECODE([base64],     [Zh==],         [f],            [-fignzpad])
+
+## Make sure the case flags are suppressed.
+CODEC_TESTENCODE([base64],     [fooba],        [Zm9vYmE=],     [-flowerc])
+
+## Multiline formatting.
+AT_DATA([bigfile],
+[There are three infallible ways of pleasing an author, and the three form a
+rising scale of compliment: 1, to tell him you have read one of his books; 2,
+to tell him you have read all of his books; 3, to ask him to let you read the
+manuscript of his forthcoming book.  No. 1 admits you to his respect; No. 2
+admits you to his admiration; No. 3 carries you clear into his heart.
+                -- Mark Twain, "Pudd'nhead Wilson's Calendar"
+])
+
+AT_DATA([bigfile.b64],
+[VGhlcmUgYXJlIHRocmVlIGluZmFsbGlibGUgd2F5cyBvZiBwbGVhc2luZyBhbiBh
+dXRob3IsIGFuZCB0aGUgdGhyZWUgZm9ybSBhCnJpc2luZyBzY2FsZSBvZiBjb21w
+bGltZW50OiAxLCB0byB0ZWxsIGhpbSB5b3UgaGF2ZSByZWFkIG9uZSBvZiBoaXMg
+Ym9va3M7IDIsCnRvIHRlbGwgaGltIHlvdSBoYXZlIHJlYWQgYWxsIG9mIGhpcyBi
+b29rczsgMywgdG8gYXNrIGhpbSB0byBsZXQgeW91IHJlYWQgdGhlCm1hbnVzY3Jp
+cHQgb2YgaGlzIGZvcnRoY29taW5nIGJvb2suICBOby4gMSBhZG1pdHMgeW91IHRv
+IGhpcyByZXNwZWN0OyBOby4gMgphZG1pdHMgeW91IHRvIGhpcyBhZG1pcmF0aW9u
+OyBOby4gMyBjYXJyaWVzIHlvdSBjbGVhciBpbnRvIGhpcyBoZWFydC4KICAgICAg
+ICAgICAgICAgIC0tIE1hcmsgVHdhaW4sICJQdWRkJ25oZWFkIFdpbHNvbidzIENh
+bGVuZGFyIgo=
+])
+cp bigfile.b64 expout
+AT_CHECK([BUILDDIR/bincode base64 bigfile], [0], [expout])
+AT_CHECK([BUILDDIR/bincode -f-ignnewl -d base64 bigfile.b64], [1], [ignore],
+        [bincode: decoding error: Invalid character[]NEWLINE])
+cp bigfile expout
+AT_CHECK([BUILDDIR/bincode -d base64 bigfile.b64], [0], [expout])
+
+AT_CLEANUP
+
+## base32
+AT_SETUP([codec: base32])
+AT_KEYWORDS([codec base32])
+
+CODEC_TESTENCODE([base32],     [],             [])
+CODEC_TESTENCODE([base32],     [f],            [MY======])
+CODEC_TESTENCODE([base32],     [fo],           [MZXQ====])
+CODEC_TESTENCODE([base32],     [foo],          [MZXW6===])
+CODEC_TESTENCODE([base32],     [foob],         [MZXW6YQ=])
+CODEC_TESTENCODE([base32],     [fooba],        [MZXW6YTB])
+CODEC_TESTENCODE([base32],     [foobar],       [MZXW6YTBOI======])
+
+CODEC_TESTENCODE([base32hex],  [],             [])
+CODEC_TESTENCODE([base32hex],  [f],            [CO======])
+CODEC_TESTENCODE([base32hex],  [fo],           [CPNG====])
+CODEC_TESTENCODE([base32hex],  [foo],          [CPNMU===])
+CODEC_TESTENCODE([base32hex],  [foob],         [CPNMUOG=])
+CODEC_TESTENCODE([base32hex],  [fooba],        [CPNMUOJ1])
+CODEC_TESTENCODE([base32hex],  [foobar],       [CPNMUOJ1E8======])
+
+AT_CLEANUP
+
+## hex
+AT_SETUP([codec: hex])
+AT_KEYWORDS([codec hex])
+
+CODEC_TESTENCODE([hex],                [],             [])
+CODEC_TESTENCODE([hex],                [f],            [66])
+CODEC_TESTENCODE([hex],                [fo],           [666F])
+CODEC_TESTENCODE([hex],                [foo],          [666F6F])
+CODEC_TESTENCODE([hex],                [foob],         [666F6F62])
+CODEC_TESTENCODE([hex],                [fooba],        [666F6F6261])
+CODEC_TESTENCODE([hex],                [foobar],       [666F6F626172])
+
+AT_CLEANUP
+
+###----- That's all, folks --------------------------------------------------