Specification of test zones for the CNAME functions in Recursor.pm

Table of contents

Background

See the test zone README file which is for test case base test zones. Since this specifies test zones for code it is not fully applicable.

Test scenarios

The purpose of the test scenarios is to cover all reasonable contexts where the code should be tested.

Test zone name

The test zone for these scenarios is cname.recursor.engine.xa. Subdomain and subzones are created. The names are given in section "Zone setup for test scenarios" below.

Test scenarios

Scenario nameExpected output
GOOD-CNAME-1True and tags CNAME_START, CNAME_FOLLOWED_IN_ZONE
GOOD-CNAME-2True and tags CNAME_START, CNAME_FOLLOWED_IN_ZONE
GOOD-CNAME-CHAINTrue and tags CNAME_START, CNAME_FOLLOWED_IN_ZONE
GOOD-CNAME-OUT-OF-ZONETrue and tags CNAME_START, CNAME_FOLLOWED_OUT_OF_ZONE
NXDOMAIN-VIA-CNAMETrue and tags CNAME_START, CNAME_FOLLOWED_OUT_OF_ZONE
NODATA-VIA-CNAMETrue and tags CNAME_START, CNAME_FOLLOWED_OUT_OF_ZONE
MULT-CNAMEUndefined and tags CNAME_START, CNAME_MULTIPLE_FOR_NAME
LOOPED-CNAME-IN-ZONE-1Undefined and tags CNAME_START, CNAME_LOOP_INNER
LOOPED-CNAME-IN-ZONE-2Undefined and tags CNAME_START, CNAME_LOOP_INNER
LOOPED-CNAME-IN-ZONE-3Undefined and tags CNAME_START, CNAME_LOOP_INNER
LOOPED-CNAME-OUT-OF-ZONEUndefined and tags CNAME_START, CNAME_LOOP_OUTER
TOO-LONG-CNAME-CHAINUndefined and tags CNAME_START, CNAME_RECORDS_TOO_MANY
TARGET-NO-MATCH-CNAMEUndefined and tags CNAME_START, CNAME_NO_MATCH
BROKEN-CNAME-CHAINUndefined and tags CNAME_START, CNAME_RECORDS_CHAIN_BROKEN
WRONG-CNAME-OWNER-NAMEFalse and no tags
EXTRA-CNAME-IN-ANSWERFalse and no tags

Zone setup for test scenarios

Assumptions for the scenario specifications, unless stated otherwise for the specific scenario:

  • The cname.recursor.engine.xa zone is used for all scenarios.
  • Relative names are under cname.recursor.engine.xa..
  • The query name is given by the scenario.
  • Query type is assumed to be A.
  • In the zone, the query name always has a CNAME record.
  • The zone is set up on one NS, ns1.
  • The RCODE Name in the response is NoError.

GOOD-CNAME-1

The query name will resolve to one A record via one CNAME.

  • Query name: "good-cname-1.cname.recursor.engine.xa"
    • To be found in the answer section:
   good-cname-1         CNAME good-cname-1-target 
   good-cname-1-target  A     127.0.0.1

GOOD-CNAME-2

The query name will resolve to two A record via one CNAME.

  • Query name: "good-cname-2.cname.recursor.engine.xa"
    • To be found in the answer section:
   good-cname-2         CNAME good-cname-2-target
   good-cname-2-target  A     127.0.0.1
   good-cname-2-target  A     127.0.0.2

GOOD-CNAME-CHAIN

The query name will resolve to two A record via three CNAME.

  • Query name: "good-cname-chain.cname.recursor.engine.xa"
    • To be found in the answer section:
   good-cname-chain         CNAME good-cname-chain-two
   good-cname-chain-two     CNAME good-cname-chain-three
   good-cname-chain-three   CNAME good-cname-chain-target
   good-cname-chain-target  A     127.0.0.1

GOOD-CNAME-OUT-OF-ZONE

