1 #ident  "%Z%%M% %I%     %E% SMI" mwc
   2 
   3 CDDL HEADER START
   4 
   5 The contents of this file are subject to the terms of the
   6 Common Development and Distribution License, Version 1.0 only
   7 (the "License").  You may not use this file except in compliance
   8 with the License.
   9 
  10 You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  11 or http://www.opensolaris.org/os/licensing.
  12 See the License for the specific language governing permissions
  13 and limitations under the License.
  14 
  15 When distributing Covered Code, include this CDDL HEADER in each
  16 file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  17 If applicable, add the following below this CDDL HEADER, with the
  18 fields enclosed by brackets "[]" replaced with your own identifying
  19 information: Portions Copyright [yyyy] [name of copyright owner]
  20 
  21 CDDL HEADER END
  22 
  23                 Enterprise: Private Layer Test Specification
  24                 ============================================
  25 
  26 ABSTRACT
  27 
  28         This document describes two test specifications intended to be
  29 used in the development of test suite(s) designed to validate the private
  30 layer API described in Section 2.1 of the Enterprise DHCP Service
  31 Architecture Specification (ARCH) [1]. The first specification outlines
  32 testing requirements for the DHCP default file API (ARCH, section 2.1.1)
  33 [1]. The second specification outlines the testing requirements for the
  34 dhcptab and dhcp network container API (ARCH, section 2.1.2) [1]. Each
  35 specification contains a basic sanity test specification, designed to
  36 verify that the API works as designed when fed data in the correct form.
  37 Each specification also contains a full test specification, which
  38 compliments the basic sanity test by providing cases which test the
  39 stability and MT-safeness of the API.
  40 
  41 TEST APPLICATION
  42 
  43         Test suite(s) written to these specifications should be run on
  44 an instance of each reference platform on each build of the ON
  45 consolidation. See "Enterprise Reference Platforms" [2] for more
  46 information.
  47 
  48 1.0 DHCP default file API Test Specification
  49         
  50 1.1 ABSTRACT
  51 
  52         This test specification is divided into two subspecifications
  53 outlining the testing requirements for validating the default file API
  54 described in Section 2.1.1 of ARCH [1]. The first specification describes
  55 a basic sanity test, which describes the testing requirements to verify
  56 that the API works as designed when fed data in the correct form. The
  57 second specification describes a full test, which complements the basic
  58 sanity test by defining test requirements which test the error checking
  59 behavior and MT-safeness of the API.
  60 
  61 1.2 TEST APPLICATION
  62 
  63         Test suite(s) written to this specification should be run on the
  64 reference platform of each of the supported architectures (sparcv8,
  65 sparcv9, IA32, IA64) for each build of the ON consolidation. See
  66 "Enterprise Reference Platforms" [2].
  67 
  68 1.3 TEST PREPARATION
  69 
  70         Prior to running a test suite, install SUNWdhcsr and SUNWdhcsu
  71 on the testing platform. No external setup is required for this test
  72 suite.  Remove any existing default file, /etc/default/dhcp.
  73 
  74 1.4 BASIC SANITY TEST
  75 
  76         Description
  77 
  78                 This test validates the basic operation of the default
  79         file API function calls when presented with valid input.
  80 
  81         Test Data
  82 
  83                 RESOURCE=files
  84                 PATH=/var/dhcp_test
  85                 RUN_MODE=server
  86                 VERBOSE=TRUE
  87                 RELAY_HOPS=8
  88                 INTERFACES=hme0,le0,qfe3
  89                 ETHERS_COMPAT=FALSE
  90                 ICMP_VERIFY=TRUE
  91                 OFFER_CACHE_TIMEOUT=11
  92                 RESCAN_INTERVAL=61
  93                 LOGGING_FACILITY=6
  94                 BOOTP_COMPAT=FALSE
  95 
  96         Case #1 write_dhcp_defaults:
  97 
  98                 Use function to write the test data, using file mode of
  99         0646. Confirm that data written matches test data. Confirm that
 100         default file created has 0646 file mode and the function
 101         returns 0.
 102 
 103         Case #2 read_dhcp_defaults:
 104 
 105                 Create default file containing test data. Read data
 106         using the function. Confirm data contained with dhcp_defaults_t
 107         matches test data and the function returns 0.
 108 
 109         Case #3 delete_dhcp_defaults:
 110 
 111                 Remove the default file using the function. Confirm
 112         that default file has been removed and the function returns 0.
 113 
 114         Case #4 query_dhcp_defaults:
 115 
 116                 Call function, cycling through each test data key.
 117         Confirm that key is found, and that data returned is correct
 118         and the function returns 0.
 119 
 120         Case #5: free_dhcp_defaults:
 121 
 122                 Using the dhcp_defaults_t built containing the test
 123         data, confirm that the function returns 0.
 124         
 125 1.5 FULL TEST
 126 
 127         Description
 128 
 129                 This test verifies that the default file API function
 130         calls respond correctly when presented with incorrect data. It
 131         also validates the MT-safeness of the API.
 132 
 133         Test Data
 134 
 135                 RESOURCE=files
 136                 PATH=/var/dhcp_test
 137                 RUN_MODE=server
 138                 VERBOSE=TRUE
 139                 RELAY_HOPS=8
 140                 INTERFACES=hme0,le0,qfe3
 141                 ETHERS_COMPAT=FALSE
 142                 ICMP_VERIFY=TRUE
 143                 OFFER_CACHE_TIMEOUT=11
 144                 RESCAN_INTERVAL=61
 145                 LOGGING_FACILITY=6
 146                 BOOTP_COMPAT=FALSE
 147 
 148         Case #1 all API function calls:
 149 
 150                 Call each of the API functions with invalid argument(s).
 151         For functions that take more than one argument, call those
 152         functions once for each argument, providing invalid data for
 153         each argument in turn. Confirm that functions return -1 and set
 154         errno to EINVAL.
 155 
 156         Case #2 existing lock file:
 157 
 158                 Create /etc/default/.dhcp_defaults_lock. Confirm that
 159         read_dhcp_defaults and write_dhcp_defaults return -1 and set
 160         errno to EAGAIN.
 161 
 162         Case #2 read_dhcp_defaults:
 163 
 164                 Condition               Expected Result
 165                 =========               ===============
 166 
 167                 No default file.        Confirm that the function
 168                                         returns -1 and sets errno
 169                                         to ENOENT.
 170 
 171                 Default file w/         Confirm that the function
 172                 mode set to 000.        returns -1 and sets errno
 173                                         to EACCESS.
 174 
 175         Case #3 delete_dhcp_defaults:
 176 
 177                 Condition               Expected Result
 178                 =========               ===============
 179 
 180                 No default file.        Confirm that the function
 181                                         returns -1 and sets errno
 182                                         to ENOENT.
 183 
 184                 Default file w/         Confirm that the function
 185                 mode set to 000.        returns -1 and sets errno
 186                                         to EACCESS.
 187 
 188         Case #3 write_dhcp_defaults:
 189         
 190                 Condition               Expected Result
 191                 =========               ===============
 192 
 193                 Default file w/         Confirm that the function
 194                 mode set to 000.        returns -1 and sets errno
 195                                         to EACCESS.
 196 
 197         Case #4 Multi-access stress:
 198 
 199                 Preparation:
 200 
 201                         Generate TUNABLE versions of the default file
 202                 containing unique combinations of defaults (no
 203                 line within the TUNABLE  files are the same). The
 204                 default file will be written/accessed using UFS.
 205 
 206                         Tunable default values:
 207 
 208                                 TUNABLE value:  5
 209                                 INTERATE value: 100
 210 
 211                         A single multi-threaded test program can be
 212                 written which can be used in the following 3 cases.
 213                 It will write/read a unique version of the default
 214                 file. It will retry a default file operation if EAGAIN
 215                 is returned.
 216 
 217                 4.1. Multiple processes
 218 
 219                         Run TUNABLE instances of the test program which
 220                 writes / reads a different version of the TUNABLE
 221                 default file possibilities for a tunable (INTERATE)
 222                 number of iterations at once. Once the instances of
 223                 the test program have completed their interations,
 224                 verify that the file consists of exactly one of the
 225                 TUNABLE possible versions of the default file.
 226 
 227                 4.2. Multiple threads, single process
 228 
 229                         Run a single instance of the test program which
 230                 creates a tunable number of threads (TUNABLE) each of
 231                 which will write and read one of the unique default file
 232                 combinations for a tunable (INTERATE) number of
 233                 interations. Verify that after the program completes,
 234                 exactly one of the TUNABLE possible versions of the
 235                 default files exists.
 236 
 237                 4.3. Multiple threads, multiple processes, NFS in use
 238 
 239                         Run multiple versions of the test program, each
 240                 using multiple threads, some versions of the test
 241                 program accessing the default directory using NFS,
 242                 others using UFS. Verify after the test programs
 243                 complete that exactly one of the TUNABLE possible
 244                 versions of the default file exists.
 245                         
 246                         Caution: ensure that the number of threads *
 247                 number of processes does not exceed the number of unique
 248                 possible default files.
 249 
 250                 4.4. Variation of 4.1-4.3:
 251 
 252                         Generate another process which periodically
 253                 snags the default file lock file, and verifies that the
 254                 current version of the default file matches one of the
 255                 unique default file versions.
 256 
 257 2.0 dhcptab and dhcp network container API Test Specification
 258 
 259 2.1 ABSTRACT
 260         
 261         This test specification is divided into two subspecifications
 262 outlining the testing requirements for validating the dhcptab and dhcp
 263 network container API described in Section 2.1.2 of ARCH [1]. The first
 264 specification describes a basic sanity test, which describes the testing
 265 requirements to verify that the API works as designed when fed data in
 266 the correct form with the correct preconditions present. The second
 267 specification describes a full test, which complements the basic sanity
 268 test by defining test requirements which test the error checking
 269 behavior and MT-safeness of the API.
 270 
 271 2.2 TEST APPLICATION
 272 
 273         Test suite(s) written to this specification should be run on the
 274 reference platform of each of the supported architectures (sparcv8,
 275 sparcv9, IA32, IA64) for each build of the ON consolidation. See
 276 "Enterprise Reference Platforms" [2].
 277 
 278 2.3 TEST PREPARATION
 279         
 280         Prior to running a test suite, install SUNWdhcsr and SUNWdhcsu
 281 on the testing platform. Select a public module SUNWdhc{df,db,dn} and
 282 install it. Configure any data service providing service to the public
 283 module. Set the RESOURCE and PATH default file parameters as required by
 284 the public module. Note that if the underlying public module's
 285 environment is appropriately configured, the results of testing the API
 286 should be the same for any other appropriately configured public module.
 287 The public module status can be verified by running the basic sanity
 288 test for the specific public module. The tester should record the
 289 public module environment used during the test.
 290 
 291 2.4 BASIC SANITY TEST
 292 
 293         Description
 294                 
 295                 This test validates the basic operation of the dhcptab
 296         and dhcp network container API function calls when presented with
 297         valid input.
 298 
 299         Test Data
 300 
 301         Item                    Description             Application
 302         ====                    ===========             ===========
 303         <network address> IP address of           *_dn
 304                                 network. Ensure
 305                                 that appropriate
 306                                 subnet mask is
 307                                 available in
 308                                 netmasks(4).
 309                                 Candidate networks
 310                                 have to have at
 311                                 least 3000 hosts.
 312 
 313         dt records      As follows:                     *_dt
 314 
 315         SrootOpt s Vendor=SUNW.Ultra-1 SUNW.i86pc,1,ASCII,1,0
 316         SrootIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,2,IP,1,1
 317         SrootNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,3,ASCII,1,0
 318         SrootPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,4,ASCII,1,0
 319         SswapIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,5,IP,1,1
 320         SswapPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,6,ASCII,1,0
 321         SbootFIL s Vendor=SUNW.Ultra-1 SUNW.i86pc,7,ASCII,1,0
 322         Stz      s Vendor=SUNW.Ultra-1 SUNW.i86pc,8,ASCII,1,0
 323         SbootRS  s Vendor=SUNW.Ultra-1 SUNW.i86pc,9,NUMBER,2,1
 324         SinstIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,10,IP,1,1
 325         SinstNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,11,ASCII,1,0
 326         SinstPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,12,ASCII,1,0
 327         SsysidCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,13,ASCII,1,0
 328         SjumpsCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,14,ASCII,1,0
 329         Sterm    s Vendor=SUNW.Ultra-1 SUNW.i86pc,15,ASCII,1,0
 330         Locale   m :UTCoffst=-18000:
 331         Solaris  m :SrootIP4=129.148.174.27:SrootNM="atlantic": \
 332                :SinstIP4=129.148.174.27:SinstNM="atlantic": \
 333                :Sterm="xterm":BootSrvA=129.148.174.27:
 334         sparc    m \
 335 :SrootPTH="/export/s28/solaris1of2.s28s_wos/latest/Solaris_8/Tools/Boot": \
 336                :SinstPTH="/export/s28/solaris1of2.s28s_wos/latest":
 337         sun4u    m :Include=Solaris:Include=sparc:
 338         i86pc    m :Include=Solaris:SbootFIL="/platform/i86pc/kernel/unix": \
 339                    :SinstPTH="/export/s28/solaris1of2.s28x_wos/latest": \
 340 :SrootPTH="/export/s28/solaris1of2.s28x_wos/latest/Solaris_8/Tools/Boot":
 341         SUNW.i86pc m :Include=i86pc:
 342         SUNW.Ultra-1 m :SbootFIL="/platform/sun4u/kernel/sparcv9/unix": \
 343                        :Include=sun4u:
 344         <network address> m :Subnet=255.255.0.0:Router=172.21.0.2: \
 345                      :Broadcst=172.21.255.255:
 346         atlantic m :Include=Locale:Timeserv=129.148.174.27:LeaseTim=3600: \
 347                    :LeaseNeg:Hostname:DNSdmain="snt.east.sun.com": \
 348                    :DNSserv=172.21.0.1:
 349         010800207E8A02 m :Impress=172.22.255.27:
 350 
 351         
 352         <network address> Dhcp network container.         *_dn
 353 
 354         dn records              ~3000, as follows:              *_dn
 355 
 356         00 00 <network address>+6 172.21.0.2 0 atlantic
 357                         .
 358                         .
 359                         .
 360         00 00 <network address>+3006 172.21.0.2 0 atlantic
 361 
 362 
 363 
 364         Case #1 dhcpsvc_errmsg:
 365                 
 366                 Use function in a loop to display all messages
 367         associated with the error codes in Figure 2 of ARCH [1]. Verify
 368         that messages are displayed correctly.
 369 
 370         Case #2 enumerate_dd:
 371 
 372                 Verify that this function properly enumerates the public
 373         modules present on the machine under test in
 374         /usr/lib/inet/dhcp/svc. Free memory (count entries in modules).
 375 
 376         Case #3 status_dd:
 377 
 378                 Verify that the selected data store service is correctly
 379         configured.
 380 
 381         Case #4 capability_dd:
 382 
 383                 Verify that this function returns the correct
 384         capabilities for the public module currently configured for use.
 385         Note: Some public modules may not support this function, which
 386         will cause this function to return DSVC_UNSUPPORTED.
 387 
 388         Case #5 open_dd:
 389                 
 390                 Using DSVC_CREATE | DSVC_READ | DSVC_WRITE, create a
 391         dhcptab container and a dhcp network container (called
 392         <network address>). Preserve the handles returned for later
 393         use in the following test cases.
 394 
 395         Case #6 list_dd:
 396 
 397                 Verify that this function properly returns the currently
 398         available DHCP containers (Case #5) in the data service hosting
 399         the public module. Only those containers created in Case #5
 400         should exist. Free memory (count entries in listppp).
 401 
 402         Case #7 add_dd_entry:
 403 
 404                 Using the handles returned in Case #5, add the test
 405         data records to the dhcptab and dhcp network containers.
 406 
 407         Case #8 lookup_dd:
 408 
 409                 8.1. Verify case #7.
 410 
 411                         Using a "count" of -1 and a "query" value set
 412                 using DSVC_QINIT (Figure 5 of ARCH[1]), verify that the
 413                 contents of the dhcptab container and <network address>
 414                 container match the test data. "records" should equal
 415                 the number of records for each container. Note that the
 416                 order of the records returned may not be the same as
 417                 the order in which they were added in case #7.
 418 
 419                 8.2 Verify dhcptab container type.
 420 
 421                         8.2.1. Look for all records with a DT_QTYPE
 422                         value of "s". Verify that only the "s" type
 423                         records are returned.
 424 
 425                         8.2.2. Look for all records with DT_QTYPE value 
 426                         of "m". Verify that only the "m" type records
 427                         are returned.
 428 
 429                         8.2.3. Look for DT_QKEY of "atlantic". Verify
 430                         that only the macro "atlantic" is returned.
 431 
 432                         8.2.4. Look for DT_QKEY of i86pc and not a
 433                         DT_QTYPE of "m". Verify that only the macro
 434                         "i86pc" is returned.
 435 
 436                 8.3 Verify dhcp network container type.
 437 
 438                         8.2.1. Look for all records with a DN_QCIP
 439                         of <network address>+100. Verify that only
 440                         one record (with a cip of
 441                         <network address>+100)  is returned.
 442 
 443                         8.2.2. Look for all records with DN_QMACRO
 444                         value of "atlantic". Verify that all records
 445                         are returned ("records" == 3000). Note that
 446                         records returned may be in a different order
 447                         than they were added as part of case #7.
 448 
 449         Case #9 modify_dd_entry:
 450                 
 451                 9.1 Modify dhcptab container records
 452 
 453                         9.1.1 Using lookup_dd to find the record with a
 454                         DT_QKEY of "Sterm", change the name of the
 455                         record from "Sterm" to "sTERM". Use lookup_dd to
 456                         verify that the original record has been
 457                         renamed.
 458 
 459                         9.1.2 Using lookup_dd to find the record with a
 460                         DT_QKEY of "Solaris", change the value portion
 461                         of the record to be:
 462 
 463                         :SrootIP4=129.148.174.27:SrootNM="atlantic": \
 464                         :SinstIP4=129.148.174.27:SinstNM="atlantic": \
 465                         :sTERM="sun-cmd":BootSrvA=129.148.174.27:
 466 
 467                         Using lookup_dd, reexecute the lookup and verify
 468                         that the value portion of the record has been
 469                         modified correctly.
 470 
 471                 9.2 Modify dhcp network container records
 472 
 473                         9.2.1 Using lookup_dd to find the record with a
 474                         DN_QCIP of <network address>+10, change the
 475                         lease field to 1/1/2000 and the flags field to
 476                         MANUAL. Use lookup_dd to verify that the
 477                         original record has been changed.
 478 
 479                         9.2.2 Using lookup_dd to find the record with a
 480                         DN_QFLAGS of MANUAL. Change the dn_cid field
 481                         to 01080020FFFFFF, dn_flags field to
 482                         MANUAL+AUTOMATIC, dn_sip field to 172.23.0.77,
 483                         dn_lease field to -1, dn_macro field to "happy",
 484                         and the dn_comment field to "This is a test".
 485                         Use lookup_dd to verify that the original record
 486                         has been changed.
 487                 
 488 
 489         Case #10 delete_dd_entry:
 490 
 491                 10.1 Delete dhcptab container record
 492 
 493                         Using lookup_dd to find the record with a
 494                 DT_QKEY of SUNW.Ultra-1, delete this record. Verify
 495                 using lookup_dd that this record can no longer be found.
 496 
 497                 10.2 Delete dhcp network container record
 498 
 499                         Using lookup_dd to find the record with a
 500                 DN_QCIP of <network address>+101, delete this record.
 501                 Verify using lookup_dd that this record can no longer be
 502                 found.
 503 
 504         Case #11 close_dd:
 505 
 506                 11.1 Close the open instance of the dhcptab container.
 507                 Verify that close_dd returns DSVC_SUCCESS.
 508 
 509                 11.2 Close the open instance of the dhcp network
 510                 container <network address>. Verify that close_dd
 511                 returns DSVC_SUCCESS.
 512 
 513         Case #12 remove_dd:
 514 
 515                 12.1 Remove the dhcptab container. Verify that it no
 516                 longer exists using list_dd.
 517 
 518                 12.2 Remove the dhcp network container <network
 519                 address>. Verify that it no longer exists using list_dd.
 520 
 521 2.5 FULL TEST
 522 
 523         Description
 524                 
 525                 This test verifies that the dhcptab and dhcp network
 526         container API function calls respond correctly when presented with
 527         incorrect data. It also validates the MT-safeness of the API.
 528         The test suite should allow any number of concurrent threads or
 529         test suite processes to be invoked.
 530 
 531         Test Data
 532 
 533         Item                    Description             Application
 534         ====                    ===========             ===========
 535         <network address> IP address of           *_dn
 536                                 network. Ensure
 537                                 that appropriate
 538                                 subnet mask is
 539                                 available in
 540                                 netmasks(4).
 541                                 Candidate networks
 542                                 have to have at
 543                                 least 3000 hosts.
 544 
 545         dt records      As follows:                     *_dt
 546 
 547         SrootOpt s Vendor=SUNW.Ultra-1 SUNW.i86pc,1,ASCII,1,0
 548         SrootIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,2,IP,1,1
 549         SrootNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,3,ASCII,1,0
 550         SrootPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,4,ASCII,1,0
 551         SswapIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,5,IP,1,1
 552         SswapPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,6,ASCII,1,0
 553         SbootFIL s Vendor=SUNW.Ultra-1 SUNW.i86pc,7,ASCII,1,0
 554         Stz      s Vendor=SUNW.Ultra-1 SUNW.i86pc,8,ASCII,1,0
 555         SbootRS  s Vendor=SUNW.Ultra-1 SUNW.i86pc,9,NUMBER,2,1
 556         SinstIP4 s Vendor=SUNW.Ultra-1 SUNW.i86pc,10,IP,1,1
 557         SinstNM  s Vendor=SUNW.Ultra-1 SUNW.i86pc,11,ASCII,1,0
 558         SinstPTH s Vendor=SUNW.Ultra-1 SUNW.i86pc,12,ASCII,1,0
 559         SsysidCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,13,ASCII,1,0
 560         SjumpsCF s Vendor=SUNW.Ultra-1 SUNW.i86pc,14,ASCII,1,0
 561         Sterm    s Vendor=SUNW.Ultra-1 SUNW.i86pc,15,ASCII,1,0
 562         Locale   m :UTCoffst=-18000:
 563         Solaris  m :SrootIP4=129.148.174.27:SrootNM="atlantic": \
 564                :SinstIP4=129.148.174.27:SinstNM="atlantic": \
 565                :Sterm="xterm":BootSrvA=129.148.174.27:
 566         sparc    m \
 567 :SrootPTH="/export/s28/solaris1of2.s28s_wos/latest/Solaris_8/Tools/Boot": \
 568                :SinstPTH="/export/s28/solaris1of2.s28s_wos/latest":
 569         sun4u    m :Include=Solaris:Include=sparc:
 570         i86pc    m :Include=Solaris:SbootFIL="/platform/i86pc/kernel/unix": \
 571                    :SinstPTH="/export/s28/solaris1of2.s28x_wos/latest": \
 572 :SrootPTH="/export/s28/solaris1of2.s28x_wos/latest/Solaris_8/Tools/Boot":
 573         SUNW.i86pc m :Include=i86pc:
 574         SUNW.Ultra-1 m :SbootFIL="/platform/sun4u/kernel/sparcv9/unix": \
 575                        :Include=sun4u:
 576         <network address> m :Subnet=255.255.0.0:Router=172.21.0.2: \
 577                      :Broadcst=172.21.255.255:
 578         atlantic m :Include=Locale:Timeserv=129.148.174.27:LeaseTim=3600: \
 579                    :LeaseNeg:Hostname:DNSdmain="snt.east.sun.com": \
 580                    :DNSserv=172.21.0.1:
 581         010800207E8A02 m :Impress=172.22.255.27:
 582 
 583         
 584         <network address> Dhcp network container.         *_dn
 585 
 586         dn records              ~3000, as follows:              *_dn
 587 
 588         00 00 <network address>+6 172.21.0.2 0 atlantic
 589                         .
 590                         .
 591                         .
 592         00 00 <network address>+3006 172.21.0.2 0 atlantic
 593 
 594 
 595 
 596         Case #1 all API function calls:
 597 
 598                 1.1 Invalid arguments
 599 
 600                         Call each of the API functions with invalid
 601                 argument(s). For functions that take more than one
 602                 argument, call those functions once for each argument,
 603                 providing invalid data for each argument in turn.
 604                 Confirm that functions return DSVC_INVAL for all cases
 605                 but dhcpsvc_errmsg. This function should return a
 606                 string of "unknown".
 607 
 608                 1.2 No public modules (N/A for dhcpsvc_errmsg)
 609 
 610                         Call each of the API functions. Verify that
 611                 DSVC_ENOENT is returned.
 612 
 613                 1.3 Permission (N/A for dhcpsvc_errmsg)
 614 
 615                         Change the permission of the public module to be 
 616                 unreadable by any user (000).  Verify that DSVC_ACCESS
 617                 is returned. Restore permission of public module.
 618                 
 619         Case #2 status_dd:
 620 
 621                 2.1 Supporting data service not configured.
 622 
 623                         Verify that DSVC_SUCCESS is *not* returned.
 624                 Some public modules may not return the same error message
 625                 in this case. All should fail.
 626 
 627                 2.2 Configured data service, but unavailable.
 628 
 629                         Using a data service-specific method of making
 630                 the data service temporarily unavailable, call the
 631                 function. DSVC_BUSY or DSVC_INTERNAL (different depending
 632                 on implementation) is returned.
 633 
 634                 2.3 Configured data service, available.
 635 
 636                         Verify that DSVC_SUCCESS is returned.
 637 
 638         Case #3 open_dd:
 639 
 640                 Perform the following subcases once each for the dhcptab
 641         container and dhcp network container described in the test
 642         data.
 643                 
 644                 3.1 No container
 645 
 646                         Call function with DSVC_READ | DSVC_WRITE.
 647                 Verify that DSVC_NOENT is returned.
 648 
 649                 3.2 Basic
 650 
 651                         Using DSVC_CREATE | DSVC_READ | DSVC_WRITE,
 652                 create a dhcptab container and a dhcp network container
 653                 (called <network address>).
 654 
 655                 3.3 NON_BLOCK
 656 
 657                         Call function with DSVC_READ | DSVC_WRITE |
 658                 DSVC_NONBLOCK. Depending on whether the public module
 659                 supports it (see module doc), the function should return
 660                 either DSVC_SUCCESS or DSVC_UNSUPPORTED.
 661 
 662                 3.4 Container exists
 663 
 664                         Using DSVC_CREATE | DSVC_READ | DSVC_WRITE,
 665                 verify that the function returns DSVC_EXISTS.
 666 
 667                 Cleanup: Remove the containers using remove_dd.
 668 
 669         Case #4 list_dd:
 670 
 671                 4.1 No containers
 672 
 673                         Verify that list_dd returns DSVC_NOENT.
 674 
 675         Case #5 add_dd_entry:
 676 
 677                 Create and load containers as per Case #5 and Case
 678         #7 of the Basic Sanity Test.
 679 
 680                 5.1 Record exists
 681 
 682                         Attempt to add a test data record for the
 683                 dhcptab container and dhcp network container
 684                 respectively. Verify that DSVC_EXISTS is returned.
 685 
 686                 5.2 Busy
 687 
 688                         Close containers with close_dd. Reopen with
 689                 DSVC_NONBLOCK specified. If success is returned, using a
 690                 data service specific technique for making the service
 691                 busy, attempt to add an additional record to each of the
 692                 two containers. Verify that DSVC_BUSY is returned.
 693                 Remove the busy condition, and reattempt the add. Verify
 694                 that DSVC_SUCCESS is returned. close_dd the containers.
 695 
 696                 5.3 Read only
 697 
 698                         Reopen the containers with DSVC_READ access
 699                 only. If success is returned, attempt to add a new
 700                 record to each container. Verify that DSVC_ACCESS is
 701                 returned. close_dd the containers.
 702 
 703                 Cleanup: Remove the containers using remove_dd.
 704 
 705         Case #5 lookup_dd:
 706 
 707                 Create and load containers as per Case #5 and Case #7 of
 708         the Basic Sanity Test.
 709 
 710                 5.1. Record does not exist.
 711 
 712                         Produce dhcptab container and dhcp network
 713                 container queries that would not be satisfied by the
 714                 test data. Verify that DSVC_SUCCESS is returned, and
 715                 "records" is 0.
 716 
 717                 5.2 Busy
 718 
 719                         Close containers with close_dd. Reopen with
 720                 DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned,
 721                 using a data service specific technique for making
 722                 the service busy, attempt to perform a valid lookup of
 723                 records in each of the two containers. Verify that DSVC_BUSY
 724                 is returned.  Remove the busy condition, and reattempt
 725                 the lookups. Verify that DSVC_SUCCESS is returned, and
 726                 that data returned is valid. close_dd the containers.
 727 
 728                 5.3 Write only
 729 
 730                         Reopen the containers with DSVC_WRITE access
 731                 only. If success is returned, attempt to perform
 732                 lookup_dd's using any syntactically legal query for each
 733                 container type. Verify that DSVC_ACCESS is returned.
 734                 close_dd the containers.
 735 
 736                 Cleanup: Remove the containers using remove_dd.
 737 
 738         Case #6 modify_dd_entry:
 739                 
 740                 Create and load containers as per Case #5 and Case #7 of
 741         the Basic Sanity Test.
 742 
 743                 6.1 Unknown record
 744 
 745                         Fabricate dn_rec_t / dt_rec_t instances known not
 746                 to exist in the respective containers. Attempt to modify
 747                 the records. Verify that DSVC_NOENT is returned.
 748 
 749                 6.2 Update Collision #1
 750                         
 751                         Use lookup_dd to find valid dhcptab and dhcp
 752                 network container records (one each). Change the
 753                 signature on the resultant dt_rec_t / dn_rec_t. Attempt
 754                 to modify records. Verify that DSVC_COLLISION is returned.
 755 
 756                 6.3 Update Collision #2
 757 
 758                         Use lookup_dd to find valid dhcptab and dhcp
 759                 network container records (one each). Attempt to rename
 760                 the records to names which already exist (dt_key +
 761                 dt_type, dn_cip). Verify that DSVC_EXISTS is returned.
 762 
 763                 6.4 Busy
 764 
 765                         Close containers with close_dd. Reopen with
 766                 DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned,
 767                 acquire valid dhcptab and dhcp network container
 768                 records using lookup_dd. Using a data service specific
 769                 technique for making the service busy, attempt to
 770                 modify the value (non-key fields) of the records. Verify
 771                 that DSVC_BUSY is returned. Remove the busy condition,
 772                 and reattempt the modifies. Verify that DSVC_SUCCESS
 773                 is returned. Reacquire the records. Verify that the
 774                 contents have been suitably updated. close_dd the
 775                 containers.
 776 
 777                 6.5 Read only
 778 
 779                         Reopen the containers with DSVC_READ access
 780                 only. If success is returned, locate valid container
 781                 records using the appropriate queries to lookup_dd.
 782                 Modify the contents of a copy of the dt_rec_t /
 783                 dn_rec_t. Attempt to modify the record in the containers.
 784                 Verify that DSVC_ACCESS is returned. close_dd the
 785                 containers.
 786 
 787                 Cleanup: Remove the containers using remove_dd.
 788 
 789         Case #7 free_dd:
 790 
 791                 This function should be used to release the results of
 792         lookup_dd calls. Its operation must be validated by running this
 793         test suite under bcheck with -memuse, and ensuring that no free
 794         blocks remain after exit. Note that the test suite must be
 795         written with care to make this case useful (free any allocated
 796         memory before exit).
 797 
 798         Case #8 delete_dd_entry:
 799 
 800                 Create and load containers as per Case #5 and Case #7 of
 801         the Basic Sanity Test.
 802 
 803                 8.1 Unknown record
 804 
 805                         Fabricate dn_rec_t / dt_rec_t instances known not
 806                 to exist in the respective containers. Attempt to delete
 807                 the records. Verify that DSVC_NOENT is returned.
 808 
 809                 8.2 Busy
 810 
 811                         Close containers with close_dd. Reopen with
 812                 DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned,
 813                 acquire valid dhcptab and dhcp network container
 814                 records using lookup_dd. Using a data service specific
 815                 technique for making the service busy, attempt to
 816                 delete the records. Verify that DSVC_BUSY is returned.
 817                 Remove the busy condition, and reattempt the deletes.
 818                 Verify that DSVC_SUCCESS is returned. Attempt to
 819                 reacquire the records. Verify that the records have been
 820                 deleted. close_dd the containers.
 821 
 822                 8.3 Read only
 823 
 824                         Reopen the containers with DSVC_READ access
 825                 only. If success is returned, locate valid container
 826                 records using the appropriate queries to lookup_dd.
 827                 Attempt to delete the records in the containers.
 828                 Verify that DSVC_ACCESS is returned. close_dd the
 829                 containers.
 830 
 831                 Cleanup: Remove the containers using remove_dd.
 832 
 833         Case #9 close_dd:
 834 
 835                 9.1 Busy
 836 
 837                         Create containers as per Case #5 of the Basic
 838                 Sanity Test, with the exception that DSVC_NONBLOCK is
 839                 specified. If DSVC_SUCCESS is returned, using a data
 840                 service specific technique for making the service busy,
 841                 attempt to close the containers using the handles
 842                 returned by open_dd. Verify that DSVC_BUSY is returned.
 843                 Remove the busy condition, and reattempt the close_dd.
 844                 Verify that DSVC_SUCCESS is returned.
 845 
 846                 Cleanup: Remove the containers using remove_dd.
 847 
 848         Case #10 remove_dd:
 849 
 850                 Create containers as per Case #5 of the Basic Sanity Test.
 851 
 852                 10.1 Unknown container
 853 
 854                         Attempt to remove a non-existent dhcp network
 855                 container. Verify that DSVC_NOENT is returned.
 856 
 857                 10.2 Busy
 858 
 859                         Close containers with close_dd. Reopen with
 860                 DSVC_NONBLOCK specified. If DSVC_SUCCESS is returned,
 861                 using a data service specific technique for making the
 862                 service busy, attempt to remove the containers. Verify
 863                 that DSVC_BUSY is returned. Remove the busy condition,
 864                 close_dd the containers, and reattempt the removes.
 865                 Verify that DSVC_SUCCESS is returned. Verify using
 866                 list_dd that the containers have been removed.
 867 
 868         Case #11 Multi-access stress
 869 
 870                         The service provider layer modules underneath
 871                 the private layer are not required to manage reference
 872                 counts for open instances. So while individual private
 873                 layer handles are considered to be MT-safe (and parallel
 874                 access to data containers is suitably protected), an
 875                 application using the private layer API must synchronize
 876                 close and/or container remove operations among threads
 877                 such that no threads hold handles to a container after
 878                 the handle has been closed or the container has been
 879                 removed.
 880 
 881                         This case assumes a test which is
 882                 multi-threaded, and can run the following test using
 883                 from 1 to THREADS threads. The test can also be run in
 884                 multiple concurrent processes.
 885 
 886                         The goal of this test is to ensure that the API
 887                 is MT-safe with respect to the containers and the
 888                 records contained within those containers. This goal is
 889                 accomplished by verifying that the end result of the
 890                 test is consistent.
 891 
 892                         Tunable default values:
 893 
 894                                 PROCESSES: 20
 895                                 THREADS: 20
 896 
 897                 11.1 The dhcptab container test
 898 
 899                         11.1.1 open_dd
 900 
 901                                 Create a dhcptab using DSVC_CREATE |
 902                         DSVC_READ | DSVC_WRITE. If DSVC_EXISTS is
 903                         returned, retry the open attempt w/o the
 904                         DSVC_CREATE flag. Log that this event occurred.
 905                         Handle will be used for balance of test. If any
 906                         other error occurs, terminate the test as
 907                         failed.
 908 
 909                         11.1.2 add_dd_entry
 910 
 911                                 Add the test data records to the dhcptab
 912                         container. If DSVC_EXISTS is returned, skip that
 913                         record, and continue attempting to add the other
 914                         records. Log that this event occurred. If any
 915                         other error occurs, terminate the test as
 916                         failed.
 917 
 918                         11.1.3 lookup_dd
 919 
 920                                 Using DT_QKEY of "atlantic" and DT_QTYPE
 921                         of "m", find the atlantic record. Compare its
 922                         value against the test data. If it has
 923                         changed, then output a message to this affect.
 924                         If any error occurs, terminate the test as failed.
 925 
 926                         11.1.4 modify_dd_entry
 927 
 928                                 Using the results of 11.1.3, change the
 929                         record as follows. If it is no different from
 930                         the test data, change the value to:
 931 
 932                 :Timeserv=129.148.174.28:LeaseTim=86400: \
 933                 :Hostname:DNSdmain="east.sun.com":DNSserv=172.23.3.3:
 934 
 935                                 If it doesn't match the test data
 936                         value, change the LeaseTim by incrementing it by
 937                         one. Attempt to update the record. If it fails
 938                         with DSVC_COLLISION, retry 11.1.3 and 11.1.4 for
 939                         three attempts. Log message if modify was
 940                         unsuccessful. If any other error occurs,
 941                         terminate the test as failed.
 942 
 943                         11.1.5 delete_dd_entry
 944 
 945                                 Use lookup_dd to find a DT_QKEY of
 946                         "SjumpsCF" and a  DT_QTYPE of "s". If it does
 947                         not exist, log a message. If it does exist,
 948                         attempt to delete it. If DSVC_NOENT is returned,
 949                         log a message.
 950 
 951                         11.1.6 close_dd
 952 
 953                                 Use close_dd to close the open handle.
 954                         If DSVC_NOENT is returned, log a message.
 955 
 956                         11.1.7 epilogue
 957                                 
 958                                 Compare the resultant dhcptab container
 959                         to the test data. The only differences should be
 960                         a changed value of the atlantic macro as
 961                         expected from 11.1.4 and the SjumpsCF symbol
 962                         should be removed. Any other inconsistency means
 963                         the test has failed.
 964 
 965                         Clean up: Remove the dhcptab container.
 966 
 967                 11.2 The dhcp network container test
 968 
 969                         11.2.1 open_dd
 970 
 971                                 Create a <network address> dhcp network
 972                         container using DSVC_CREATE | DSVC_READ | DSVC_WRITE.
 973                         If DSVC_EXISTS is returned, retry the open
 974                         attempt w/o the DSVC_CREATE flag. Log that this
 975                         event occurred. Handle will be used for balance
 976                         of test. If any other error occurs, terminate
 977                         the test as failed.
 978 
 979                         11.2.2 add_dd_entry
 980 
 981                                 Add the test data records to the dhcp
 982                         network container. If DSVC_EXISTS is
 983                         returned, skip that record, and continue
 984                         attempting to add the other records. Log that
 985                         this event occurred. If any other error occurs,
 986                         terminate the test as failed.
 987 
 988                         11.2.3 lookup_dd
 989 
 990                                 Find the DN_QCIP of <network address>+102
 991                         record. Compare its value against the test data.
 992                         If it has changed, then output a message to this
 993                         affect. If any error occurs, terminate the test
 994                         as failed.  
 995 
 996                         11.2.4 modify_dd_entry
 997 
 998                                 Using the results of 11.2.3, change the
 999                         record as follows. If it is no different from
1000                         the test data, change the value to:
1001 
1002 01DEADBEEF 03 <network address>+102 172.23.3.3 941619403 Solaris
1003 
1004                                 If it doesn't match the test data
1005                         value, change dn_lease by incrementing it by
1006                         one. Attempt to update the record. If it fails
1007                         with DSVC_COLLISION, retry 11.2.3 and 11.2.4 for
1008                         three attempts. Log message if modify was
1009                         unsuccessful.  If any other error occurs,
1010                         terminate the test as failed.
1011 
1012                         11.2.5 delete_dd_entry
1013 
1014                                 Use lookup_dd to find a DN_QCIP of
1015                         <network address>+1001. If it does not exist,
1016                         log a message. If it does exist, attempt to
1017                         delete it. If DSVC_NOENT is returned, log a
1018                         message.
1019 
1020                         11.2.6 close_dd
1021 
1022                                 Use close_dd to close the open handle.
1023                         If DSVC_NOENT is returned, log a message.
1024 
1025                         11.2.7 epilogue
1026                                 
1027                                 The <network address> dhcp network
1028                         container should be consistent at the end of
1029                         a test run. The only differences should be a
1030                         changed value of the <network address>+102
1031                         record with the value as per 11.2.4 and the
1032                         lease time potentially incremented, as well as
1033                         the <network address>+1001 record missing. 
1034                         Any other inconsistency means the test has
1035                         failed.
1036 
1037                         Cleanup: remove <network address> dhcp network
1038                 container.
1039 
1040                 11.3 Multi-process run
1041 
1042                         Run 11.1 and 11.2 in PROCESSES separate
1043                 processes.
1044 
1045                 11.4 Multi-threaded run, single process
1046 
1047                         Run 11.1 and 11.2 in THREADS separate threads
1048                 within a single process.
1049 
1050                 11.5 Multi-process, Multi-threaded run
1051 
1052                         Run 11.1 and 11.2 in PROCESSES separate
1053                 processes  each spawning THREADS separate threads.
1054 
1055 REFERENCES
1056 
1057         [1] "Enterprise DHCP Service Architecture Specification", mwc,
1058             6/25/1999.
1059 
1060         [2] "Enterprise Reference Hardware Platforms", mwc, 10/23/1999.