1*00b67f09SDavid van Moolenbroek /* $NetBSD: compress_test.c,v 1.6 2014/12/10 04:37:53 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1999-2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: compress_test.c,v 1.34 2007/06/18 23:47:26 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek /*! \file */
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <config.h>
25*00b67f09SDavid van Moolenbroek
26*00b67f09SDavid van Moolenbroek #include <stdlib.h>
27*00b67f09SDavid van Moolenbroek #include <string.h>
28*00b67f09SDavid van Moolenbroek
29*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
30*00b67f09SDavid van Moolenbroek #include <isc/commandline.h>
31*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
32*00b67f09SDavid van Moolenbroek #include <isc/util.h>
33*00b67f09SDavid van Moolenbroek
34*00b67f09SDavid van Moolenbroek #include <dns/compress.h>
35*00b67f09SDavid van Moolenbroek #include <dns/name.h>
36*00b67f09SDavid van Moolenbroek
37*00b67f09SDavid van Moolenbroek unsigned char plain1[] = "\003yyy\003foo";
38*00b67f09SDavid van Moolenbroek unsigned char plain2[] = "\003bar\003yyy\003foo";
39*00b67f09SDavid van Moolenbroek unsigned char plain3[] = "\003xxx\003bar\003foo";
40*00b67f09SDavid van Moolenbroek unsigned char plain[] = "\003yyy\003foo\0\003bar\003yyy\003foo\0\003"
41*00b67f09SDavid van Moolenbroek "bar\003yyy\003foo\0\003xxx\003bar\003foo";
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek /*
44*00b67f09SDavid van Moolenbroek * Result concatenate (plain1, plain2, plain2, plain3).
45*00b67f09SDavid van Moolenbroek */
46*00b67f09SDavid van Moolenbroek int raw = 0;
47*00b67f09SDavid van Moolenbroek int verbose = 0;
48*00b67f09SDavid van Moolenbroek
49*00b67f09SDavid van Moolenbroek void
50*00b67f09SDavid van Moolenbroek test(unsigned int, dns_name_t *, dns_name_t *, dns_name_t *,
51*00b67f09SDavid van Moolenbroek unsigned char *, unsigned int);
52*00b67f09SDavid van Moolenbroek
53*00b67f09SDavid van Moolenbroek int
main(int argc,char * argv[])54*00b67f09SDavid van Moolenbroek main(int argc, char *argv[]) {
55*00b67f09SDavid van Moolenbroek dns_name_t name1;
56*00b67f09SDavid van Moolenbroek dns_name_t name2;
57*00b67f09SDavid van Moolenbroek dns_name_t name3;
58*00b67f09SDavid van Moolenbroek isc_region_t region;
59*00b67f09SDavid van Moolenbroek int c;
60*00b67f09SDavid van Moolenbroek
61*00b67f09SDavid van Moolenbroek while ((c = isc_commandline_parse(argc, argv, "rv")) != -1) {
62*00b67f09SDavid van Moolenbroek switch (c) {
63*00b67f09SDavid van Moolenbroek case 'r':
64*00b67f09SDavid van Moolenbroek raw++;
65*00b67f09SDavid van Moolenbroek break;
66*00b67f09SDavid van Moolenbroek case 'v':
67*00b67f09SDavid van Moolenbroek verbose++;
68*00b67f09SDavid van Moolenbroek break;
69*00b67f09SDavid van Moolenbroek }
70*00b67f09SDavid van Moolenbroek }
71*00b67f09SDavid van Moolenbroek
72*00b67f09SDavid van Moolenbroek dns_name_init(&name1, NULL);
73*00b67f09SDavid van Moolenbroek region.base = plain1;
74*00b67f09SDavid van Moolenbroek region.length = sizeof(plain1);
75*00b67f09SDavid van Moolenbroek dns_name_fromregion(&name1, ®ion);
76*00b67f09SDavid van Moolenbroek
77*00b67f09SDavid van Moolenbroek dns_name_init(&name2, NULL);
78*00b67f09SDavid van Moolenbroek region.base = plain2;
79*00b67f09SDavid van Moolenbroek region.length = sizeof(plain2);
80*00b67f09SDavid van Moolenbroek dns_name_fromregion(&name2, ®ion);
81*00b67f09SDavid van Moolenbroek
82*00b67f09SDavid van Moolenbroek dns_name_init(&name3, NULL);
83*00b67f09SDavid van Moolenbroek region.base = plain3;
84*00b67f09SDavid van Moolenbroek region.length = sizeof(plain3);
85*00b67f09SDavid van Moolenbroek dns_name_fromregion(&name3, ®ion);
86*00b67f09SDavid van Moolenbroek
87*00b67f09SDavid van Moolenbroek test(DNS_COMPRESS_NONE, &name1, &name2, &name3, plain, sizeof(plain));
88*00b67f09SDavid van Moolenbroek test(DNS_COMPRESS_GLOBAL14, &name1, &name2, &name3, plain,
89*00b67f09SDavid van Moolenbroek sizeof(plain));
90*00b67f09SDavid van Moolenbroek test(DNS_COMPRESS_ALL, &name1, &name2, &name3, plain, sizeof(plain));
91*00b67f09SDavid van Moolenbroek
92*00b67f09SDavid van Moolenbroek return (0);
93*00b67f09SDavid van Moolenbroek }
94*00b67f09SDavid van Moolenbroek
95*00b67f09SDavid van Moolenbroek void
test(unsigned int allowed,dns_name_t * name1,dns_name_t * name2,dns_name_t * name3,unsigned char * result,unsigned int length)96*00b67f09SDavid van Moolenbroek test(unsigned int allowed, dns_name_t *name1, dns_name_t *name2,
97*00b67f09SDavid van Moolenbroek dns_name_t *name3, unsigned char *result, unsigned int length)
98*00b67f09SDavid van Moolenbroek {
99*00b67f09SDavid van Moolenbroek isc_mem_t *mctx = NULL;
100*00b67f09SDavid van Moolenbroek dns_compress_t cctx;
101*00b67f09SDavid van Moolenbroek dns_decompress_t dctx;
102*00b67f09SDavid van Moolenbroek isc_buffer_t source;
103*00b67f09SDavid van Moolenbroek isc_buffer_t target;
104*00b67f09SDavid van Moolenbroek dns_name_t name;
105*00b67f09SDavid van Moolenbroek unsigned char buf1[1024];
106*00b67f09SDavid van Moolenbroek unsigned char buf2[1024];
107*00b67f09SDavid van Moolenbroek
108*00b67f09SDavid van Moolenbroek if (verbose) {
109*00b67f09SDavid van Moolenbroek const char *s;
110*00b67f09SDavid van Moolenbroek switch (allowed) {
111*00b67f09SDavid van Moolenbroek case DNS_COMPRESS_NONE: s = "DNS_COMPRESS_NONE"; break;
112*00b67f09SDavid van Moolenbroek case DNS_COMPRESS_GLOBAL14: s = "DNS_COMPRESS_GLOBAL14"; break;
113*00b67f09SDavid van Moolenbroek /* case DNS_COMPRESS_ALL: s = "DNS_COMPRESS_ALL"; break; */
114*00b67f09SDavid van Moolenbroek default: s = "UNKNOWN"; break;
115*00b67f09SDavid van Moolenbroek }
116*00b67f09SDavid van Moolenbroek fprintf(stdout, "Allowed = %s\n", s);
117*00b67f09SDavid van Moolenbroek }
118*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
119*00b67f09SDavid van Moolenbroek isc_buffer_init(&source, buf1, sizeof(buf1));
120*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_compress_init(&cctx, -1, mctx) == ISC_R_SUCCESS);
121*00b67f09SDavid van Moolenbroek
122*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_towire(name1, &cctx, &source) == ISC_R_SUCCESS);
123*00b67f09SDavid van Moolenbroek
124*00b67f09SDavid van Moolenbroek /*
125*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_compress_localinit(&cctx, name1, &source) ==
126*00b67f09SDavid van Moolenbroek ISC_R_SUCCESS);
127*00b67f09SDavid van Moolenbroek */
128*00b67f09SDavid van Moolenbroek dns_compress_setmethods(&cctx, allowed);
129*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_towire(name2, &cctx, &source) == ISC_R_SUCCESS);
130*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_towire(name2, &cctx, &source) == ISC_R_SUCCESS);
131*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_towire(name3, &cctx, &source) == ISC_R_SUCCESS);
132*00b67f09SDavid van Moolenbroek
133*00b67f09SDavid van Moolenbroek /*
134*00b67f09SDavid van Moolenbroek dns_compress_localinvalidate(&cctx);
135*00b67f09SDavid van Moolenbroek */
136*00b67f09SDavid van Moolenbroek dns_compress_rollback(&cctx, 0); /* testing only */
137*00b67f09SDavid van Moolenbroek dns_compress_invalidate(&cctx);
138*00b67f09SDavid van Moolenbroek
139*00b67f09SDavid van Moolenbroek if (raw) {
140*00b67f09SDavid van Moolenbroek unsigned int i;
141*00b67f09SDavid van Moolenbroek for (i = 0; i < source.used; /* */ ) {
142*00b67f09SDavid van Moolenbroek fprintf(stdout, "%02x",
143*00b67f09SDavid van Moolenbroek ((unsigned char *)source.base)[i]);
144*00b67f09SDavid van Moolenbroek if ((++i % 20) == 0)
145*00b67f09SDavid van Moolenbroek fputs("\n", stdout);
146*00b67f09SDavid van Moolenbroek else
147*00b67f09SDavid van Moolenbroek if (i == source.used)
148*00b67f09SDavid van Moolenbroek fputs("\n", stdout);
149*00b67f09SDavid van Moolenbroek else
150*00b67f09SDavid van Moolenbroek fputs(" ", stdout);
151*00b67f09SDavid van Moolenbroek }
152*00b67f09SDavid van Moolenbroek }
153*00b67f09SDavid van Moolenbroek
154*00b67f09SDavid van Moolenbroek isc_buffer_setactive(&source, source.used);
155*00b67f09SDavid van Moolenbroek isc_buffer_init(&target, buf2, sizeof(buf2));
156*00b67f09SDavid van Moolenbroek dns_decompress_init(&dctx, -1, DNS_DECOMPRESS_STRICT);
157*00b67f09SDavid van Moolenbroek
158*00b67f09SDavid van Moolenbroek dns_name_init(&name, NULL);
159*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_fromwire(&name, &source, &dctx, ISC_FALSE,
160*00b67f09SDavid van Moolenbroek &target) == ISC_R_SUCCESS);
161*00b67f09SDavid van Moolenbroek dns_decompress_setmethods(&dctx, allowed);
162*00b67f09SDavid van Moolenbroek /*
163*00b67f09SDavid van Moolenbroek dns_decompress_localinit(&dctx, &name, &source);
164*00b67f09SDavid van Moolenbroek */
165*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_fromwire(&name, &source, &dctx, ISC_FALSE,
166*00b67f09SDavid van Moolenbroek &target) == ISC_R_SUCCESS);
167*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_fromwire(&name, &source, &dctx, ISC_FALSE,
168*00b67f09SDavid van Moolenbroek &target) == ISC_R_SUCCESS);
169*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dns_name_fromwire(&name, &source, &dctx, ISC_FALSE,
170*00b67f09SDavid van Moolenbroek &target) == ISC_R_SUCCESS);
171*00b67f09SDavid van Moolenbroek /*
172*00b67f09SDavid van Moolenbroek dns_decompress_localinvalidate(&dctx);
173*00b67f09SDavid van Moolenbroek */
174*00b67f09SDavid van Moolenbroek dns_decompress_invalidate(&dctx);
175*00b67f09SDavid van Moolenbroek
176*00b67f09SDavid van Moolenbroek if (raw) {
177*00b67f09SDavid van Moolenbroek unsigned int i;
178*00b67f09SDavid van Moolenbroek for (i = 0; i < target.used; /* */ ) {
179*00b67f09SDavid van Moolenbroek fprintf(stdout, "%02x",
180*00b67f09SDavid van Moolenbroek ((unsigned char *)target.base)[i]);
181*00b67f09SDavid van Moolenbroek if ((++i % 20) == 0)
182*00b67f09SDavid van Moolenbroek fputs("\n", stdout);
183*00b67f09SDavid van Moolenbroek else
184*00b67f09SDavid van Moolenbroek if (i == target.used)
185*00b67f09SDavid van Moolenbroek fputs("\n", stdout);
186*00b67f09SDavid van Moolenbroek else
187*00b67f09SDavid van Moolenbroek fputs(" ", stdout);
188*00b67f09SDavid van Moolenbroek }
189*00b67f09SDavid van Moolenbroek fputs("\n", stdout);
190*00b67f09SDavid van Moolenbroek fflush(stdout);
191*00b67f09SDavid van Moolenbroek }
192*00b67f09SDavid van Moolenbroek
193*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(target.used == length);
194*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(memcmp(target.base, result, target.used) == 0);
195*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
196*00b67f09SDavid van Moolenbroek }
197