Sunday, March 16, 2008

Inter-operability Testing

Given that asn1c can't cope with entirely random (although legal) ASN.1, I've had to move away from using QuickCheck (for that particular purpose). I'm now going to use the unit tests to test inter-operability. Running main in Run.hs will:

  • generate ASN.1

  • run asn1c

  • generate C to encode a value

  • compile the C

  • run the C (encoding the value)

  • decode the value


I haven't yet put in code to check that the decoded value equals the original value.

It would be useful to be able to generate and encode values for multiple types rather than creating all the asn1c overhead for each type.

Upgrading System

As a test, I've generated some ASN.1 and C. Unfortunately, asn1c gives an error for PER encoding with this but not for BER encoding :-(


FooBar {1 2 3 4 5 6} DEFINITIONS ::=
BEGIN
Integer5 ::= INTEGER (-1..MAX)
value1 Integer5 ::= 4096
END



#include ?stdio.h> /* for stdout */
#include ?stdlib.h> /* for malloc () */
#include ?assert.h> /* for run-time control */
#include ?integer5.h> /* Integer5 ASN.1 type */

/*
* This is a custom function which writes the
* encoded output into some FILE stream.
*/

static int
write_out(const void *buffer, size_t size, void *app_key) {
FILE *out_fp = app_key;
size_t wrote;
wrote = fwrite(buffer, 1, size, out_fp);
return (wrote == size) ? 0 : -1;
}

int main(int ac, char **av) {

/* Encoder return value */
asn_enc_rval_t ec;


/* Declare a pointer to a Integer5 type */
Integer5_t *integer5;

/* Allocate an instance of Integer5 */
integer5 = calloc(1, sizeof(Integer5_t)); /* not malloc! */
assert(integer5); /* Assume infinite memory */

(*integer5) = 4097;

if(ac < filename =" av[1];" fp =" fopen(filename," ec =" uper_encode(&asn_DEF_Integer5,integer5,write_out,fp);" encoded ="="">name : "unknown");
exit(65); /* better, EX_DATAERR */
} else {
fprintf(stderr,"Created %s with PER encoded Integer5\n",filename);
}
fclose(fp);
}
/* Also print the constructed ???? XER encoded (XML) */
xer_fprint(stdout,&asn_DEF_Integer5,integer5);
return 0; /* Encoding finished successfully */
}


We may need this:


dom@heisenberg:~/asn15/asn1> darcs whatsnew
{
hunk ./UnitTest.lhs 33
+import qualified Data.Binary.Strict.Util as BU
+
+bar = BU.hexDump
+bax = BU.hexDumpString
}