The query name will resolve to an A record via a CNAME in the zone with a target that points at a subzone, and a delegation to that sub zone.

  • For all queries

    • The two zones, cname.recursor.engine.xa and goodsub.cname.recursor.engine.xa, are hosted on different IP addresses.
    • "x", "y" and "z" in the IP addresses in the configuration below are to be set in the configuration of the test zones.
  • Query name: "good-cname-out-of-zone.cname.recursor.engine.xa"

    • Servers: NS of cname.recursor.engine.xa.
    • Answer, authority and additional sections, respectively, to be found in the response:
   ;; ANSWER SECTION:
   good-cname-out-of-zone  CNAME target.goodsub

   ;; AUTHORITY SECTION:
   goodsub                 NS    ns1.goodsub

   ;; ADDITIONAL SECTION:
   ns1.goodsub             A     127.x.y.z
   ns1.goodsub             AAAA  fda1:b2:c3::127:x:y:z
  • Query name: "target.goodsub.cname.recursor.engine.xa"
    • Servers: NS of goodsub.cname.recursor.engine.xa.
    • To be found in the answer section:
   target.goodsub          A     127.0.0.1

NXDOMAIN-VIA-CNAME

The query name exists, but as CNAME record. The target name of CNAME does not exist.

  • Query name: "nxdomain-via-cname.cname.recursor.engine.xa"
    • The RCODE Name in the response is NxDomain.
    • The target of the CNAME, nxdomain-via-cname-target does not exist in the zone and is not delegated.
    • SOA of "cname.recursor.engine.xa" to be found in authority section.
    • To be found in the answer section:
   nxdomain-via-cname       CNAME nxdomain-via-cname-target

NODATA-VIA-CNAME

The query name exists, but as CNAME record. The target name of CNAME exists, but not with any A record.

  • Query name: "nodata-via-cname.cname.recursor.engine.xa"
    • The target of the CNAME, nodata-via-cname-target, exists in the zone but has neither A or CNAME record, and is not delegated.
    • SOA of "cname.recursor.engine.xa" to be found in authority section.
    • To be found in the answer section:
   nodata-via-cname       CNAME nodata-via-cname-target

MULT-CNAME

The query name exists, but as CNAME, as two CNAME records.

  • Query name: "mult-cname.cname.recursor.engine.xa"
    • To be found in the answer section:
   mult-cname            CNAME mult-cname-target-1
   mult-cname            CNAME mult-cname-target-2
   mult-cname-target-1   A     127.0.0.1
   mult-cname-target-2   A     127.0.0.2

LOOPED-CNAME-IN-ZONE-1

The query name will point at a CNAME record with the same target as owner name.

  • Query name: "looped-cname-in-zone-1.cname.recursor.engine.xa"
    • To be found in the answer section:
   looped-cname-in-zone-1 CNAME looped-cname-in-zone-1

LOOPED-CNAME-IN-ZONE-2

The query name will point at a CNAME, which points at a second CNAME, which points to a third CNAME whose target name is the same as the owner name of the second CNAME.

  • Query name: "looped-cname-in-zone-2.cname.recursor.engine.xa"
    • To be found in the answer section:
   looped-cname-in-zone-2    CNAME looped-cname-in-zone-2-a
   looped-cname-in-zone-2-a  CNAME looped-cname-in-zone-2-b
   looped-cname-in-zone-2-b  CNAME looped-cname-in-zone-2-a

LOOPED-CNAME-IN-ZONE-3

The query name will point at a CNAME, which points at a second CNAME whose target name is the same as the owner name of the first CNAME.

  • Query name: "looped-cname-in-zone-3.cname.recursor.engine.xa"
    • To be found in the answer section:
   looped-cname-in-zone-3       CNAME looped-cname-in-zone-3-next
   looped-cname-in-zone-3-next  CNAME looped-cname-in-zone-3

LOOPED-CNAME-OUT-OF-ZONE

