Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/dsslib/flat/dss.tst
1810 views
# 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*"'