예제 #1
0
파일: check-70.c 프로젝트: Sudoka/asn1c
static void
process_XER_data(enum expectation expectation, char *fbuf, size_t size) {
	PDU_t *st;

	st = load_object_from(expectation, fbuf, size, AS_XER);
	if(!st) return;

	/* Save and re-load as DER */
	save_object_as(st, AS_DER);
	st = load_object_from(expectation, buf, buf_offset, AS_DER);
	assert(st);

	save_object_as(st, AS_XER);
	fprintf(stderr, "=== original ===\n");
	fwrite(fbuf, 1, size, stderr);
	fprintf(stderr, "=== re-encoded ===\n");
	fwrite(buf, 1, buf_offset, stderr);
	fprintf(stderr, "=== end ===\n");

	switch(expectation) {
	case EXP_DIFFERENT:
		assert(!xer_encoding_equal(fbuf, size, buf, buf_offset));
		break;
	case EXP_BROKEN:
		assert(!xer_encoding_equal(fbuf, size, buf, buf_offset));
		break;
	case EXP_OK:
		assert(xer_encoding_equal(fbuf, size, buf, buf_offset));
		break;
	}

	asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0);
}
예제 #2
0
static void
process_XER_data(const char *fname, char *fbuf, int size) {
	PDU_t *st;

	st = load_object_from(fname, fbuf, size, AS_XER, 0);
	if(!st) return;

	/* Save and re-load as PER */
	save_object_as(st, AS_PER);
	compare_with_data_out(fname, buf, buf_offset);
	st = load_object_from("buffer", buf, buf_offset, AS_PER, 0);
	assert(st);

	save_object_as(st, AS_XER);
	fprintf(stderr, "=== original ===\n");
	fwrite(fbuf, 1, size, stderr);
	fprintf(stderr, "=== re-encoded ===\n");
	fwrite(buf, 1, buf_offset, stderr);
	fprintf(stderr, "=== end ===\n");

	if(fname[strlen(fname) - 4] == 'X')
		assert(!xer_encoding_equal(fbuf, size, buf, buf_offset));
	else
		assert(xer_encoding_equal(fbuf, size, buf, buf_offset));

	asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0);
}
static void
process_XER_data(const char *fname, enum expectation expectation, char *fbuf, size_t size) {
	PDU_t *st;

	st = load_object_from(fname, expectation, fbuf, size, AS_XER);
	if(!st) return;

	/* Save and re-load as PER */
	save_object_as(st, expectation, AS_PER);
	if(expectation == EXP_PER_NOCOMP)
		return;	/* Already checked */
	st = load_object_from("buffer", expectation, buf, buf_offset, AS_PER);
	assert(st);

	save_object_as(st,
			expectation,
			(expectation == EXP_CXER_EXACT
			|| expectation == EXP_CXER_DIFF)
			? AS_CXER : AS_XER);
	fprintf(stderr, "=== original ===\n");
	fwrite(fbuf, 1, size, stderr);
	fprintf(stderr, "=== re-encoded ===\n");
	fwrite(buf, 1, buf_offset, stderr);
	fprintf(stderr, "=== end ===\n");

	switch(expectation) {
	case EXP_DIFFERENT:
		assert(!xer_encoding_equal(fbuf, size, buf, buf_offset));
		break;
	case EXP_BROKEN:
		assert(!xer_encoding_equal(fbuf, size, buf, buf_offset));
		break;
	case EXP_CXER_EXACT:
		buf[buf_offset++] = '\n';
		assert(size == buf_offset);
		assert(memcmp(fbuf, buf, size) == 0);
		break;
	case EXP_CXER_DIFF:
		buf[buf_offset++] = '\n';
		assert(size != buf_offset
			|| memcmp(fbuf, buf, size));
		break;
	case EXP_OK:
	case EXP_PER_NOCOMP:
		assert(xer_encoding_equal(fbuf, size, buf, buf_offset));
		break;
	}

	asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0);
}
예제 #4
0
static void
compare_with_data_out(const char *fname, void *datap, size_t size) {
    char *data = datap;
    char outName[256];
    unsigned char fbuf[1024];
    size_t rd;
    FILE *f;
    char lastChar;
    int mustfail, compare;

    sprintf(outName, "../data-126/%s", fname);
    strcpy(outName + strlen(outName) - 3, ".out");

    fprintf(stderr, "Comparing PER output with [%s]\n", outName);

    lastChar = outName[strlen(outName)-5];
    mustfail = lastChar == 'P';
    compare = lastChar != 'C';

    if((compare && !mustfail) && getenv("REGENERATE")) {
        f = fopen(outName, "w");
        fwrite(data, 1, size, f);
        fclose(f);
    } else {
        f = fopen(outName, "r");
        assert(f);
        rd = fread(fbuf, 1, sizeof(fbuf), f);
        assert(rd);
        fclose(f);

        fprintf(stderr, "Trying to decode [%s]\n", outName);
        load_object_from(outName, fbuf, rd, AS_PER, mustfail);
        if(mustfail) return;

        if(compare) {
            assert(rd == (size_t)size);
            assert(memcmp(fbuf, data, rd) == 0);
            fprintf(stderr, "XER->PER recoding .in->.out match.\n");
        } else {
            assert(rd != (size_t)size || memcmp(fbuf, data, rd));
            fprintf(stderr, "XER->PER recoding .in->.out diverge.\n");
        }
    }
}