The query name will point at a CNAME record, but in a sub zone, and the target name of the CNAME record will point at another CNAME record in another sub zone, and the target name of the second CNAME record will point at the first.

  • For all four queries

    • The three zones cname.recursor.engine.xa, sub2.cname.recursor.engine.xa and sub3.cname.recursor.engine.xa are hosted on different IP addresses.
    • "x", "y" and "z" in the IP addresses in the configuration below are to be set in the configuration of the test zones.
  • Query name: "looped-cname-out-of-zone.sub2.cname.recursor.engine.xa"

    • Servers: NS of cname.recursor.engine.xa.
    • Authority and additional sections, respectively, to be found in the response:
   ;; AUTHORITY SECTION:
   sub2          NS    ns1.sub2

   ;; ADDITIONAL SECTION:
   ns1.sub2      A     127.x.y.z
   ns1.sub2      AAAA  fda1:b2:c3::127:x:y:z
  • Query name: "looped-cname-out-of-zone.sub2.cname.recursor.engine.xa"
    • Servers: NS of sub2.cname.recursor.engine.xa.
    • To be found in the answer section:
   looped-cname-out-of-zone.sub2   CNAME   looped-cname-out-of-zone.sub3
  • Query name: "looped-cname-out-of-zone.sub3.cname.recursor.engine.xa"
    • Servers: NS of cname.recursor.engine.xa.
    • Relative names are under cname.recursor.engine.xa..
    • Authority and additional sections, respectively, to be found in the response:
   ;; AUTHORITY SECTION:
   sub3          NS    ns1.sub3

   ;; ADDITIONAL SECTION:
   ns1.sub3      A     127.x.y.z
   ns1.sub3      AAAA  fda1:b2:c3::127:x:y:z
  • Query name: "looped-cname-out-of-zone.sub3.cname.recursor.engine.xa"
    • Servers: NS of sub3.cname.recursor.engine.xa.
    • To be found in the answer section:
   looped-cname-out-of-zone.sub3   CNAME   looped-cname-out-of-zone.sub2

TOO-LONG-CNAME-CHAIN

The query name will resolve to one A record via ten CNAME records which is above the limit.

  • Query name: "too-long-cname-chain.cname.recursor.engine.xa"
    • To be found in the answer section:
   too-long-cname-chain              CNAME too-long-cname-chain-two
   too-long-cname-chain-two          CNAME too-long-cname-chain-three
   too-long-cname-chain-three        CNAME too-long-cname-chain-four
   too-long-cname-chain-four         CNAME too-long-cname-chain-five
   too-long-cname-chain-five         CNAME too-long-cname-chain-six
   too-long-cname-chain-six          CNAME too-long-cname-chain-seven
   too-long-cname-chain-seven        CNAME too-long-cname-chain-eight
   too-long-cname-chain-eight        CNAME too-long-cname-chain-nine
   too-long-cname-chain-nine         CNAME too-long-cname-chain-ten
   too-long-cname-chain-ten          CNAME too-long-cname-chain-target
   too-long-cname-chain-target       A     127.0.0.1

TARGET-NO-MATCH-CNAME

The CNAME target name does not match the owner name of the A record.

  • Query name: "target-no-match-cname.cname.recursor.engine.xa"
    • To be found in the answer section:
   target-no-match-cname         CNAME  target-no-match-cname-two
   target-no-match-cname-target  A      127.0.0.1

BROKEN-CNAME-CHAIN

The CNAME chain is broken between first and second CNAME records.

  • Query name: "broken-cname-chain.cname.recursor.engine.xa"
    • To be found in the answer section:
   broken-cname-chain            CNAME broken-cname-chain-two
   broken-cname-chain-three      CNAME broken-cname-chain-target
   broken-cname-chain-target     A     127.0.0.1

WRONG-CNAME-OWNER-NAME

The owner name of the CNAME in the response does not match query name.

  • Query name: "wrong-cname-owner-name.cname.recursor.engine.xa"
    • To be found in the answer section:
   wrong-cname-owner-name-1       CNAME wrong-cname-owner-name-target
   wrong-cname-owner-name-target  A     127.0.0.1

EXTRA-CNAME-IN-ANSWER

There is an extra CNAME record with an owner name not matching the query name besides the A record matching query name.

  • Query name: "extra-cname-in-answer.cname.recursor.engine.xa"
    • To be found in the answer section:
   extra-cname-in-answer         A     127.0.0.1
   extra-cname-in-answer-1       CNAME extra-cname-in-answer-2