public.txt revision 7c478bd95313f5f23a4c958a745db2134aa03244
#ident "%Z%%M% %I% %E% SMI" mwc
CDDL HEADER START
The contents of this file are subject to the terms of the
Common Development and Distribution License, Version 1.0 only
(the "License"). You may not use this file except in compliance
with the License.
You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
or http://www.opensolaris.org/os/licensing.
See the License for the specific language governing permissions
and limitations under the License.
When distributing Covered Code, include this CDDL HEADER in each
file and include the License file at usr/src/OPENSOLARIS.LICENSE.
If applicable, add the following below this CDDL HEADER, with the
fields enclosed by brackets "[]" replaced with your own identifying
information: Portions Copyright [yyyy] [name of copyright owner]
CDDL HEADER END
Enterprise: Public Layer Test Specification
===========================================
ABSTRACT
This document describes a test specification intended to be used
in the development of tests designed to validate the service provider
layer API described in Section 2.2 of the Enterprise DHCP Service
Architecture Specification (ARCH) [1]. The first test is a basic sanity
test, designed to verify that the API works as designed when fed data
in the correct form. The second test is a full test, which compliments
the basic sanity test by providing cases which test the stability and
MT-safeness of the API.
TEST APPLICATION
Test suite(s) written to this specification should be run on
every available public module on the reference platform of each of the
supported architectures (sparcv8, sparcv9, IA32, IA64) for each build
of the ON consolidation. See "Enterprise Reference platforms" [2] for
more information.
TEST PREPARATION
The packages SUNWdhc{df,db,dn} containing the public module(s)
under test need to be installed in /usr/lib/inet/dhcp/svc on the machine
under test. The data service(s) (if necessary) which hosts the data
store must be configured and running. A data store container directory
(location) within the data service must exist and be empty. The machine
under test must have the appropriate authorization (root user) for
accessing the hosting data service. Note that it is important to note
whether the data service is hosted on the test machine, or whether the
data service is hosted on a different machine and the machine under
test is a client of that data service. Where the data service is hosted
will have an affect on the test results, particularly performance.
BASIC SANITY TEST
Description
This test validates the basic operation of service
provider layer API function calls when presented with valid
arguments in a valid run environment. It is implemented as a
multithreaded program running a single thread to exercise the API
referenced in Section 2.2 of ARCH [1]. This program should create
dhcptab and dhcp network containers within the data store, and
exercise the *_dt and *_dn calls to add, modify, and delete
multiple records. The result of the add, modify, and delete
operations must be validated between each operation. The program
should be written such that the initial condition described under
TEST PREPARATION is restored. Operations are PASS/FAIL, and must
be compared against a human-verified expect file.
Test Data
Item Description Application
==== =========== ===========
<location> Public module specific status, list,
path name to container open_dt,
directory (e.g. /var/dhcp remove_dt,
for 'files' data store). open_dn,
remove_dn
<Server IP> System under test's IP N/A
address.
dt records As follows: *_dt
SrootOpt s Vendor=SUNW.Ultra-1 SUNW.i86pc,1,ASCII,1,0
SrootIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,2,IP,1,1
SrootNM s Vendor=SUNW.Ultra-1 SUNW.i86pc,3,ASCII,1,0
SrootPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,4,ASCII,1,0
SswapIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,5,IP,1,1
SswapPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,6,ASCII,1,0
SbootFIL s Vendor=SUNW.Ultra-1 SUNW.i86pc,7,ASCII,1,0
Stz s Vendor=SUNW.Ultra-1 SUNW.i86pc,8,ASCII,1,0
SbootRS s Vendor=SUNW.Ultra-1 SUNW.i86pc,9,NUMBER,2,1
SinstIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,10,IP,1,1
SinstNM s Vendor=SUNW.Ultra-1 SUNW.i86pc,11,ASCII,1,0
SinstPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,12,ASCII,1,0
SsysidCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,13,ASCII,1,0
SjumpsCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,14,ASCII,1,0
Sterm s Vendor=SUNW.Ultra-1 SUNW.i86pc,15,ASCII,1,0
Locale m :UTCoffst=-18000:
Solaris m :SrootIP4=129.148.174.27:SrootNM="atlantic": \
:SinstIP4=129.148.174.27:SinstNM="atlantic": \
:Sterm="xterm":BootSrvA=129.148.174.27:
sparc m \
:SrootPTH="/export/s28/solaris1of2.s28s_wos/latest/Solaris_8/Tools/Boot": \
:SinstPTH="/export/s28/solaris1of2.s28s_wos/latest":
sun4u m :Include=Solaris:Include=sparc:
i86pc m :Include=Solaris:SbootFIL="/platform/i86pc/kernel/unix": \
:SinstPTH="/export/s28/solaris1of2.s28x_wos/latest": \
:SrootPTH="/export/s28/solaris1of2.s28x_wos/latest/Solaris_8/Tools/Boot":
SUNW.i86pc m :Include=i86pc:
SUNW.Ultra-1 m :SbootFIL="/platform/sun4u/kernel/sparcv9/unix": \
:Include=sun4u:
172.21.0.0 m :Subnet=255.255.0.0:Router=172.21.0.2: \
:Broadcst=172.21.255.255:
atlantic m :Include=Locale:Timeserv=129.148.174.27:LeaseTim=3600: \
:LeaseNeg:Hostname:DNSdmain="snt.east.sun.com": \
:DNSserv=172.21.0.1:
010800207E8A02 m :Impress=172.22.255.27:
172.21.0.0 Dhcp network container. *_dn
dn records ~3000, as follows: *_dn
00 00 172.21.0.6 <Server IP> 0 atlantic
.
.
.
00 00 172.21.12.6 <Server IP> 0 atlantic
Generic Data Store Status
=========================
Case #1 status:
Call function with <location>. PASS if DSVC_SUCCESS is
returned, FAIL otherwise. If this case fails, abort the test.
Case #2 version:
Call function. Version value returned must be one (1)
for PASS. If this case fails, abort the test.
Case #3 capability:
Call function. Compare returned capability against
confirmed capability known for the public module under test.
Match is PASS.
Case #4 list:
Call function with <location>. PASS if DSVC_NOENT is
returned, listppp is NULL, and count is set to 0. As part of
Test preparation, there should be *no* containers of any kind in
the underlying data service of the public module. If this case
fails, abort the test.
dhcptab Container API
=====================
Case #5 alloc_dtrec:
Call function, verify that a non-NULL dt_rec_t pointer
is returned. Free result with free_dtrec.
Case #6 open_dt:
Create a dhcptab at <location> specifying DSVC_CREATE |
DSVC_READ | DSVC_WRITE. Preserve handpp for use in the following
cases. PASS if DSVC_SUCCESS is returned, abort the test
otherwise.
Case #7 add_dt:
7.1. Initialize container.
Using the handle returned in case #6, add the
dhcptab test records to the dhcptab. Verify that the
dhcptab exists by calling list.
7.2. Attempt to add duplicate record.
Attempt to add the SbootRS symbol definition and
172.21.0.0 macro definition to the dhcptab container.
PASS if DSVC_EXISTS is returned in both cases.
Case #8 lookup_dt:
8.1. Verify case #7.
Using a count value of -1 and a "query" value
initialized by DSVC_QINIT (Figure 5 of ARCH[1]), verify
that the contents of the dhcptab container match the
test data. Note that the order of the records returned
may not be the same as the order in which they were
added in case #7.
8.2 Verify dhcptab container type.
8.2.1. Look for all records with a DT_QTYPE
value of "s". Verify that only the "s" type
records are returned.
8.2.2. Look for all records with a DT_QTYPE
value of "m". Verify that only the "m" type
records are returned.
8.2.3. Look for DT_QKEY of "atlantic". Verify
that only the macro "atlantic" is returned, and
the value is correct.
8.2.4. Look for DTQKEY of i86pc and not a
DT_QTYPE of "m". Verify that only the macro
"i86pc" is returned.
Case #9 modify_dt:
9.1 Modify dhcptab container records
9.1.1. Using lookup_dt to find the record with a
DT_QKEY of "Sterm", change the name of the
record from "Sterm" to "sTERM". Use lookup_dt to
verify that the original record has been
renamed.
9.1.2. Using lookup_dt to find the record with a
DT_QKEY of "Solaris", change the value portion
of the record to be:
:SrootIP4=129.148.174.27:SrootNM="atlantic": \
:SinstIP4=129.148.174.27:SinstNM="atlantic": \
:sTERM="sun-cmd":BootSrvA=129.148.174.27:
Using lookup_dt, reexecute the lookup and verify
that the value portion of the record has been
modified correctly.
Case #10 delete_dt:
Using lookup_dt to find the record with a DT_QKEY of
"SUNW.Ultra-1", delete this record. Verify using lookup_dt that
this record can no longer be found (DSVC_NOENT).
Case #11 close_dt:
Close the open instance of the dhcptab container. Verify
that close_dt returns DSVC_SUCCESS.
Case #12 remove_dt:
Remove the dhcptab container. Verify that it no longer
exists using list.
dhcp network Container API
==========================
Case #13 open_dn:
Using DSVC_CREATE | DSVC_READ | DSVC_WRITE, create a
dhcp network container (called <network address>). Preserve the
handle returned for later use in the following test cases. PASS
if DSVC_SUCCESS is returned, terminate the test otherwise.
Verify that the dhcp network container exists using list.
Case #14 add_dn:
14.1. Initialize container.
Using the handle returned in case #13, add the
dhcp network test records to the dhcp network container.
Verify that the dhcp network container exists by
calling list.
14.2. Attempt to add duplicate record.
Attempt to add the 172.21.0.254 client record
to the <network address> dhcp network container. PASS
if DSVC_EXISTS is returned.
Case #15 lookup_dn:
15.1. Verify case #14.
Using a "count" of -1 and a "query" value
initialized using DSVC_QINIT (Figure 5 of ARCH[1]),
verify that the contents of the <network address>
container match the test data. "records" should equal
the number of records added in case #14. Note that the
order of the records returned may not be the same as the
order in which they were added in case #14.
15.2. Verify <network address> dhcp network container
type.
15.2.1. Look for all records with a DN_QCIP of
<network address>+100. Verify that only one
record (with a cip of <network address>+100 is
returned.
15.2.2. Look for all records with a DN_QMACRO
value of "atlantic". Verify that all records
are returned ("records" == 3000). Note that the
records returned may not be in the same order in
which they were added as part of case #14.
Case #16 modify_dn:
16.1. Using lookup_dn to find the record with a DN_QCIP
of <network address>+10, change the lease field to
1/1/2000 and the flags field to MANUAL. Use lookup_dn to
verify that the original record has been changed.
16.2. Using lookup_dn to find the record with a
DN_QFLAGS of MANUAL. Change the dn_cid field to
01080020FFFFFF, dn_flags field to MANUAL+AUTOMATIC,
dn_sip field to 172.23.0.77, dn_lease field to -1,
dn_macro field to "happy", and the dn_comment field to
"This is a test". Use lookup_dn to verify that the
original record has been changed correctly.
Case #17 delete_dn:
Using lookup_dn to find the record with a DN_QCIP of
<network address>+101, delete this record. Verify using
lookup_dn that this record can no longer be found.
Case #18 close_dn:
Close the open instance of the dhcp network container
<network address>. Verify that close_dn returns DSVC_SUCCESS.
Case #19 remove_dn:
Remove the dhcp network container <network address>.
Verify that the container is in fact gone using list.
FULL TEST
Description
This suite verifies that the dhcptab and dhcp network
table API function calls respond correctly when presented with
incorrect data. It also validates the MT-safeness of the API.
The test suite should allow any number of concurrent threads or
test suite processes to be invoked. The data must remain
consistent as measured at certain points during the test in
order for the test to be considered to have passed successfully.
Test Data
Item Description Application
==== =========== ===========
<location> Public module specific status, list,
path name to container open_dt,
directory (e.g. /var/dhcp remove_dt,
for 'files' data store). open_dn,
remove_dn
<Server IP> System under test's IP N/A
address.
dt records As follows: *_dt
SrootOpt s Vendor=SUNW.Ultra-1 SUNW.i86pc,1,ASCII,1,0
SrootIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,2,IP,1,1
SrootNM s Vendor=SUNW.Ultra-1 SUNW.i86pc,3,ASCII,1,0
SrootPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,4,ASCII,1,0
SswapIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,5,IP,1,1
SswapPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,6,ASCII,1,0
SbootFIL s Vendor=SUNW.Ultra-1 SUNW.i86pc,7,ASCII,1,0
Stz s Vendor=SUNW.Ultra-1 SUNW.i86pc,8,ASCII,1,0
SbootRS s Vendor=SUNW.Ultra-1 SUNW.i86pc,9,NUMBER,2,1
SinstIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,10,IP,1,1
SinstNM s Vendor=SUNW.Ultra-1 SUNW.i86pc,11,ASCII,1,0
SinstPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,12,ASCII,1,0
SsysidCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,13,ASCII,1,0
SjumpsCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,14,ASCII,1,0
Sterm s Vendor=SUNW.Ultra-1 SUNW.i86pc,15,ASCII,1,0
Locale m :UTCoffst=-18000:
Solaris m :SrootIP4=129.148.174.27:SrootNM="atlantic": \
:SinstIP4=129.148.174.27:SinstNM="atlantic": \
:Sterm="xterm":BootSrvA=129.148.174.27:
sparc m \
:SrootPTH="/export/s28/solaris1of2.s28s_wos/latest/Solaris_8/Tools/Boot": \
:SinstPTH="/export/s28/solaris1of2.s28s_wos/latest":
sun4u m :Include=Solaris:Include=sparc:
i86pc m :Include=Solaris:SbootFIL="/platform/i86pc/kernel/unix": \
:SinstPTH="/export/s28/solaris1of2.s28x_wos/latest": \
:SrootPTH="/export/s28/solaris1of2.s28x_wos/latest/Solaris_8/Tools/Boot":
SUNW.i86pc m :Include=i86pc:
SUNW.Ultra-1 m :SbootFIL="/platform/sun4u/kernel/sparcv9/unix": \
:Include=sun4u:
172.21.0.0 m :Subnet=255.255.0.0:Router=172.21.0.2: \
:Broadcst=172.21.255.255:
atlantic m :Include=Locale:Timeserv=129.148.174.27:LeaseTim=3600: \
:LeaseNeg:Hostname:DNSdmain="snt.east.sun.com": \
:DNSserv=172.21.0.1:
010800207E8A02 m :Impress=172.22.255.27:
172.21.0.0 Dhcp network container. *_dn
dn records ~3000, as follows: *_dn
00 00 172.21.0.6 <Server IP> 0 atlantic
.
.
.
00 00 172.21.12.6 <Server IP> 0 atlantic
Case #1:
Disable the underlying data service. How this is done
is data service-dependent. Call each of status, version,
capability, list, open_dt, remove_dt, open_dn, and remove_dn.
PASS if the function returns DSVC_INTERNAL or
DSVC_MODULE_ERROR. What is returned is data service-specific. If
this test FAILs (e.g. a function returns DSVC_SUCCESS, terminate
the test run.
Cleanup: Reenable the underlying data service.
dhcptab Container API
=====================
Case #2 list_dt:
2.1. Invalid Location
Call function with an invalid <location>. PASS
if DSVC_INVAL is returned. If this case fails, abort
the test.
2.2. No container
Verify that list returns DSVC_NOENT.
Case #3 open_dt:
3.1. No container
Call function with DSVC_READ | DSVC_WRITE.
Verify that DSVC_NOENT is returned.
3.2. NON_BLOCK
Using DSVC_CREATE | DSVC_READ | DSVC_WRITE,
call open_dt to create a dhcptab container. Call
close_dt to close the handle. Call open_dt with
DSVC_READ | DSVC_WRITE | DSVC_NONBLOCK. Depending on
whether the public module supports it (see module doc),
the function should return either DSVC_SUCCESS or
DSVC_UNSUPPORTED. If NON_BLOCK access is supported,
endeavor to make the underlying service temporarily
unavailable (e.g: NIS+: checkpoint the database). Call
open_dt again with the same flags (read, write,
nonblock). open_dt must fail and return DSVC_BUSY.
Cleanup: re-enable underlying service, close the open
handle.
3.3. Container exists
Call function with DSVC_CREATE | DSVC_READ |
DSVC_WRITE. Verify that the function returns
DSVC_EXISTS.
Cleanup: remove the dhcptab container using remove_dt.
Case #4 add_dt:
Create and load the dhcptab as per Case #6 and Case #7.1
of the Basic Sanity Test.
4.1. Record exists
Attempt to add a test dhcptab record to the
dhcptab. Verify that DSVC_EXISTS is returned.
4.2. Busy
Close open handle with close_dt. Reopen with
DSVC_NONBLOCK specified. If nonblocking semantics are
supported, then make the data service busy through the
use of a data service-specific technique and attempt to
add an additional dhcptab record. Verify that DSVC_BUSY
is returned. Remove the data service busy condition and
reattempt the add operation. Verify that DSVC_SUCCESS is
returned. close_dt the container.
4.3. Read only
Close any open handles. Reopen the dhcptab with
DSVC_READ access only. If success is returned, attempt
to add a new record to the dhcptab. Verify that
DSVC_ACCESS is returned. close_dt the handle. Note that
some data store modules may return DSVC_UNSUPPORTED for
read-only access.
Cleanup: Close open handles, remove the dhcptab using
remove_dt.
Case #5 lookup_dt:
Create and load the dhcptab as per Case #6 and Case #7.1
of the Basic Sanity Test.
5.1. Record does not exist.
Produce a dhcptab container query that would not
be satisfied by the test data. Verify that DSVC_SUCCESS
is returned, and "records" is 0.
5.2. Busy
Close dhcptab handle with close_dt. Reopen with
DSVC_NONBLOCK specified. IF DSVC_SUCCESS is returned
(Nonblocking access is supported), using a data
service-specific technique for making the service busy,
attempt to perform a valid lookup of a dhcptab record.
Verify that DSVC_BUSY is returned. Remove the busy
condition, and reattempt the lookup. Verify that
DSVC_SUCCESS is returned, and that the data returned is
valid. close_dt the handle.
5.3. Write only
Reopen the dhcptab container with DSVC_WRITE
access only. If success is returned, attempt to perform
lookup_dt's using any syntactically legal query for the
dhcptab. Verify that DSVC_ACCESS is returned. close_dt
the handle.
5.4. Multiple matching records
Reopen the dhcptab container as per case
#6 and case #7.1 of the Basic Sanity Test. Using
modify_dt, change the dt_key for the SrootOpt symbol
such that the key value is now sun4u. Form a query which
simply specifies a DT_QKEY value of "sun4u". Verify that
exactly two records are returned, and that there values
are what is expected (one a macro, the other a symbol,
with the appropriate values).
Cleanup: Remove the dhcptab container using remove_dt.
Case #6 modify_dt:
Create and load the dhcptab container as per Case #6
and Case #7.1 of the Basic Sanity Test.
6.1. Unknown record
Fabricate dt_rec_t elements initialized with
data known not to exist in the dhcptab. Attempt to
modify these elements. Verify that DSVC_NOENT is
returned.
6.2. Update Collision #1
Use lookup_dt to find a valid dhcptab record.
Change the signature on the resultant dt_rec_t. Attempt
to modify the record. Verify that DSVC_COLLISION is
returned.
6.3. Update Collision #2
Use lookup_dt to find a valid dhcptab record.
Attempt to rename the record to one that already exists
(dt_key + dt_type). Verify that DSVC_EXISTS is returned.
6.4. Busy
Close the dhcptab with close_dt. Reopen with
DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned (it
is supported), acquire a valid dhcptab record using
lookup_dt. Using a data service specific technique for
making the service busy, attempt to modify the value
(non-key fields) of the record. Verify that DSVC_BUSY is
returned. Remove the busy condition, and reattempt the
modify. Verify that DSVC_SUCCESS is returned.
Reacquire the record. Verify that the contents have been
suitably updated. close_dt the container.
6.5. Read only
Reopen the dhcptab with DSVC_READ access only.
If success is returned, locate a valid container record
using the appropriate query to lookup_dt. Modify the
contents of the record. Attempt to commit the modify to
the dhcptab. Verify that DSVC_ACCESS is returned.
close_dt the dhcptab handle.
Cleanup: Remove the dhcptab using remove_dt.
Case #7 free_dtrec_list:
This function should be used to release the results of
lookup_dt calls. Its operation must be validated by running this
test under bcheck with -memuse, and ensuring that no free blocks
remain after exit. Note that the test must be written with care
to make this case useful (free any allocated memory when it is
no longer needed).
Case #8 delete_dt:
Create and load the dhcptab container as per Case #6 and
Case #7.1 of the Basic Sanity Test.
8.1 Unknown record
Fabricate dt_rec_t containing a record known
not to exist in the dhcptab. Attempt to delete the
record. Verify that DSVC_NOENT is returned.
8.2 Busy
Close the dhcptab with close_dt. Reopen with
DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned,
acquire a valid dhcptab container record using
lookup_dt. Using a data service specific technique for
making the service busy, attempt to delete the record.
Verify that DSVC_BUSY is returned. Remove the busy
condition, and reattempt the delete. Verify that
DSVC_SUCCESS is returned. Attempt to reacquire the
record. Verify that the record has in fact been deleted.
Close the dhcptab using close_dt.
8.3 Read only
Reopen the dhcptab container with DSVC_READ
access only. If success is returned, locate a valid
dhcptab record using an appropriate query to lookup_dt.
Attempt to delete the record. Verify that DSVC_ACCESS is
returned. Close the dhcptab using close_dt.
Cleanup: Remove the dhcptab using remove_dt.
Case #9 close_dt:
Verify that this function handles nonblocking semantics
correctly. Create a dhcptab as per case #6 of the Basic Sanity
Test, with the exception that DSVC_NONBLOCK is specified. If
nonblocking mode is supported, then using a data service
specific technique for making the service busy, attempt to close
the dhcptab handle returned by open_dt. Verify that DSVC_BUSY
is returned. Remove the busy condition, and reattempt the
close_dt. Verify that DSVC_SUCCESS is returned.
Cleanup: Remove the dhcptab container using remove_dt.
Case #10 remove_dt:
Verify that this function handles nonblocking semantics
correctly. Create a dhcptab container as per Case #6 of the Basic
Sanity Test. Close open handle using close_dt. Reopen with
DSVC_NONBLOCK specified. If nonblocking mode is supported, using
a data service specific technique for making the service busy,
attempt to remove the dhcptab container. Verify that DSVC_BUSY is
returned. Remove the busy condition, and reattempt the remove.
Verify that the dhcptab container is removed using list and that
the function returns DSVC_SUCCESS.
Cleanup: Close the open handle using close_dt (ignore result).
dhcp network Container API
==========================
Case #11 list_dn:
11.1. Invalid Location
Call function with an invalid <location>. PASS
if DSVC_INVAL is returned. If this case fails, abort
the test.
11.2. No container
Verify that list returns DSVC_NOENT.
Case #12 open_dn:
12.1. No container
Call function with DSVC_READ | DSVC_WRITE and
<network address>. Verify that DSVC_NOENT is returned.
12.2. NON_BLOCK
Using the flag values of DSVC_CREATE |
DSVC_READ | DSVC_WRITE | DSVC_NONBLOCK, the function
to create a dhcp network container called <network
address>. Depending on whether the public module
supports nonblocking semantics (see module doc),
the function should return either DSVC_SUCCESS or
DSVC_UNSUPPORTED. If NON_BLOCK access is supported,
endeavor to make the underlying service temporarily
unavailable (e.g: NIS+: checkpoint the database). Call
open_dn again with the same flags (read, write,
nonblock). open_dn must fail and return DSVC_BUSY.
Cleanup: re-enable underlying service, close the open
handle.
12.3. Container exists.
Using the flag values DSVC_CREATE | DSVC_READ |
DSVC_WRITE, attempt to open <network address>. Verify
that the function returns DSVC_EXISTS.
Cleanup: Remove the <network address> dhcp network
container using remove_dn.
Case #13 add_dn:
Create and load the <network address> dhcp network
container as per Case #13 and Case #14.1 of the Basic Sanity
Test.
13.1. Record exists
Attempt to add a test dhcp network record to
the <network address> dhcp network container. Verify
that DSVC_EXISTS is returned.
13.2. Busy
Close open handle with close_dn. Reopen with
DSVC_NONBLOCK specified. If nonblocking semantics are
supported, then make the data service busy through the
use of a data service-specific technique and attempt to
add an additional dhcp network record. Verify that
DSVC_BUSY is returned. Remove the data service busy
condition and reattempt the add operation. Verify that
DSVC_SUCCESS is returned. close_dn the container.
13.3. Read only
Close any open handles. Reopen the <network
address> dhcp network container with DSVC_READ access
only. If success is returned, attempt to add a new
record to the dhcp network container. Verify that
DSVC_ACCESS is returned. close_dn the handle. Note that
some data store modules may return DSVC_UNSUPPORTED for
read-only access.
Cleanup: Close open handles, remove the <network
address> dhcp network container using remove_dn.
Case #14 lookup_dn:
Create and load the <network address> dhcp network
container as per Case #13 and Case #14.1 of the Basic Sanity
Test.
14.1. Record does not exist.
Produce a dhcp network container query that
would not be satisfied by the test data. Verify that
DSVC_SUCCESS is returned, and "records" is 0.
14.2. Busy
Close the <network address> dhcp network handle
with close_dn. Reopen with DSVC_NONBLOCK specified. If
DSVC_SUCCESS is returned (Nonblocking access is
supported), using a data service-specific technique for
making the service busy, attempt to perform a valid
lookup of a dhcp network record. Verify that DSVC_BUSY
is returned. Remove the busy condition, and reattempt
the lookup. Verify that DSVC_SUCCESS is returned, and
that the data returned is valid. close_dn the handle.
14.3. Write only
Reopen the dhcp network container with DSVC_WRITE
access only. If success is returned, attempt to perform
lookup_dn's using any syntactically legal query for the
<network address> dhcp network container. Verify that
DSVC_ACCESS is returned. close_dn the handle.
14.4. Multiple matching records
Reopen the dhcp network container as per case
#13 and case #14.1 of the Basic Sanity Test. Using
modify_dn, change the dn_cid fields for records <network
address>+1 through <network address>+217 to 01BADDCAFE.
Form a query which simply specifies a DN_QCID of
01BADDCAFE. Confirm that exactly 216 records are
returned, and that their CIP range is correct.
Cleanup: Remove the <network address> dhcp network
container using remove_dn.
Case #15 modify_dn:
Create and load the <network address> dhcp network
container as per Case #13 and Case #14.1 of the Basic Sanity
Test.
15.1. Unknown record
Fabricate dn_rec_t elements initialized with
data known not to exist in the dhcp network container.
Attempt to modify these elements. Verify that DSVC_NOENT
is returned.
15.2. Update Collision #1
Use lookup_dn to find a valid dhcp network record.
Change the signature on the resultant dn_rec_t. Attempt
to modify the record. Verify that DSVC_COLLISION is
returned.
15.3. Update Collision #2
Use lookup_dn to find a valid dhcp network record.
Attempt to rename the record to one that already exists
(dn_cid, dn_flags, dn_cip, dn_sip, dn_lease, dn_macro).
Verify that DSVC_EXISTS is returned.
15.4. Busy
Close the dhcp network container with close_dn.
Reopen with DSVC_NONBLOCK specified. If DSVC_SUCCESS is
returned (nonblocking semantics are supported), acquire
a valid dhcp network record using lookup_dn. Using a
data service specific technique for making the service
busy, attempt to modify the value (non-key fields) of
the record. Verify that DSVC_BUSY is returned. Remove
the busy condition, and reattempt the modify. Verify
that DSVC_SUCCESS is returned. Reacquire the record.
Verify that the contents have been suitably updated.
close_dn the container.
15.5. Read only
Reopen the dhcp network container with DSVC_READ
access only. If success is returned, locate a valid
container record using the appropriate query to
lookup_dn. Modify the contents of the record. Attempt
to commit the modify to the dhcp network container.
Verify that DSVC_ACCESS is returned. close_dn the
dhcp network container handle.
Cleanup: Remove the dhcp network container using
remove_dn.
Case #16 free_dnrec_list:
This function should be used to release the results of
lookup_dn calls. Its operation must be validated by running this
test under bcheck with -memuse, and ensuring that no free blocks
remain after exit. Note that the test must be written with care
to make this case useful (free any allocated memory when it is
no longer needed).
Case #17 delete_dn:
Create and load the <network address> dhcp network
container as per Case #13 and Case #14.1 of the Basic Sanity
Test.
17.1 Unknown record
Fabricate dn_rec_t containing a record known
not to exist in the dhcp network container. Attempt
to delete the record. Verify that DSVC_NOENT is returned.
17.2 Busy
Close the dhcp network container with close_dn.
Reopen with DSVC_NONBLOCK specified. If DSVC_SUCCESS is
returned, acquire a valid dhcp network container record
using lookup_dn. Using a data service specific technique
for making the service busy, attempt to delete the record.
Verify that DSVC_BUSY is returned. Remove the busy
condition, and reattempt the delete. Verify that
DSVC_SUCCESS is returned. Attempt to reacquire the
record. Verify that the record has in fact been deleted.
Close the dhcp network container using close_dn.
17.3 Read only
Reopen the dhcp network container with DSVC_READ
access only. If success is returned, locate a valid
dhcp network record using an appropriate query to
lookup_dn. Attempt to delete the record. Verify that
DSVC_ACCESS is returned. Close the dhcp network
container using close_dn.
Cleanup: Remove the dhcp network container using
remove_dn.
Case #18 close_dn:
Verify that this function handles nonblocking semantics
correctly. Create the <network address> dhcp network container
as per case #13 of the Basic Sanity Test, with the exception
that DSVC_NONBLOCK is specified. If nonblocking mode is
supported, then using a data service specific technique for
making the service busy, attempt to close the dhcp network
handle returned by open_dn. Verify that DSVC_BUSY is returned.
Remove the busy condition, and reattempt the close_dn. Verify
that DSVC_SUCCESS is returned.
Cleanup: Remove the dhcp network container using remove_dn.
Case #19 remove_dn:
Verify that this function handles nonblocking semantics
correctly. Create the <network address> dhcp network container
as per Case #13 of the Basic Sanity Test, with the exception
that DSVC_NONBLOCK is specified. If nonblocking mode is
supported, using a data service specific technique for making
the service busy, attempt to remove the dhcp network container.
Verify that DSVC_BUSY is returned. Remove the busy condition,
and reattempt the remove. Verify that the <network address> dhcp
network container is removed using list and that the function
returns DSVC_SUCCESS.
Cleanup: Close the open handle using close_dn (ignore result).
Case #20 Multi-access stress
Public layer modules are not required to manage reference
counts for open instances. So while individual handles are
considered to be MT-safe (and parallel access to containers is
suitably protected), an application using the service provider
layer API must synchronize close and/or container remove
operations among threads such that no threads hold handles to a
container after the handle has been closed or the container has
been removed.
This case assumes a test which is multi-threaded, and
can run the following test using from 1 to THREADS threads. The
test can also be run in multiple concurrent processes.
The goal of this test is to ensure that the API is
MT-safe with respect to the containers and the records contained
within those containers. This goal is accomplished by verifying
that the end result of the test is consistent.
Tunable default values:
PROCESSES: 20
THREADS: 20
20.1 The dhcptab container test
20.1.1 open_dt
Create a dhcptab using DSVC_CREATE |
DSVC_READ | DSVC_WRITE. If DSVC_EXISTS is
returned, retry the open attempt w/o the
DSVC_CREATE flag. Log that this event occurred.
Handle will be used for balance of test. If any
other error occurs, terminate the test as
failed.
20.1.2 add_dt
Add the test data records to the dhcptab
container. If DSVC_EXISTS is returned, skip that
record, and continue attempting to add the other
records. Log that this event occurred. If any
other error occurs, terminate the test as
failed.
20.1.3 lookup_dt
Using DT_QKEY of "atlantic" and DT_QTYPE
of "m", find the atlantic record. Compare its
value against the test data. If it has
changed, then output a message to this affect.
If any error occurs, terminate the test as failed.
20.1.4 modify_dt
Using the results of 20.1.3, change the
record as follows. If it is no different from
the test data, change the value to:
:Timeserv=129.148.174.28:LeaseTim=86400: \
:Hostname:DNSdmain="east.sun.com":DNSserv=172.23.3.3:
If it doesn't match the test data
value, change the LeaseTim by incrementing it by
one. Attempt to update the record. If it fails
with DSVC_COLLISION, retry 20.1.3 and 20.1.4 for
three attempts. Log message if modify was
unsuccessful. If any other error occurs,
terminate the test as failed.
20.1.5 delete_dt
Use lookup_dt to find a DT_QKEY of
"SjumpsCF" and a DT_QTYPE of "s". If it does
not exist, log a message. If it does exist,
attempt to delete it. If DSVC_NOENT is returned,
log a message.
20.1.6 close_dt
Use close_dt to close the open handle.
If DSVC_NOENT is returned, log a message.
20.1.7 epilogue
Compare the resultant dhcptab container
to the test data. The only differences should be
a changed value of the atlantic macro as
expected from 20.1.4 and the SjumpsCF symbol
should be removed. Any other inconsistency means
the test has failed.
Clean up: Remove the dhcptab container.
20.2 The dhcp network table container test
20.2.1 open_dn
Create a <network address> dhcp network
table using DSVC_CREATE | DSVC_READ | DSVC_WRITE.
If DSVC_EXISTS is returned, retry the open
attempt w/o the DSVC_CREATE flag. Log that this
event occurred. Handle will be used for balance
of test. If any other error occurs, terminate
the test as failed.
20.2.2 add_dn
Add the test data records to the dhcp
network table container. If DSVC_EXISTS is
returned, skip that record, and continue
attempting to add the other records. Log that
this event occurred. If any other error occurs,
terminate the test as failed.
20.2.3 lookup_dn
Find the DN_QCIP of <network address>+102
record. Compare its value against the test data.
If it has changed, then output a message to this
affect. If any error occurs, terminate the test
as failed.
20.2.4 modify_dn
Using the results of 20.2.3, change the
record as follows. If it is no different from
the test data, change the value to:
01DEADBEEF 03 <network address>+102 172.23.3.3 941619403 Solaris
If it doesn't match the test data
value, change dn_lease by incrementing it by
one. Attempt to update the record. If it fails
with DSVC_COLLISION, retry 20.2.3 and 20.2.4 for
three attempts. Log message if modify was
unsuccessful. If any other error occurs,
terminate the test as failed.
20.2.5 delete_dn
Use lookup_dn to find a DN_QCIP of
<network address>+1001. If it does not exist,
log a message. If it does exist, attempt to
delete it. If DSVC_NOENT is returned, log a
message.
20.2.6 close_dn
Use close_dn to close the open handle.
If DSVC_NOENT is returned, log a message.
20.2.7 epilogue
The <network address> dhcp network
container should be consistent at the end of
a test run. The only differences should be a
changed value of the <network address>+102
record with the value as per 20.2.4 and the
lease time potentially incremented, as well as
the <network address>+1001 record missing.
Any other inconsistency means the test has
failed.
Cleanup: remove <network address> dhcp network
container.
20.3 Multi-process run
Run 20.1 and 20.2 in PROCESSES separate
processes.
20.4 Multi-threaded run, single process
Run 20.1 and 20.2 in THREADS separate threads
within a single process.
20.5 Multi-process, Multi-threaded run
Run 20.1 and 20.2 in PROCESSES separate
processes each spawning THREADS separate threads.
Case #21 Capacity
This test case endeavors to probe the stability and the
performance of the public module implementation when:
a) The data storage containers are filled to capacity.
b) The data storage containers are overfilled.
Note that while the number of records within a dhcptab
container could be infinite, the number of records within a dhcp
network container is bounded by the number of possible IP
addresses within the network represented by the container. If a
class A network is represented, there can be up to 16,777,215
possible records. The total number of records supported by a
public module (with some overhead for container information) is
the upper bound. That total number could be influenced by
settings in the underlying hosting data service, or by the
available memory or disk resources of the machine under test.
Since record sizes for dhcptab and dhcp network containers
differ, discovering the maximum number of possible records
requires some dynamic experimentation by the test itself.
21.1 Initialization
Call capability. The max number of possible
records for the environment under test will be contained
within the returned structure as will some estimate of
the operations per second claimed by the public module
in the run environment. A dhcptab will be created with
contains 1/3 of the maximum number of records. One or
more dhcp network containers will be created to contain
the balance of the records. A multithreaded program can
create the containers and load them with single threads,
one for each container. A consistent series of records
must be added to the dhcptab (monotonically increasing
symbol / macro records created, each with unique value
portions which could be calculated by the key fields of
the record). dhcp network container records simply contain
records unique by client IP address.
Initialization will stop when no more records can be
added to the system (XXX - what sort of error code would
be returned? DSVC_INTERNAL?). Operations per second
must be measured during the initialization process to
determine whether it is close to the advertised number
(XXX - how could this be verified?).
21.2 Modify
For every existing dhcp network record, modify
the lease time such that it is set to the number of
modify operations done during this subcase (first one ==
1, last 1+N). Measure operations per second during this
process.
21.3 Add
Attempt to add a new dhcptab and a new dhcp
network container(s) record. This operation should fail
(XXX expected results?).
21.4 Lookup
Form a configured number of legal queries (TBD
tunable) for the dhcptab and dhcp network container(s).
Validate that the data returned is what is expected
based upon knowledge of relationship between the record
being searched for and the expected value based upon the
search parameters. PASS if queries are successful.
Measure operations per second during this process for
comparison against advertised number.
21.5 Delete
Using lookup and delete, find and delete every
single record added by the test. Confirm that the
containers contain no records. Measure operations per
second during this process for comparison against the
advertised number.
Cleanup: Remove the containers.
REFERENCES
[1] "Enterprise DHCP Service Architecture Specification", mwc,
6/25/1999.
[2] "Enterprise Reference Hardware Platforms", mwc, 10/23/1999.