xref: /onnv-gate/usr/src/lib/libdhcpsvc/tests/specs/public.txt (revision 0:68f95e015346)
1#ident	"%Z%%M%	%I%	%E% SMI" mwc
2
3CDDL HEADER START
4
5The contents of this file are subject to the terms of the
6Common Development and Distribution License, Version 1.0 only
7(the "License").  You may not use this file except in compliance
8with the License.
9
10You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11or http://www.opensolaris.org/os/licensing.
12See the License for the specific language governing permissions
13and limitations under the License.
14
15When distributing Covered Code, include this CDDL HEADER in each
16file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17If applicable, add the following below this CDDL HEADER, with the
18fields enclosed by brackets "[]" replaced with your own identifying
19information: Portions Copyright [yyyy] [name of copyright owner]
20
21CDDL HEADER END
22
23		Enterprise: Public Layer Test Specification
24		===========================================
25
26ABSTRACT
27
28	This document describes a test specification intended to be used
29in the development of tests designed to validate the service provider
30layer API described in Section 2.2 of the Enterprise DHCP Service
31Architecture Specification (ARCH) [1]. The first test is a basic sanity
32test, designed to verify that the API works as designed when fed data
33in the correct form. The second test is a full test, which compliments
34the basic sanity test by providing cases which test the stability and
35MT-safeness of the API.
36
37TEST APPLICATION
38
39	Test suite(s) written to this specification should be run on
40every available public module on the reference platform of each of the
41supported architectures (sparcv8, sparcv9, IA32, IA64) for each build
42of the ON consolidation. See "Enterprise Reference platforms" [2] for
43more information.
44
45TEST PREPARATION
46
47	The packages SUNWdhc{df,db,dn} containing the public module(s)
48under test need to be installed in /usr/lib/inet/dhcp/svc on the machine
49under test. The data service(s) (if necessary) which hosts the data
50store must be configured and running. A data store container directory
51(location) within the data service must exist and be empty. The machine
52under test must have the appropriate authorization (root user) for
53accessing the hosting data service. Note that it is important to note
54whether the data service is hosted on the test machine, or whether the
55data service is hosted on a different machine and the machine under
56test is a client of that data service. Where the data service is hosted
57will have an affect on the test results, particularly performance.
58
59BASIC SANITY TEST
60
61	Description
62
63		This test validates the basic operation of service
64	provider layer API function calls when presented with valid
65	arguments in a valid run environment. It is implemented as a
66	multithreaded program running a single thread to exercise the API
67	referenced in Section 2.2 of ARCH [1]. This program should create
68	dhcptab and dhcp network containers within the data store, and
69	exercise the *_dt and *_dn calls to add, modify, and delete
70	multiple records. The result of the add, modify, and delete
71	operations must be validated between each operation. The program
72	should be written such that the initial condition described under
73	TEST PREPARATION is restored. Operations are PASS/FAIL, and must
74	be compared against a human-verified expect file.
75
76	Test Data
77
78	Item			Description		Application
79	====			===========		===========
80	<location>	Public module specific		status, list,
81			path name to container		open_dt,
82			directory (e.g. /var/dhcp	remove_dt,
83			for 'files' data store).	open_dn,
84							remove_dn
85
86	<Server IP>	System under test's IP		N/A
87			address.
88
89	dt records	As follows:			*_dt
90
91	SrootOpt s Vendor=SUNW.Ultra-1 SUNW.i86pc,1,ASCII,1,0
92	SrootIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,2,IP,1,1
93	SrootNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,3,ASCII,1,0
94	SrootPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,4,ASCII,1,0
95	SswapIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,5,IP,1,1
96	SswapPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,6,ASCII,1,0
97	SbootFIL s Vendor=SUNW.Ultra-1 SUNW.i86pc,7,ASCII,1,0
98	Stz      s Vendor=SUNW.Ultra-1 SUNW.i86pc,8,ASCII,1,0
99	SbootRS  s Vendor=SUNW.Ultra-1 SUNW.i86pc,9,NUMBER,2,1
100	SinstIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,10,IP,1,1
101	SinstNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,11,ASCII,1,0
102	SinstPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,12,ASCII,1,0
103	SsysidCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,13,ASCII,1,0
104	SjumpsCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,14,ASCII,1,0
105	Sterm    s Vendor=SUNW.Ultra-1 SUNW.i86pc,15,ASCII,1,0
106	Locale   m :UTCoffst=-18000:
107	Solaris  m :SrootIP4=129.148.174.27:SrootNM="atlantic": \
108	       :SinstIP4=129.148.174.27:SinstNM="atlantic": \
109	       :Sterm="xterm":BootSrvA=129.148.174.27:
110	sparc    m \
111:SrootPTH="/export/s28/solaris1of2.s28s_wos/latest/Solaris_8/Tools/Boot": \
112	       :SinstPTH="/export/s28/solaris1of2.s28s_wos/latest":
113	sun4u    m :Include=Solaris:Include=sparc:
114	i86pc    m :Include=Solaris:SbootFIL="/platform/i86pc/kernel/unix": \
115	           :SinstPTH="/export/s28/solaris1of2.s28x_wos/latest": \
116:SrootPTH="/export/s28/solaris1of2.s28x_wos/latest/Solaris_8/Tools/Boot":
117	SUNW.i86pc m :Include=i86pc:
118	SUNW.Ultra-1 m :SbootFIL="/platform/sun4u/kernel/sparcv9/unix": \
119	               :Include=sun4u:
120	172.21.0.0 m :Subnet=255.255.0.0:Router=172.21.0.2: \
121		     :Broadcst=172.21.255.255:
122	atlantic m :Include=Locale:Timeserv=129.148.174.27:LeaseTim=3600: \
123	           :LeaseNeg:Hostname:DNSdmain="snt.east.sun.com": \
124		   :DNSserv=172.21.0.1:
125	010800207E8A02 m :Impress=172.22.255.27:
126
127
128	172.21.0.0	Dhcp network container.		*_dn
129
130	dn records	~3000, as follows:		*_dn
131
132	00 00 172.21.0.6  <Server IP> 0 atlantic
133			.
134			.
135			.
136	00 00 172.21.12.6 <Server IP> 0 atlantic
137
138	Generic Data Store Status
139	=========================
140
141	Case #1	status:
142
143		Call function with <location>. PASS if DSVC_SUCCESS is
144	returned, FAIL otherwise. If this case fails, abort the test.
145
146	Case #2 version:
147
148		Call function. Version value returned must be one (1)
149	for PASS. If this case fails, abort the test.
150
151	Case #3 capability:
152
153		Call function. Compare returned capability against
154	confirmed capability known for the public module under test.
155	Match is PASS.
156
157	Case #4 list:
158
159		Call function with <location>. PASS if DSVC_NOENT is
160	returned, listppp is NULL, and count is set to 0. As part of
161	Test preparation, there should be *no* containers of any kind in
162	the underlying data service of the public module. If this case
163	fails, abort the test.
164
165	dhcptab Container API
166	=====================
167
168	Case #5 alloc_dtrec:
169
170		Call function, verify that a non-NULL dt_rec_t pointer
171	is returned. Free result with free_dtrec.
172
173	Case #6 open_dt:
174
175		Create a dhcptab at <location> specifying DSVC_CREATE |
176	DSVC_READ | DSVC_WRITE. Preserve handpp for use in the following
177	cases. PASS if DSVC_SUCCESS is returned, abort the test
178	otherwise.
179
180	Case #7 add_dt:
181
182		7.1. Initialize container.
183
184			Using the handle returned in case #6, add the
185		dhcptab test records to the dhcptab. Verify that the
186		dhcptab exists by calling list.
187
188		7.2. Attempt to add duplicate record.
189
190			Attempt to add the SbootRS symbol definition and
191		172.21.0.0 macro definition to the dhcptab container.
192		PASS if DSVC_EXISTS is returned in both cases.
193
194	Case #8 lookup_dt:
195
196		8.1. Verify case #7.
197
198			Using a count value of -1 and a "query" value
199		initialized by DSVC_QINIT (Figure 5 of ARCH[1]), verify
200		that the contents of the dhcptab container match the
201		test data. Note that the order of the records returned
202		may not be the same as the order in which they were
203		added in case #7.
204
205		8.2 Verify dhcptab container type.
206
207			8.2.1. Look for all records with a DT_QTYPE
208			value of "s". Verify that only the "s" type
209			records are returned.
210
211			8.2.2. Look for all records with a DT_QTYPE
212			value of "m". Verify that only the "m" type
213			records are returned.
214
215			8.2.3. Look for DT_QKEY of "atlantic". Verify
216			that only the macro "atlantic" is returned, and
217			the value is correct.
218
219			8.2.4. Look for DTQKEY of i86pc and not a
220			DT_QTYPE of "m". Verify that only the macro
221			"i86pc" is returned.
222
223	Case #9 modify_dt:
224
225		9.1 Modify dhcptab container records
226
227			9.1.1. Using lookup_dt to find the record with a
228			DT_QKEY of "Sterm", change the name of the
229			record from "Sterm" to "sTERM". Use lookup_dt to
230			verify that the original record has been
231			renamed.
232
233			9.1.2. Using lookup_dt to find the record with a
234			DT_QKEY of "Solaris", change the value portion
235			of the record to be:
236
237			:SrootIP4=129.148.174.27:SrootNM="atlantic": \
238			:SinstIP4=129.148.174.27:SinstNM="atlantic": \
239			:sTERM="sun-cmd":BootSrvA=129.148.174.27:
240
241			Using lookup_dt, reexecute the lookup and verify
242			that the value portion of the record has been
243			modified correctly.
244
245	Case #10 delete_dt:
246
247		Using lookup_dt to find the record with a DT_QKEY of
248	"SUNW.Ultra-1", delete this record. Verify using lookup_dt that
249	this record can no longer be found (DSVC_NOENT).
250
251	Case #11 close_dt:
252
253		Close the open instance of the dhcptab container. Verify
254	that close_dt returns DSVC_SUCCESS.
255
256	Case #12 remove_dt:
257
258		Remove the dhcptab container. Verify that it no longer
259	exists using list.
260
261	dhcp network Container API
262	==========================
263
264	Case #13 open_dn:
265
266		Using DSVC_CREATE | DSVC_READ | DSVC_WRITE, create a
267	dhcp network container (called <network address>). Preserve the
268	handle returned for later use in the following test cases. PASS
269	if DSVC_SUCCESS is returned, terminate the test otherwise.
270	Verify that the dhcp network container exists using list.
271
272	Case #14 add_dn:
273
274		14.1. Initialize container.
275
276			Using the handle returned in case #13, add the
277		dhcp network test records to the dhcp network container.
278		Verify that the dhcp network container exists by
279		calling list.
280
281		14.2. Attempt to add duplicate record.
282
283			Attempt to add the 172.21.0.254 client record
284		to the <network address> dhcp network container. PASS
285		if DSVC_EXISTS is returned.
286
287	Case #15 lookup_dn:
288
289		15.1. Verify case #14.
290
291			Using a "count" of -1 and a "query" value
292		initialized using DSVC_QINIT (Figure 5 of ARCH[1]),
293		verify that the contents of the <network address>
294		container match the test data. "records" should equal
295		the number of records added in case #14. Note that the
296		order of the records returned may not be the same as the
297		order in which they were added in case #14.
298
299		15.2. Verify <network address> dhcp network container
300		type.
301
302			15.2.1. Look for all records with a DN_QCIP of
303			<network address>+100. Verify that only one
304			record (with a cip of <network address>+100 is
305			returned.
306
307			15.2.2. Look for all records with a DN_QMACRO
308			value of "atlantic". Verify that all records
309			are returned ("records" == 3000). Note that the
310			records returned may not be in the same order in
311			which they were added as part of case #14.
312
313	Case #16 modify_dn:
314
315		16.1. Using lookup_dn to find the record with a DN_QCIP
316		of <network address>+10, change the lease field to
317		1/1/2000 and the flags field to MANUAL. Use lookup_dn to
318		verify that the original record has been changed.
319
320		16.2. Using lookup_dn to find the record with a
321		DN_QFLAGS of MANUAL. Change the dn_cid field to
322		01080020FFFFFF, dn_flags field to MANUAL+AUTOMATIC,
323		dn_sip field to 172.23.0.77, dn_lease field to -1,
324		dn_macro field to "happy", and the dn_comment field to
325		"This is a test". Use lookup_dn to verify that the
326		original record has been changed correctly.
327
328	Case #17 delete_dn:
329
330		Using lookup_dn to find the record with a DN_QCIP of
331	<network address>+101, delete this record. Verify using
332	lookup_dn that this record can no longer be found.
333
334	Case #18 close_dn:
335
336		Close the open instance of the dhcp network container
337	<network address>. Verify that close_dn returns DSVC_SUCCESS.
338
339	Case #19 remove_dn:
340
341		Remove the dhcp network container <network address>.
342	Verify that the container is in fact gone using list.
343
344FULL TEST
345
346	Description
347
348		This suite verifies that the dhcptab and dhcp network
349	table API function calls respond correctly when presented with
350	incorrect data. It also validates the MT-safeness of the API.
351	The test suite should allow any number of concurrent threads or
352	test suite processes to be invoked. The data must remain
353	consistent as measured at certain points during the test in
354	order for the test to be considered to have passed successfully.
355
356	Test Data
357
358	Item			Description		Application
359	====			===========		===========
360	<location>	Public module specific		status, list,
361			path name to container		open_dt,
362			directory (e.g. /var/dhcp	remove_dt,
363			for 'files' data store).	open_dn,
364							remove_dn
365
366	<Server IP>	System under test's IP		N/A
367			address.
368
369	dt records	As follows:			*_dt
370
371	SrootOpt s Vendor=SUNW.Ultra-1 SUNW.i86pc,1,ASCII,1,0
372	SrootIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,2,IP,1,1
373	SrootNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,3,ASCII,1,0
374	SrootPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,4,ASCII,1,0
375	SswapIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,5,IP,1,1
376	SswapPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,6,ASCII,1,0
377	SbootFIL s Vendor=SUNW.Ultra-1 SUNW.i86pc,7,ASCII,1,0
378	Stz      s Vendor=SUNW.Ultra-1 SUNW.i86pc,8,ASCII,1,0
379	SbootRS  s Vendor=SUNW.Ultra-1 SUNW.i86pc,9,NUMBER,2,1
380	SinstIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,10,IP,1,1
381	SinstNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,11,ASCII,1,0
382	SinstPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,12,ASCII,1,0
383	SsysidCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,13,ASCII,1,0
384	SjumpsCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,14,ASCII,1,0
385	Sterm    s Vendor=SUNW.Ultra-1 SUNW.i86pc,15,ASCII,1,0
386	Locale   m :UTCoffst=-18000:
387	Solaris  m :SrootIP4=129.148.174.27:SrootNM="atlantic": \
388	       :SinstIP4=129.148.174.27:SinstNM="atlantic": \
389	       :Sterm="xterm":BootSrvA=129.148.174.27:
390	sparc    m \
391:SrootPTH="/export/s28/solaris1of2.s28s_wos/latest/Solaris_8/Tools/Boot": \
392	       :SinstPTH="/export/s28/solaris1of2.s28s_wos/latest":
393	sun4u    m :Include=Solaris:Include=sparc:
394	i86pc    m :Include=Solaris:SbootFIL="/platform/i86pc/kernel/unix": \
395	           :SinstPTH="/export/s28/solaris1of2.s28x_wos/latest": \
396:SrootPTH="/export/s28/solaris1of2.s28x_wos/latest/Solaris_8/Tools/Boot":
397	SUNW.i86pc m :Include=i86pc:
398	SUNW.Ultra-1 m :SbootFIL="/platform/sun4u/kernel/sparcv9/unix": \
399	               :Include=sun4u:
400	172.21.0.0 m :Subnet=255.255.0.0:Router=172.21.0.2: \
401		     :Broadcst=172.21.255.255:
402	atlantic m :Include=Locale:Timeserv=129.148.174.27:LeaseTim=3600: \
403	           :LeaseNeg:Hostname:DNSdmain="snt.east.sun.com": \
404		   :DNSserv=172.21.0.1:
405	010800207E8A02 m :Impress=172.22.255.27:
406
407
408	172.21.0.0	Dhcp network container.		*_dn
409
410	dn records	~3000, as follows:		*_dn
411
412	00 00 172.21.0.6  <Server IP> 0 atlantic
413			.
414			.
415			.
416	00 00 172.21.12.6 <Server IP> 0 atlantic
417
418	Case #1:
419		Disable the underlying data service. How this is done
420	is data service-dependent. Call each of status, version,
421	capability, list, open_dt, remove_dt, open_dn, and remove_dn.
422	PASS if the function returns DSVC_INTERNAL or
423	DSVC_MODULE_ERROR. What is returned is data service-specific. If
424	this test FAILs (e.g. a function returns DSVC_SUCCESS, terminate
425	the test run.
426
427	Cleanup: Reenable the underlying data service.
428
429	dhcptab Container API
430	=====================
431
432	Case #2 list_dt:
433
434		2.1. Invalid Location
435
436			Call function with an invalid <location>. PASS
437		if DSVC_INVAL is returned. If this case fails, abort
438		the test.
439
440		2.2. No container
441
442			Verify that list returns DSVC_NOENT.
443
444	Case #3 open_dt:
445
446		3.1. No container
447
448			Call function with DSVC_READ | DSVC_WRITE.
449		Verify that  DSVC_NOENT is returned.
450
451		3.2. NON_BLOCK
452
453			Using DSVC_CREATE | DSVC_READ | DSVC_WRITE,
454		call open_dt to create a dhcptab container. Call
455		close_dt to close the handle. Call open_dt with
456		DSVC_READ | DSVC_WRITE | DSVC_NONBLOCK. Depending on
457		whether the public module supports it (see module doc),
458		the function should return either DSVC_SUCCESS or
459		DSVC_UNSUPPORTED. If NON_BLOCK access is supported,
460		endeavor to make the underlying service temporarily
461		unavailable (e.g: NIS+: checkpoint the database). Call
462		open_dt again with the same flags (read, write,
463		nonblock). open_dt must fail and return DSVC_BUSY.
464
465		Cleanup: re-enable underlying service, close the open
466		handle.
467
468		3.3. Container exists
469
470			Call function with DSVC_CREATE | DSVC_READ |
471		DSVC_WRITE. Verify that the function returns
472		DSVC_EXISTS.
473
474		Cleanup: remove the dhcptab container using remove_dt.
475
476	Case #4 add_dt:
477
478		Create and load the dhcptab as per Case #6 and Case #7.1
479	of the Basic Sanity Test.
480
481		4.1. Record exists
482
483			Attempt to add a test dhcptab record to the
484		dhcptab. Verify that DSVC_EXISTS is returned.
485
486		4.2. Busy
487
488			Close open handle with close_dt. Reopen with
489		DSVC_NONBLOCK specified. If nonblocking semantics are
490		supported, then make the data service busy through the
491		use of a data service-specific technique and attempt to
492		add an additional dhcptab record. Verify that DSVC_BUSY
493		is returned. Remove the data service busy condition and
494		reattempt the add operation. Verify that DSVC_SUCCESS is
495		returned. close_dt the container.
496
497		4.3. Read only
498
499			Close any open handles. Reopen the dhcptab with
500		DSVC_READ access only. If success is returned, attempt
501		to add a new record to the dhcptab. Verify that
502		DSVC_ACCESS is returned. close_dt the handle. Note that
503		some data store modules may return DSVC_UNSUPPORTED for
504		read-only access.
505
506		Cleanup: Close open handles, remove the dhcptab using
507		remove_dt.
508
509	Case #5 lookup_dt:
510
511		Create and load the dhcptab as per Case #6 and Case #7.1
512	of the Basic Sanity Test.
513
514		5.1. Record does not exist.
515
516			Produce a dhcptab container query that would not
517		be satisfied by the test data. Verify that DSVC_SUCCESS
518		is returned, and "records" is 0.
519
520		5.2. Busy
521
522			Close dhcptab handle with close_dt. Reopen with
523		DSVC_NONBLOCK specified. IF DSVC_SUCCESS is returned
524		(Nonblocking access is supported), using a data
525		service-specific technique for making the service busy,
526		attempt to perform a valid lookup of a dhcptab record.
527		Verify that DSVC_BUSY is returned. Remove the busy
528		condition, and reattempt the lookup. Verify that
529		DSVC_SUCCESS is returned, and that the data returned is
530		valid. close_dt the handle.
531
532		5.3. Write only
533
534			Reopen the dhcptab container with DSVC_WRITE
535		access only. If success is returned, attempt to perform
536		lookup_dt's using any syntactically legal query for the
537		dhcptab. Verify that DSVC_ACCESS is returned. close_dt
538		the handle.
539
540		5.4. Multiple matching records
541
542			Reopen the dhcptab container as per case
543		#6 and case #7.1 of the Basic Sanity Test. Using
544		modify_dt, change the dt_key for the SrootOpt symbol
545		such that the key value is now sun4u. Form a query which
546		simply specifies a DT_QKEY value of "sun4u". Verify that
547		exactly two records are returned, and that there values
548		are what is expected (one a macro, the other a symbol,
549		with the appropriate values).
550
551		Cleanup: Remove the dhcptab container using remove_dt.
552
553	Case #6 modify_dt:
554
555		Create and load the dhcptab container as per Case #6
556	and Case #7.1 of the Basic Sanity Test.
557
558		6.1. Unknown record
559
560			Fabricate dt_rec_t elements initialized with
561		data known not to exist in the dhcptab. Attempt to
562		modify these elements. Verify that DSVC_NOENT is
563		returned.
564
565		6.2. Update Collision #1
566
567			Use lookup_dt to find a valid dhcptab record.
568		Change the signature on the resultant dt_rec_t. Attempt
569		to modify the record. Verify that DSVC_COLLISION is
570		returned.
571
572		6.3. Update Collision #2
573
574			Use lookup_dt to find a valid dhcptab record.
575		Attempt to rename the record to one that already exists
576		(dt_key + dt_type). Verify that DSVC_EXISTS is returned.
577
578		6.4. Busy
579
580			Close the dhcptab with close_dt. Reopen with
581		DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned (it
582		is supported), acquire a valid dhcptab record using
583		lookup_dt. Using a data service specific technique for
584		making the service busy, attempt to modify the value
585		(non-key fields) of the record. Verify that DSVC_BUSY is
586		returned. Remove the busy condition, and reattempt the
587		modify. Verify that DSVC_SUCCESS is returned.
588		Reacquire the record. Verify that the contents have been
589		suitably updated. close_dt the container.
590
591		6.5. Read only
592
593			Reopen the dhcptab with DSVC_READ access only.
594		If success is returned, locate a valid container record
595		using the appropriate query to lookup_dt. Modify the
596		contents of the record. Attempt to commit the modify to
597		the dhcptab. Verify that DSVC_ACCESS is returned.
598		close_dt the dhcptab handle.
599
600		Cleanup: Remove the dhcptab using remove_dt.
601
602	Case #7 free_dtrec_list:
603
604		This function should be used to release the results of
605	lookup_dt calls. Its operation must be validated by running this
606	test under bcheck with -memuse, and ensuring that no free blocks
607	remain after exit. Note that the test must be written with care
608	to make this case useful (free any allocated memory when it is
609	no longer needed).
610
611	Case #8 delete_dt:
612
613		Create and load the dhcptab container as per Case #6 and
614	Case #7.1 of the Basic Sanity Test.
615
616		8.1 Unknown record
617
618			Fabricate dt_rec_t containing a record known
619		not to exist in the dhcptab. Attempt to delete the
620		record. Verify that DSVC_NOENT is returned.
621
622		8.2 Busy
623
624			Close the dhcptab with close_dt. Reopen with
625		DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned,
626		acquire a valid dhcptab container record using
627		lookup_dt. Using a data service specific technique for
628		making the service busy, attempt to delete the record.
629		Verify that DSVC_BUSY is returned. Remove the busy
630		condition, and reattempt the delete. Verify that
631		DSVC_SUCCESS is returned. Attempt to reacquire the
632		record. Verify that the record has in fact been deleted.
633		Close the dhcptab using close_dt.
634
635		8.3 Read only
636
637			Reopen the dhcptab container with DSVC_READ
638		access only. If success is returned, locate a valid
639		dhcptab record using an appropriate query to lookup_dt.
640		Attempt to delete the record. Verify that DSVC_ACCESS is
641		returned. Close the dhcptab using close_dt.
642
643		Cleanup: Remove the dhcptab using remove_dt.
644
645	Case #9 close_dt:
646
647		Verify that this function handles nonblocking semantics
648	correctly. Create a dhcptab as per case #6 of the Basic Sanity
649	Test, with the exception that DSVC_NONBLOCK is specified. If
650	nonblocking mode is supported, then using a data service
651	specific technique for making the service busy, attempt to close
652	the dhcptab handle returned by open_dt. Verify that DSVC_BUSY
653	is returned. Remove the busy condition, and reattempt the
654	close_dt. Verify that DSVC_SUCCESS is returned.
655
656	Cleanup: Remove the dhcptab container using remove_dt.
657
658	Case #10 remove_dt:
659
660		Verify that this function handles nonblocking semantics
661	correctly. Create a dhcptab container as per Case #6 of the Basic
662	Sanity Test. Close open handle using close_dt. Reopen with
663	DSVC_NONBLOCK specified. If nonblocking mode is supported, using
664	a data service specific technique for making the service busy,
665	attempt to remove the dhcptab container. Verify that DSVC_BUSY is
666	returned. Remove the busy condition, and reattempt the remove.
667	Verify that the dhcptab container is removed using list and that
668	the function returns DSVC_SUCCESS.
669
670	Cleanup: Close the open handle using close_dt (ignore result).
671
672	dhcp network Container API
673	==========================
674
675	Case #11 list_dn:
676
677		11.1. Invalid Location
678
679			Call function with an invalid <location>. PASS
680		if DSVC_INVAL is returned. If this case fails, abort
681		the test.
682
683		11.2. No container
684
685			Verify that list returns DSVC_NOENT.
686
687	Case #12 open_dn:
688
689		12.1. No container
690
691			Call function with DSVC_READ | DSVC_WRITE and
692		<network address>. Verify that DSVC_NOENT is returned.
693
694		12.2. NON_BLOCK
695
696			Using the flag values of DSVC_CREATE |
697		DSVC_READ | DSVC_WRITE | DSVC_NONBLOCK, the function
698		to create a dhcp network container called <network
699		address>. Depending on whether the public module
700		supports nonblocking semantics (see module doc),
701		the function should return either DSVC_SUCCESS or
702		DSVC_UNSUPPORTED. If NON_BLOCK access is supported,
703		endeavor to make the underlying service temporarily
704		unavailable (e.g: NIS+: checkpoint the database). Call
705		open_dn again with the same flags (read, write,
706		nonblock). open_dn must fail and return DSVC_BUSY.
707
708		Cleanup: re-enable underlying service, close the open
709		handle.
710
711		12.3. Container exists.
712
713			Using the flag values DSVC_CREATE | DSVC_READ |
714		DSVC_WRITE, attempt to open <network address>. Verify
715		that the function returns DSVC_EXISTS.
716
717		Cleanup: Remove the <network address> dhcp network
718		container using remove_dn.
719
720	Case #13 add_dn:
721
722		Create and load the <network address> dhcp network
723	container as per Case #13 and Case #14.1 of the Basic Sanity
724	Test.
725
726		13.1. Record exists
727
728			Attempt to add a test dhcp network record to
729		the <network address> dhcp network container. Verify
730		that DSVC_EXISTS is returned.
731
732		13.2. Busy
733
734			Close open handle with close_dn. Reopen with
735		DSVC_NONBLOCK specified. If nonblocking semantics are
736		supported, then make the data service busy through the
737		use of a data service-specific technique and attempt to
738		add an additional dhcp network record. Verify that
739		DSVC_BUSY is returned. Remove the data service busy
740		condition and reattempt the add operation. Verify that
741		DSVC_SUCCESS is returned. close_dn the container.
742
743		13.3. Read only
744
745			Close any open handles. Reopen the <network
746		address> dhcp network container with DSVC_READ access
747		only. If success is returned, attempt to add a new
748		record to the dhcp network container. Verify that
749		DSVC_ACCESS is returned. close_dn the handle. Note that
750		some data store modules may return DSVC_UNSUPPORTED for
751		read-only access.
752
753		Cleanup: Close open handles, remove the <network
754		address> dhcp network container using remove_dn.
755
756	Case #14 lookup_dn:
757
758		Create and load the <network address> dhcp network
759	container as per Case #13 and Case #14.1 of the Basic Sanity
760	Test.
761
762		14.1. Record does not exist.
763
764			Produce a dhcp network container query that
765		would not be satisfied by the test data. Verify that
766		DSVC_SUCCESS is returned, and "records" is 0.
767
768		14.2. Busy
769
770			Close the <network address> dhcp network handle
771		with close_dn. Reopen with DSVC_NONBLOCK specified. If
772		DSVC_SUCCESS is returned (Nonblocking access is
773		supported), using a data service-specific technique for
774		making the service busy, attempt to perform a valid
775		lookup of a dhcp network record. Verify that DSVC_BUSY
776		is returned. Remove the busy condition, and reattempt
777		the lookup. Verify that DSVC_SUCCESS is returned, and
778		that the data returned is valid. close_dn the handle.
779
780		14.3. Write only
781
782			Reopen the dhcp network container with DSVC_WRITE
783		access only. If success is returned, attempt to perform
784		lookup_dn's using any syntactically legal query for the
785		<network address> dhcp network container. Verify that
786		DSVC_ACCESS is returned. close_dn the handle.
787
788		14.4. Multiple matching records
789
790			Reopen the dhcp network container as per case
791		#13 and case #14.1 of the Basic Sanity Test. Using
792		modify_dn, change the dn_cid fields for records <network
793		address>+1 through <network address>+217 to 01BADDCAFE.
794		Form a query which simply specifies a DN_QCID of
795		01BADDCAFE. Confirm that exactly 216 records are
796		returned, and that their CIP range is correct.
797
798		Cleanup: Remove the <network address> dhcp network
799		container using remove_dn.
800
801	Case #15 modify_dn:
802
803		Create and load the <network address> dhcp network
804	container as per Case #13 and Case #14.1 of the Basic Sanity
805	Test.
806
807		15.1. Unknown record
808
809			Fabricate dn_rec_t elements initialized with
810		data known not to exist in the dhcp network container.
811		Attempt to modify these elements. Verify that DSVC_NOENT
812		is returned.
813
814		15.2. Update Collision #1
815
816			Use lookup_dn to find a valid dhcp network record.
817		Change the signature on the resultant dn_rec_t. Attempt
818		to modify the record. Verify that DSVC_COLLISION is
819		returned.
820
821		15.3. Update Collision #2
822
823			Use lookup_dn to find a valid dhcp network record.
824		Attempt to rename the record to one that already exists
825		(dn_cid, dn_flags, dn_cip, dn_sip, dn_lease, dn_macro).
826		Verify that DSVC_EXISTS is returned.
827
828		15.4. Busy
829
830			Close the dhcp network container with close_dn.
831		Reopen with DSVC_NONBLOCK specified. If DSVC_SUCCESS is
832		returned (nonblocking semantics are supported), acquire
833		a valid dhcp network record using lookup_dn. Using a
834		data service specific technique for making the service
835		busy, attempt to modify the value (non-key fields) of
836		the record. Verify that DSVC_BUSY is returned. Remove
837		the busy condition, and reattempt the modify. Verify
838		that DSVC_SUCCESS is returned. Reacquire the record.
839		Verify that the contents have been suitably updated.
840		close_dn the container.
841
842		15.5. Read only
843
844			Reopen the dhcp network container with DSVC_READ
845		access only. If success is returned, locate a valid
846		container record using the appropriate query to
847		lookup_dn. Modify the contents of the record. Attempt
848		to commit the modify to the dhcp network container.
849		Verify that DSVC_ACCESS is returned. close_dn the
850		dhcp network container handle.
851
852		Cleanup: Remove the dhcp network container using
853		remove_dn.
854
855	Case #16 free_dnrec_list:
856
857		This function should be used to release the results of
858	lookup_dn calls. Its operation must be validated by running this
859	test under bcheck with -memuse, and ensuring that no free blocks
860	remain after exit. Note that the test must be written with care
861	to make this case useful (free any allocated memory when it is
862	no longer needed).
863
864	Case #17 delete_dn:
865
866		Create and load the <network address> dhcp network
867	container as per Case #13 and Case #14.1 of the Basic Sanity
868	Test.
869
870		17.1 Unknown record
871
872			Fabricate dn_rec_t containing a record known
873		not to exist in the dhcp network container. Attempt
874		to delete the record. Verify that DSVC_NOENT is returned.
875
876		17.2 Busy
877
878			Close the dhcp network container with close_dn.
879		Reopen with DSVC_NONBLOCK specified. If DSVC_SUCCESS is
880		returned, acquire a valid dhcp network container record
881		using lookup_dn. Using a data service specific technique
882		for making the service busy, attempt to delete the record.
883		Verify that DSVC_BUSY is returned. Remove the busy
884		condition, and reattempt the delete. Verify that
885		DSVC_SUCCESS is returned. Attempt to reacquire the
886		record. Verify that the record has in fact been deleted.
887		Close the dhcp network container using close_dn.
888
889		17.3 Read only
890
891			Reopen the dhcp network container with DSVC_READ
892		access only. If success is returned, locate a valid
893		dhcp network record using an appropriate query to
894		lookup_dn. Attempt to delete the record. Verify that
895		DSVC_ACCESS is returned. Close the dhcp network
896		container using close_dn.
897
898		Cleanup: Remove the dhcp network container using
899		remove_dn.
900
901	Case #18 close_dn:
902
903		Verify that this function handles nonblocking semantics
904	correctly. Create the <network address> dhcp network container
905	as per case #13 of the Basic Sanity Test, with the exception
906	that DSVC_NONBLOCK is specified. If nonblocking mode is
907	supported, then using a data service specific technique for
908	making the service busy, attempt to close the dhcp network
909	handle returned by open_dn. Verify that DSVC_BUSY is returned.
910	Remove the busy condition, and reattempt the close_dn. Verify
911	that DSVC_SUCCESS is returned.
912
913	Cleanup: Remove the dhcp network container using remove_dn.
914
915	Case #19 remove_dn:
916
917		Verify that this function handles nonblocking semantics
918	correctly. Create the <network address> dhcp network container
919	as per Case #13 of the Basic Sanity Test, with the exception
920	that DSVC_NONBLOCK is specified. If nonblocking mode is
921	supported, using a data service specific technique for making
922	the service busy, attempt to remove the dhcp network container.
923	Verify that DSVC_BUSY is returned. Remove the busy condition,
924	and reattempt the remove. Verify that the <network address> dhcp
925	network container is removed using list and that the function
926	returns DSVC_SUCCESS.
927
928	Cleanup: Close the open handle using close_dn (ignore result).
929
930	Case #20 Multi-access stress
931
932		Public layer modules are not required to manage reference
933	counts for open instances. So while individual handles are
934	considered to be MT-safe (and parallel access to containers is
935	suitably protected), an application using the service provider
936	layer API must synchronize close and/or container remove
937	operations among threads such that no threads hold handles to a
938	container after the handle has been closed or the container has
939	been removed.
940
941		This case assumes a test which is multi-threaded, and
942	can run the following test using from 1 to THREADS threads. The
943	test can also be run in multiple concurrent processes.
944
945		The goal of this test is to ensure that the API is
946	MT-safe with respect to the containers and the records contained
947	within those containers. This goal is accomplished by verifying
948	that the end result of the test is consistent.
949
950	Tunable default values:
951
952		PROCESSES: 20
953		THREADS: 20
954
955		20.1 The dhcptab container test
956
957			20.1.1 open_dt
958
959				Create a dhcptab using DSVC_CREATE |
960			DSVC_READ | DSVC_WRITE. If DSVC_EXISTS is
961			returned, retry the open attempt w/o the
962			DSVC_CREATE flag. Log that this event occurred.
963			Handle will be used for balance of test. If any
964			other error occurs, terminate the test as
965			failed.
966
967			20.1.2 add_dt
968
969				Add the test data records to the dhcptab
970			container. If DSVC_EXISTS is returned, skip that
971			record, and continue attempting to add the other
972			records. Log that this event occurred. If any
973			other error occurs, terminate the test as
974			failed.
975
976			20.1.3 lookup_dt
977
978				Using DT_QKEY of "atlantic" and DT_QTYPE
979			of "m", find the atlantic record. Compare its
980			value against the test data. If it has
981			changed, then output a message to this affect.
982			If any error occurs, terminate the test as failed.
983
984			20.1.4 modify_dt
985
986				Using the results of 20.1.3, change the
987			record as follows. If it is no different from
988			the test data, change the value to:
989
990		:Timeserv=129.148.174.28:LeaseTim=86400: \
991		:Hostname:DNSdmain="east.sun.com":DNSserv=172.23.3.3:
992
993				If it doesn't match the test data
994			value, change the LeaseTim by incrementing it by
995			one. Attempt to update the record. If it fails
996			with DSVC_COLLISION, retry 20.1.3 and 20.1.4 for
997			three attempts. Log message if modify was
998			unsuccessful. If any other error occurs,
999			terminate the test as failed.
1000
1001			20.1.5 delete_dt
1002
1003				Use lookup_dt to find a DT_QKEY of
1004			"SjumpsCF" and a  DT_QTYPE of "s". If it does
1005			not exist, log a message. If it does exist,
1006			attempt to delete it. If DSVC_NOENT is returned,
1007			log a message.
1008
1009			20.1.6 close_dt
1010
1011				Use close_dt to close the open handle.
1012			If DSVC_NOENT is returned, log a message.
1013
1014			20.1.7 epilogue
1015
1016				Compare the resultant dhcptab container
1017			to the test data. The only differences should be
1018			a changed value of the atlantic macro as
1019			expected from 20.1.4 and the SjumpsCF symbol
1020			should be removed. Any other inconsistency means
1021			the test has failed.
1022
1023			Clean up: Remove the dhcptab container.
1024
1025		20.2 The dhcp network table container test
1026
1027			20.2.1 open_dn
1028
1029				Create a <network address> dhcp network
1030			table using DSVC_CREATE | DSVC_READ | DSVC_WRITE.
1031			If DSVC_EXISTS is returned, retry the open
1032			attempt w/o the DSVC_CREATE flag. Log that this
1033			event occurred. Handle will be used for balance
1034			of test. If any other error occurs, terminate
1035			the test as failed.
1036
1037			20.2.2 add_dn
1038
1039				Add the test data records to the dhcp
1040			network table container. If DSVC_EXISTS is
1041			returned, skip that record, and continue
1042			attempting to add the other records. Log that
1043			this event occurred. If any other error occurs,
1044			terminate the test as failed.
1045
1046			20.2.3 lookup_dn
1047
1048				Find the DN_QCIP of <network address>+102
1049			record. Compare its value against the test data.
1050			If it has changed, then output a message to this
1051			affect. If any error occurs, terminate the test
1052			as failed.
1053
1054			20.2.4 modify_dn
1055
1056				Using the results of 20.2.3, change the
1057			record as follows. If it is no different from
1058			the test data, change the value to:
1059
106001DEADBEEF 03 <network address>+102 172.23.3.3 941619403 Solaris
1061
1062				If it doesn't match the test data
1063			value, change dn_lease by incrementing it by
1064			one. Attempt to update the record. If it fails
1065			with DSVC_COLLISION, retry 20.2.3 and 20.2.4 for
1066			three attempts. Log message if modify was
1067			unsuccessful.  If any other error occurs,
1068			terminate the test as failed.
1069
1070			20.2.5 delete_dn
1071
1072				Use lookup_dn to find a DN_QCIP of
1073			<network address>+1001. If it does not exist,
1074			log a message. If it does exist, attempt to
1075			delete it. If DSVC_NOENT is returned, log a
1076			message.
1077
1078			20.2.6 close_dn
1079
1080				Use close_dn to close the open handle.
1081			If DSVC_NOENT is returned, log a message.
1082
1083			20.2.7 epilogue
1084
1085				The <network address> dhcp network
1086			container should be consistent at the end of
1087			a test run. The only differences should be a
1088			changed value of the <network address>+102
1089			record with the value as per 20.2.4 and the
1090			lease time potentially incremented, as well as
1091			the <network address>+1001 record missing.
1092			Any other inconsistency means the test has
1093			failed.
1094
1095			Cleanup: remove <network address> dhcp network
1096		container.
1097
1098		20.3 Multi-process run
1099
1100			Run 20.1 and 20.2 in PROCESSES separate
1101		processes.
1102
1103		20.4 Multi-threaded run, single process
1104
1105			Run 20.1 and 20.2 in THREADS separate threads
1106		within a single process.
1107
1108		20.5 Multi-process, Multi-threaded run
1109
1110			Run 20.1 and 20.2 in PROCESSES separate
1111		processes each spawning THREADS separate threads.
1112
1113	Case #21 Capacity
1114
1115		This test case endeavors to probe the stability and the
1116	performance of the public module implementation when:
1117
1118		a) The data storage containers are filled to capacity.
1119
1120		b) The data storage containers are overfilled.
1121
1122		Note that while the number of records within a dhcptab
1123	container could be infinite, the number of records within a dhcp
1124	network container is bounded by the number of possible IP
1125	addresses within the network represented by the container. If a
1126	class A network is represented, there can be up to 16,777,215
1127	possible records. The total number of records supported by a
1128	public module (with some overhead for container information) is
1129	the upper bound. That total number could be influenced by
1130	settings in the underlying hosting data service, or by the
1131	available memory or disk resources of the machine under test.
1132	Since record sizes for dhcptab and dhcp network containers
1133	differ, discovering the maximum number of possible records
1134	requires some dynamic experimentation by the test itself.
1135
1136		21.1 Initialization
1137
1138			Call capability. The max number of possible
1139		records for the environment under test will be contained
1140		within the returned structure as will some estimate of
1141		the operations per second claimed by the public module
1142		in the run environment. A dhcptab will be created with
1143		contains 1/3 of the maximum number of records. One or
1144		more dhcp network containers will be created to contain
1145		the balance of the records. A multithreaded program can
1146		create the containers and load them with single threads,
1147		one for each container. A consistent series of records
1148		must be added to the dhcptab (monotonically increasing
1149		symbol / macro records created, each with unique value
1150		portions which could be calculated by the key fields of
1151		the record). dhcp network container records simply contain
1152		records unique by client IP address.
1153
1154		Initialization will stop when no more records can be
1155		added to the system (XXX - what sort of error code would
1156		be returned? DSVC_INTERNAL?). Operations per second
1157		must be measured during the initialization process to
1158		determine whether it is close to the advertised number
1159		(XXX - how could this be verified?).
1160
1161		21.2 Modify
1162
1163			For every existing dhcp network record, modify
1164		the lease time such that it is set to the number of
1165		modify operations done during this subcase (first one ==
1166		1, last 1+N). Measure operations per second during this
1167		process.
1168
1169		21.3 Add
1170
1171			Attempt to add a new dhcptab and a new dhcp
1172		network container(s) record. This operation should fail
1173		(XXX expected results?).
1174
1175		21.4 Lookup
1176
1177			Form a configured number of legal queries (TBD
1178		tunable) for the dhcptab and dhcp network container(s).
1179		Validate that the data returned is what is expected
1180		based upon knowledge of relationship between the record
1181		being searched for and the expected value based upon the
1182		search parameters. PASS if queries are successful.
1183		Measure operations per second during this process for
1184		comparison against advertised number.
1185
1186		21.5 Delete
1187
1188			Using lookup and delete, find and delete every
1189		single record added by the test. Confirm that the
1190		containers contain no records. Measure operations per
1191		second during this process for comparison against the
1192		advertised number.
1193
1194		Cleanup: Remove the containers.
1195
1196REFERENCES
1197
1198	[1] "Enterprise DHCP Service Architecture Specification", mwc,
1199	6/25/1999.
1200
1201	[2] "Enterprise Reference Hardware Platforms", mwc, 10/23/1999.
1202