# regression tests for the dss flat method
TITLE + flat
export TZ=EST5EDT
VIEW data
TEST 01 'flat simple types'
EXEC -I $data -x pwd-txt 'password==""&&uid==0' $data/pwd-txt.dat
OUTPUT - $'aha::0:0::/:/bin/sh'
EXEC -I $data -x pwd-txt 'password==""' $data/pwd-txt.dat
OUTPUT - $'aha::0:0::/:/bin/sh
he::30002:30002:Hammond Egger:/home/he:/bin/ksh'
EXEC -I $data -x pwd-txt 'shell=="/bin/ksh"' $data/pwd-txt.dat
OUTPUT - $'as:*:30001:30001:Alan Smithee:/home/as:/bin/ksh
he::30002:30002:Hammond Egger:/home/he:/bin/ksh'
EXEC -I $data -x pwd-txt '(shell=="/bin/ksh")|{print "%(dss.record)u %(uid)u"}' $data/pwd-txt.dat
OUTPUT - $'15 30001
16 30002'
EXEC -c -I $data -x pwd-txt 'shell=~".*/ksh"' $data/pwd-txt.dat
OUTPUT - $'2/18'
EXEC -c -I $data -x pwd-txt 'shell!~".*/ksh"' $data/pwd-txt.dat
OUTPUT - $'16/18'
TEST 02 'flat with field quotes'
EXEC -I $data -x httplog -p '%(time)s %(addr)s' 'addr=~"192.31/16"' $data/httplog.dat
OUTPUT - $'1997-09-30+03:00:00 192.31.231.63
1997-09-30+03:00:01 192.31.231.63
1997-09-30+03:00:04 192.31.231.63
1997-09-30+03:00:08 192.31.231.63'
TEST 03 'flat fixed width field with record terminator'
EXEC -I $data -x fixed - $data/fixed.dat
OUTPUT - $'aabbccdd
eeffgghh
iijjkkll
mmnnoopp'
EXEC -I $data -x fixed '{print "<%(s1)s> <%(s2)s> <%(s3)s> <%(s4)s>"}' $data/fixed.dat
OUTPUT - $'<aa> <bb> <cc> <dd>
<ee> <ff> <gg> <hh>
<ii> <jj> <kk> <ll>
<mm> <nn> <oo> <pp>'
EXEC -I $data -x variable -
INPUT -n - $'a:b2:c23:d234:e2345:f23456:g234567:h2345678:i23456789:j2345678:k234567:l23456:m2345:n234:o23:p2:q:'
SAME OUTPUT INPUT
EXEC -I $data -x variable '{print "<%(s1)s> <%(s2)s> <%(s3)s> <%(s4)s>"}'
OUTPUT - '<a> <> <> <>
<b2> <> <> <>
<c2> <3> <> <>
<d2> <34> <> <>
<e2> <34> <5> <>
<f2> <34> <56> <>
<g2> <34> <56> <7>
<h2> <34> <56> <78>
<i2> <34> <56> <78>
<j2> <34> <56> <78>
<k2> <34> <56> <7>
<l2> <34> <56> <>
<m2> <34> <5> <>
<n2> <34> <> <>
<o2> <3> <> <>
<p2> <> <> <>
<q> <> <> <>'
EXEC -I $data -x fixed -
SAME INPUT $data/fixed-bad.dat
OUTPUT - $'aabbccdd
eeff
gghhi
jjkkll
mmnnoop
qqrrsstt
uuvvwwxxy
zzaabbccdd
eeffgghhiij
kkllmmnnoopp
wwxxyyzz'
EXEC -I $data -x variable '{print "<%(s1)s> <%(s2)s> <%(s3)s> <%(s4)s>"}'
INPUT -n - $'abcdefghijklmnop'
OUTPUT - '<ab> <cd> <ef> <gh>
<ij> <kl> <mn> <op>'
ERROR - $'dss::scan: warning: stdin, record 1, offset 0: flat record terminator ignored'
TEST 04 'flat conversion'
EXEC -I $data -x pwd-txt '{flatten pwd-bin}' $data/pwd-txt.dat
SAME OUTPUT $data/pwd-bin.dat
ERROR - $'dss::flatten: warning: pad: field not in source record -- default value will be output'
EXEC -I $data -x pwd-bin '{flatten pwd-txt}' $data/pwd-bin.dat
SAME OUTPUT $data/pwd-txt.dat
ERROR -
EXEC -I $data -x pwd-bin '{print "%(name)s %(uid)d"}' $data/pwd-bin.dat
OUTPUT - $'root 0
sysadm 0
diag 0
daemon 1
bin 2
uucp 3
sys 4
adm 5
aha 0
lp 9
auditor 11
ftp 112
demos 993
guest 998
as 30001
he 30002
noaccess 60002
nobody 60001'
for typ in txt bin
do
EXEC -p '%(name)s' -I $data -x pwd-$typ 'password==""&&uid==0' $data/pwd-$typ.dat
OUTPUT - $'aha'
EXEC -p '%(name)s' -I $data -x pwd-$typ 'password==""' $data/pwd-$typ.dat
OUTPUT - $'aha\nhe'
EXEC -p '%(name)s' -I $data -x pwd-$typ 'shell=="/bin/ksh"' $data/pwd-$typ.dat
OUTPUT - $'as\nhe'
EXEC -p '%(comment)s' -I $data -x pwd-$typ 'shell=~".*/ksh"' $data/pwd-$typ.dat
OUTPUT - $'Alan Smithee\nHammond Egger'
EXEC -p '%(comment)s' -I $data -x pwd-$typ 'shell!~".*/ksh"' $data/pwd-$typ.dat
OUTPUT - $'Super-User
System V Administration
Hardware Diagnostics
daemons
System Tools Owner
UUCP Owner
System Activity Owner
Accounting Files Owner
Print Spooler Owner
Audit Activity Owner
File Transfer
Demonstration User
Guest Account
uid no access
original nobody uid'
done
TEST 05 'keyed data'
EXEC -I $data -x key-1 - /dev/null
ERROR - "dss: \"$data/key-1.dss\", line 28: warning: id: id: field key is ambiguous -- qualification required
dss::scan: warning: ID: id: field key is ambiguous -- qualification required"
EXEC -I $data -x key-2 - /dev/null
ERROR - "dss::scan: warning: ID: id: field key is ambiguous -- qualification required"
EXEC -I $data -x key-3 - /dev/null
ERROR - "dss: \"$data/key-3.dss\", line 29: warning: id: id: field key is ambiguous -- qualification required"
TEST 06 'copybook conversion'
EXEC -I $data -x cpy-txt '{flatten cpy-bin}' $data/cpy-txt.dat
SAME OUTPUT $data/cpy-bin.dat
EXEC -I $data -x cpy-bin '{flatten cpy-txt}' $data/cpy-bin.dat
SAME OUTPUT $data/cpy-txt.dat
EXEC -I $data -x cpy-bin '{flatten --emptyspace cpy-txt}' $data/cpy-bin.dat
OUTPUT - $'12345678|MOE |1|0|1|01/02/2003|03/02/2001|X|00000000|RUN |L|1|Q|00000000|Q| |95|00000004|00000000|Q| |01/01/1900|USD|Q|ENG|2004-05-06-07.08.09.123456|6|HOWARD
12345678|LARRY |1|0|1|04/05/2006|06/05/2004|X|00000000|DUCK |R|2|Q|00000000|Q| |12.1234567890123|00000005|00000000|Q| |01/01/1900|USD|Q|ENG|2004-05-06-07.08.10.789012|4|FINE
87654321|CURLY |1|0|2|07/08/2009|09/08/2007|X|00000000|HYDE |L|3|Q|00000000|Q| |0|00000006|00000000|Q| |01/01/1900|USD|Q|ENG|2004-05-06-07.08.11.345678|0| '
EXEC -I $data -x cpy-str-txt '{flatten cpy-str-bin}' $data/cpy-txt.dat
SAME OUTPUT $data/cpy-bin.dat
EXEC -I $data -x cpy-str-bin '{flatten cpy-str-txt}' $data/cpy-bin.dat
SAME OUTPUT $data/cpy-txt.dat
TEST 07 'fixed with variable sized but bounded fields'
EXEC -I $data -x fixedvar '{print "%(TEST_FIELD_03)s"}' $data/fixedvar.dat
OUTPUT - $'BBBB
DDDD
FFFF'
EXEC -I $data -x fixedmax '{print "%(TEST_FIELD_01)s %(TEST_FIELD_03)s %(TEST_FIELD_02_SIZE)02d %(TEST_FIELD_02_DATA)s"}' $data/fixedmax.dat
OUTPUT - $'AAAA BBBB 10 abcdefghij
CCCC DDDD 03 xyz
EEEE FFFF 00 '
EXEC -I $data -x fixedmaxvar '{print "%(TEST_FIELD_01)s %(TEST_FIELD_03)s %(TEST_FIELD_02_SIZE)02d %(TEST_FIELD_02_DATA)s"}' $data/fixedmaxvar.dat
OUTPUT - $'AAAA BBBB 10 abcdefghij
CCCC DDDD 03 xyz
EEEE FFFF 00 '
TEST 08 'syntax diagnostics'
EXEC -x bad.dss
INPUT bad.dss $'<METHOD>flat</>
<FLAT>
<FIELD>
<NAME>A</>
<FIELD>
<NAME>B</>
<FIELD>
<NAME>C</>
<TYPE>string>
<PHYSICAL>
<WIDTH>16</>
</>
</>
</>
</>
</>'
ERROR - $'dss: "bad.dss", line 10: <FLAT><FIELD><FIELD><FIELD><TYPE>: invalid input
dss: bad.dss: unknown method'
EXIT 1
EXEC -x bad.dss
INPUT bad.dss $'<METHOD>flat</>
<FLAT>
<FIELD>
</>'
ERROR - $'dss: "bad.dss", line 4: field name must be specified
dss: bad.dss: unknown method'
EXEC -x bad.dss
INPUT bad.dss $'<METHOD>flat</>
<FLAT>
<FIELD>
<NAME>A</>
</>'
ERROR - $'dss: "bad.dss", line 6: <FLAT>: no closing tag
dss: bad.dss: unknown method'
TEST 09 'schema info options'
EXEC -I $data -x flat,header:fixedvar -
OUTPUT - $'/*
* TEST dynamic interface
* converted by cpy2dss from copybook standard input
*/
#define TEST_RECORD(data) (_TEST_record_=(TEST_record_t*)DSSDATA(data))
typedef Cxvalue_t* (*TEST_get_f)(void*,int);
typedef struct TEST_field_s /* record field */
{
Cxvalue_t value; /* value (first for dynamic Q) */
void* field; /* static field info */
size_t off; /* record data offset */
size_t siz; /* record data size */
unsigned int serial; /* read serial number */
unsigned int keyed; /* keyed serial number */
} TEST_field_t;
typedef struct TEST_record_s /* current record info */
{
TEST_field_t* fields; /* fields (first for dynamic Q) */
TEST_get_f getf; /* getf (second for dynamic Q) */
} TEST_record_t;
static TEST_record_t* _TEST_record_;
#define TEST_TEST_FIELD_01 ((*_TEST_record_->getf)(_TEST_record_,0)->string.data)
#define TEST_TEST_FIELD_01_size ((*_TEST_record_->getf)(_TEST_record_,0)->string.size)
#define TEST_TEST_FIELD_02_SIZE ((*_TEST_record_->getf)(_TEST_record_,2)->number)
#define TEST_TEST_FIELD_02_DATA ((*_TEST_record_->getf)(_TEST_record_,3)->string.data)
#define TEST_TEST_FIELD_02_DATA_size ((*_TEST_record_->getf)(_TEST_record_,3)->string.size)
#define TEST_TEST_FIELD_03 ((*_TEST_record_->getf)(_TEST_record_,4)->string.data)
#define TEST_TEST_FIELD_03_size ((*_TEST_record_->getf)(_TEST_record_,4)->string.size)'
EXEC -I $data -x flat,prototype:fixedvar -
OUTPUT - $'TEST_FIELD_01||TEST_FIELD_02_SIZE|TEST_FIELD_02_DATA|TEST_FIELD_03'
EXEC -I $data -x flat,struct:fixedmax -
OUTPUT - $'/* converted by cpy2dss from copybook standard input */
struct _flat_TEST_s
{
/*01*/char TEST_FIELD_01[4];
struct
{
/*02*/char TEST_FIELD_02_SIZE[2];
/*02*/char TEST_FIELD_02_DATA[1024];
} TEST_FIELD_02;
/*01*/char TEST_FIELD_03[4];
};
/* sizeof(struct _flat_TEST_s)==1034 */'
EXEC -I $data -x flat,struct:fixedmaxvar -
OUTPUT - $'/* converted by cpy2dss from copybook standard input */
struct _flat_TEST_s
{
/*01*/char TEST_FIELD_01[4];
struct
{
/*02*/char TEST_FIELD_02_SIZE[2];
/*02*/char TEST_FIELD_02_DATA[16];
} TEST_FIELD_02;
/*01*/char TEST_FIELD_03[4];
char _delimiter_1; /* delimiter \'\\n\' */
};
/* sizeof(struct _flat_TEST_s)==27 */'
TEST 10 'quote + escape vs. delimiters and terminators'
EXEC -I $data -x qe-bin '{flatten q-txt.dss}' qe-bin.dat
OUTPUT - $'AB"|"D|wxyz
a"|"cd|HI""""K
LM\\O|p""""""s
""""""""""|\\\\\\\\'
COPY OUTPUT qe.dat
EXEC -I $data -x q-txt '{flatten q-txt.dss}' qe.dat
EXEC -I $data -x qe-bin '{flatten qa-txt.dss}' qe-bin.dat
OUTPUT - $'"AB|D"|"wxyz"
"a|cd"|"HI""K"
"LM\\O"|"p""""s"
""""""""""|"\\\\\\\\"'
COPY OUTPUT qe.dat
EXEC -I $data -x qa-txt '{flatten qa-txt.dss}' qe.dat
EXEC -I $data -x qe-bin '{flatten e-txt.dss}' qe-bin.dat
OUTPUT - $'AB\\|D|wxyz
a\\|cd|HI"K
LM\\\\O|p""s
""""|\\\\\\\\\\\\\\\\'
COPY OUTPUT qe.dat
EXEC -I $data -x e-txt '{flatten e-txt.dss}' qe.dat
EXEC -I $data -x qe-bin '{flatten qe-txt.dss}' qe-bin.dat
OUTPUT - $'AB\\|D|wxyz
a\\|cd|HI\\"K
LM\\\\O|p\\"\\"s
\\"\\"\\"\\"|\\\\\\\\\\\\\\\\'
COPY OUTPUT qe.dat
EXEC -I $data -x qe-txt '{flatten qe-txt.dss}' qe.dat
EXEC -I $data -x ff-bin '{flatten --emptyspace ff-txt.dss}' ff-bin.dat
OUTPUT - $'"00"|"\xff*"
"01"|"\xff*"
"02"|"\xff*"
"03"|"\xff*"
"04"|"\xff*"
"05"|"\xff*"
"06"|"\xff*"
"07"|"\xff*"
"08"|"\xff*"
"09"|"\xff*"
"10"|"\xff*"
"11"|"\xff*"
"12"|"\xff*"
"13"|"\xff*"
"14"|"\xff*"
"15"|"\xff*"
"16"|"\xff*"
"17"|"\xff*"
"18"|"\xff*"
"19"|"\xff*"
"20"|"\xff*"
"21"|"\xff*"
"22"|"\xff*"
"23"|"\xff*"
"24"|"\xff*"
"25"|"\xff*"
"26"|"\xff*"
"27"|"\xff*"
"28"|"\xff*"
"29"|"\xff*"
"30"|"\xff*"
"31"|"\xff*"
"32"|"\xff*"
"33"|"\xff*"
"34"|"\xff*"
"35"|"\xff*"
"36"|"\xff*"
"37"|"\xff*"
"38"|"\xff*"
"39"|"\xff*"
"40"|"\xff*"
"41"|"\xff*"
"42"|"\xff*"
"43"|"\xff*"
"44"|"\xff*"
"45"|"\xff*"
"46"|"\xff*"
"47"|"\xff*"
"48"|"\xff*"
"49"|"\xff*"
"50"|"\xff*"
"51"|"\xff*"
"52"|"\xff*"
"53"|"\xff*"
"54"|"\xff*"
"55"|"\xff*"
"56"|"\xff*"
"57"|"\xff*"
"58"|"\xff*"
"59"|"\xff*"
"60"|"\xff*"
"61"|"\xff*"
"62"|"\xff*"
"63"|"\xff*"
"64"|"\xff*"
"65"|"\xff*"
"66"|"\xff*"
"67"|"\xff*"
"68"|"\xff*"
"69"|"\xff*"
"70"|"\xff*"
"71"|"\xff*"
"72"|"\xff*"
"73"|"\xff*"
"74"|"\xff*"
"75"|"\xff*"
"76"|"\xff*"
"77"|"\xff*"
"78"|"\xff*"
"79"|"\xff*"
"80"|"\xff*"
"81"|"\xff*"
"82"|"\xff*"
"83"|"\xff*"
"84"|"\xff*"
"85"|"\xff*"
"86"|"\xff*"
"87"|"\xff*"
"88"|"\xff*"
"89"|"\xff*"
"90"|"\xff*"
"91"|"\xff*"
"92"|"\xff*"
"93"|"\xff*"
"94"|"\xff*"
"95"|"\xff*"
"96"|"\xff*"
"97"|"\xff*"
"98"|"\xff*"
"99"|"\xff*"'