diff options
author | Lev Walkin <vlm@lionet.info> | 2013-03-24 02:08:42 -0700 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2013-03-24 02:08:42 -0700 |
commit | ae1422b178640911ce9cf125ca906132b1fd9d90 (patch) | |
tree | 54f988918a949d4627a9ea21601e10e6222effa7 | |
parent | da16198825a2a658befd6d92469dd7c11a2871f5 (diff) |
verified https://sourceforge.net/p/asn1c/bugs/45/ with autotests
-rw-r--r-- | .gitignore | 12 | ||||
-rw-r--r-- | skeletons/tests/Makefile.am | 3 | ||||
-rw-r--r-- | skeletons/tests/Makefile.in | 22 | ||||
-rw-r--r-- | skeletons/tests/check-PER-INTEGER.c | 163 |
4 files changed, 182 insertions, 18 deletions
@@ -74,17 +74,7 @@ doc/docsrc/*.xdv # /skeletons/tests/ /skeletons/tests/Makefile -/skeletons/tests/check-OCTET_STRING -/skeletons/tests/check-UTCTime -/skeletons/tests/check-length -/skeletons/tests/check-REAL -/skeletons/tests/check-GeneralizedTime -/skeletons/tests/check-UTF8String -/skeletons/tests/check-PER -/skeletons/tests/check-ber_tlv_tag -/skeletons/tests/check-INTEGER -/skeletons/tests/check-OIDs -/skeletons/tests/check-XER +/skeletons/tests/check-* # /tests/ /tests/Makefile diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index fc53663a..f58ef084 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -11,7 +11,8 @@ check_PROGRAMS = \ check-INTEGER \ check-REAL \ check-XER \ - check-PER + check-PER \ + check-PER-INTEGER AM_LDFLAGS = $(top_srcdir)/skeletons/libasn1cskeletons.la LDADD = -lm diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 14bea027..483011ee 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -37,7 +37,8 @@ check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ check-OCTET_STRING$(EXEEXT) check-UTF8String$(EXEEXT) \ check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) \ - check-REAL$(EXEEXT) check-XER$(EXEEXT) check-PER$(EXEEXT) + check-REAL$(EXEEXT) check-XER$(EXEEXT) check-PER$(EXEEXT) \ + check-PER-INTEGER$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -71,6 +72,10 @@ check_PER_SOURCES = check-PER.c check_PER_OBJECTS = check-PER.$(OBJEXT) check_PER_LDADD = $(LDADD) check_PER_DEPENDENCIES = +check_PER_INTEGER_SOURCES = check-PER-INTEGER.c +check_PER_INTEGER_OBJECTS = check-PER-INTEGER.$(OBJEXT) +check_PER_INTEGER_LDADD = $(LDADD) +check_PER_INTEGER_DEPENDENCIES = check_REAL_SOURCES = check-REAL.c check_REAL_OBJECTS = check-REAL.$(OBJEXT) check_REAL_LDADD = $(LDADD) @@ -109,13 +114,14 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OCTET_STRING.c \ - check-OIDs.c check-PER.c check-REAL.c check-UTCTime.c \ - check-UTF8String.c check-XER.c check-ber_tlv_tag.c \ - check-length.c -DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c \ - check-OCTET_STRING.c check-OIDs.c check-PER.c check-REAL.c \ + check-OIDs.c check-PER.c check-PER-INTEGER.c check-REAL.c \ check-UTCTime.c check-UTF8String.c check-XER.c \ check-ber_tlv_tag.c check-length.c +DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c \ + check-OCTET_STRING.c check-OIDs.c check-PER.c \ + check-PER-INTEGER.c check-REAL.c check-UTCTime.c \ + check-UTF8String.c check-XER.c check-ber_tlv_tag.c \ + check-length.c ETAGS = etags CTAGS = ctags am__tty_colors = \ @@ -298,6 +304,9 @@ check-OIDs$(EXEEXT): $(check_OIDs_OBJECTS) $(check_OIDs_DEPENDENCIES) check-PER$(EXEEXT): $(check_PER_OBJECTS) $(check_PER_DEPENDENCIES) @rm -f check-PER$(EXEEXT) $(LINK) $(check_PER_OBJECTS) $(check_PER_LDADD) $(LIBS) +check-PER-INTEGER$(EXEEXT): $(check_PER_INTEGER_OBJECTS) $(check_PER_INTEGER_DEPENDENCIES) + @rm -f check-PER-INTEGER$(EXEEXT) + $(LINK) $(check_PER_INTEGER_OBJECTS) $(check_PER_INTEGER_LDADD) $(LIBS) check-REAL$(EXEEXT): $(check_REAL_OBJECTS) $(check_REAL_DEPENDENCIES) @rm -f check-REAL$(EXEEXT) $(LINK) $(check_REAL_OBJECTS) $(check_REAL_LDADD) $(LIBS) @@ -327,6 +336,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-INTEGER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OCTET_STRING.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-PER-INTEGER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-PER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-REAL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ diff --git a/skeletons/tests/check-PER-INTEGER.c b/skeletons/tests/check-PER-INTEGER.c new file mode 100644 index 00000000..b44974ca --- /dev/null +++ b/skeletons/tests/check-PER-INTEGER.c @@ -0,0 +1,163 @@ +#include <stdio.h> +#include <assert.h> + +#define EMIT_ASN_DEBUG 1 +#include <INTEGER.h> +#include <INTEGER.c> +#include <per_support.c> +#include <per_support.h> + +static int FailOut(const void *data, size_t size, void *op_key) { + assert(!"UNREACHABLE"); + return 0; +} + +static void normalize(asn_per_outp_t *po) { + if(po->nboff >= 8) { + po->buffer += (po->nboff >> 3); + po->nbits -= (po->nboff & ~0x07); + po->nboff &= 0x07; + } +} + +static void +check_per_encode_constrained(int lineno, int unsigned_, long value, long lbound, unsigned long ubound, int bit_range) { + INTEGER_t st; + INTEGER_t *reconstructed_st = 0; + asn_INTEGER_specifics_t specs; + asn_per_constraints_t cts; + asn_enc_rval_t enc_rval; + asn_dec_rval_t dec_rval; + asn_per_outp_t po; + asn_per_data_t pd; + long reconstructed_value; + + printf("%d: Recoding %s %ld [%ld..%lu]\n", lineno, + unsigned_ ? "unsigned" : "signed", value, lbound, ubound); + + memset(&st, 0, sizeof(st)); + memset(&po, 0, sizeof(po)); + memset(&pd, 0, sizeof(pd)); + memset(&cts, 0, sizeof(cts)); + memset(&specs, 0, sizeof(specs)); + + cts.value.flags = APC_CONSTRAINED; + cts.value.range_bits = bit_range; + cts.value.effective_bits = bit_range; + cts.value.lower_bound = lbound; + cts.value.upper_bound = ubound; + + asn_long2INTEGER(&st, value); + + po.buffer = po.tmpspace; + po.nboff = 0; + po.nbits = 8 * sizeof(po.tmpspace); + po.outper = FailOut; + + specs.field_width = sizeof(long); + specs.field_unsigned = unsigned_; + + asn_DEF_INTEGER.specifics = &specs; + enc_rval = INTEGER_encode_uper(&asn_DEF_INTEGER, &cts, &st, &po); + assert(enc_rval.encoded == 0); + + normalize(&po); + + assert(po.buffer == &po.tmpspace[bit_range / 8]); + long recovered_value = + ((uint32_t)po.tmpspace[0] << 24) + | ((uint32_t)po.tmpspace[1] << 16) + | ((uint32_t)po.tmpspace[2] << 8) + | ((uint32_t)po.tmpspace[3] << 0); + recovered_value >>= (32 - bit_range); + recovered_value += cts.value.lower_bound; + assert(recovered_value == value); + assert(po.nboff == ((bit_range == 32) ? 0 : (8 - (32 - bit_range)))); + assert(po.nbits == 8 * (sizeof(po.tmpspace) - (po.buffer-po.tmpspace))); + assert(po.flushed_bytes == 0); + + pd.buffer = po.tmpspace; + pd.nboff = 0; + pd.nbits = 8 * (po.buffer - po.tmpspace) + po.nboff; + pd.moved = 0; + dec_rval = INTEGER_decode_uper(0, &asn_DEF_INTEGER, &cts, + (void **)&reconstructed_st, &pd); + reconstructed_value = 0; + asn_INTEGER2long(reconstructed_st, &reconstructed_value); + assert(reconstructed_value == value); +} + +#define CHECK(u, v, l, r, b) \ + check_per_encode_constrained(__LINE__, u, v, l, r, b) + +int +main() { + int unsigned_; + for(unsigned_ = 0; unsigned_ < 2; unsigned_++) { + int u = unsigned_; + + /* Encode a signed 0x8babab into a range constrained by 0..2^29-1 */ + CHECK(u, 0x8babab, 0, 536870911UL, 29); + CHECK(u, 0x8babab, 0, 1073741823UL, 30); + CHECK(u, 0x8babab, 0, 2147483647UL, 31); + CHECK(u, 0x8babab, 0, 4294967295UL, 32); + + CHECK(u, 0x8babab, 10, 536870901UL, 29); + CHECK(u, 0x8babab, 10, 1073741803UL, 30); + CHECK(u, 0x8babab, 10, 2147483607UL, 31); + CHECK(u, 0x8babab, 10, 4294967205UL, 32); + + CHECK(0, 0x8babab, -10, 536870901UL, 29); + CHECK(0, 0x8babab, -10, 1073741803UL, 30); + CHECK(0, 0x8babab, -10, 2147483607UL, 31); + CHECK(0, 0x8babab, -10, 4294967205UL, 32); + + CHECK(u, 11, 10, 536870901UL, 29); + CHECK(u, 11, 10, 1073741803UL, 30); + CHECK(u, 11, 10, 2147483607UL, 31); + CHECK(u, 11, 10, 4294967205UL, 32); + + CHECK(0, 1, -10, 536870901UL, 29); + CHECK(0, 1, -10, 1073741803UL, 30); + CHECK(0, 1, -10, 2147483607UL, 31); + CHECK(0, 1, -10, 4294967205UL, 32); + + CHECK(u, 10, 10, 536870901UL, 29); + CHECK(u, 10, 10, 1073741803UL, 30); + CHECK(u, 10, 10, 2147483607UL, 31); + CHECK(u, 10, 10, 4294967205UL, 32); + + CHECK(0, 0, -10, 536870901UL, 29); + CHECK(0, 0, -10, 1073741803UL, 30); + CHECK(0, 0, -10, 2147483607UL, 31); + CHECK(0, 0, -10, 4294967205UL, 32); + + CHECK(0, -1, -10, 536870901UL, 29); + CHECK(0, -1, -10, 1073741803UL, 30); + CHECK(0, -1, -10, 2147483607UL, 31); + CHECK(0, -1, -10, 4294967205UL, 32); + + CHECK(0, -10, -10, 536870901UL, 29); + CHECK(0, -10, -10, 1073741803UL, 30); + CHECK(0, -10, -10, 2147483607UL, 31); + CHECK(0, -10, -10, 4294967205UL, 32); + + CHECK(u, 536870901UL, 10, 536870901UL, 29); + CHECK(u, 1073741803UL, 10, 1073741803UL, 30); + CHECK(u, 2147483607UL, 10, 2147483607UL, 31); + CHECK(u, 4294967205UL, 10, 4294967205UL, 32); + + CHECK(0, 536870901UL, -10, 536870901UL, 29); + CHECK(0, 1073741803UL, -10, 1073741803UL, 30); + CHECK(0, 2147483607UL, -10, 2147483607UL, 31); + CHECK(0, 4294967205UL, -10, 4294967205UL, 32); + + CHECK(u, 2000000000, 0, 4294967295UL, 32); + CHECK(u, 2147483647, 0, 4294967295UL, 32); + CHECK(u, 2147483648, 0, 4294967295UL, 32); + CHECK(u, 4000000000, 0, 4294967295UL, 32); + CHECK(u, 4294967295UL, 1, 4294967295UL, 32); + } + + return 0; +} |