(command.CommandList
  children: [
    (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> <unix> <Id.Lit_Colon ':'> <'//commsock'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DEBUG)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: <Id.VSub_Name DEBUG>
                suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{<false>})
              )
            }
          spids: [87]
        )
      ]
    )
    (command.ShFunction
      name: run_test
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'name='> (DQ ($ Id.VSub_Number '$1'))})
            (C {<local>} {<Id.Lit_VarLike 'opts='> (DQ ($ Id.VSub_Number '$2'))})
            (C {<local>} 
              {<Id.Lit_VarLike 'mcast='> 
                (DQ (command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<atf_get_srcdir>})) 
                  <'/mcast'>
                )
              }
            )
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMP_SERVER')} {<netinet6>})
            (C {<rump_server_add_iface>} {($ Id.VSub_DollarName '$RUMP_SERVER')} {<shmif0>} {<bus1>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<shmif0>} {<'10.0.0.2/24'>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<shmif0>} {<inet6>} {<fc00> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <'2/64'>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<shmif0>} {<up>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<-w>} {<10>}
            )
            (C {<atf_check>} {<-s>} {<not-exit> <Id.Lit_Colon ':'> <0>} {<-x>} 
              {(DQ <'rump.ifconfig shmif0 |grep -q tentative'>)}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<ignore>} 
              {<rump.route>} {<add>} {<default>} {<10.0.0.1>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<ignore>} 
              {<rump.route>} {<add>} {<-inet6>} {<default>} {<fc00> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <1>}
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<rump.ifconfig>})]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<rump.netstat>} {<-nr>})]
            )
            (C {<export>} {<Id.Lit_VarLike 'LD_PRELOAD='> <'/usr/lib/librumphijack.so'>})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (C {($ Id.VSub_DollarName '$DEBUG')})
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {($ Id.VSub_DollarName '$mcast')} {<-d>} {(${ Id.VSub_Name opts)}
                    )
                  ]
                  spids: [307 312]
                )
              ]
              else_action: [
                (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
                  {($ Id.VSub_DollarName '$mcast')} {(${ Id.VSub_Name opts)}
                )
              ]
            )
            (C {<unset>} {<LD_PRELOAD>})
          ]
        )
    )
    (command.ShFunction
      name: add_test
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'name='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'opts='> (DQ ($ Id.VSub_Number '$2'))})
            (C {<local>} {<Id.Lit_VarLike 'desc='> (DQ ($ Id.VSub_Number '$3'))})
            (C {<atf_test_case>} {(DQ <mcast_> (${ Id.VSub_Name name))} {<cleanup>})
            (C {<eval>} 
              {
                (DQ <mcast_> (${ Id.VSub_Name name) <'_head() { '> <'\t\t\tatf_set '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <descr> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (${ Id.VSub_Name desc) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'; '> 
                  <'\t\t\tatf_set '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <require.progs> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <rump_server> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'; '> <'\t\t}; '> <'\t    mcast_'> (${ Id.VSub_Name name) <'_body() { '> <'\t\t\trun_test '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (${ Id.VSub_Name name) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (${ Id.VSub_Name opts) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'; '> 
                  <'\t\t\trump_server_destroy_ifaces; '> <'\t\t}; '> <'\t    mcast_'> (${ Id.VSub_Name name) <'_cleanup() { '> <'\t\t\t'> (${ Id.VSub_Name DEBUG) 
                  <' && dump; '> <'\t\t\tcleanup; '> <'\t\t}'>
                )
              }
            )
            (C {<atf_add_test_case>} {(DQ <mcast_> (${ Id.VSub_Name name))})
          ]
        )
    )
    (command.ShFunction
      name: atf_init_test_cases
      body: 
        (BraceGroup
          children: [
            (C {<add_test>} {<conninet4>} {(DQ <'-c -4'>)} {(DQ <'Checks connected multicast for ipv4'>)})
            (C {<add_test>} {<connmappedinet4>} {(DQ <'-c -m -4'>)} 
              {(DQ <'Checks connected multicast for mapped ipv4'>)}
            )
            (C {<add_test>} {<connmappedbuginet4>} {(DQ <'-c -m -b -4'>)} 
              {(DQ <'Checks connected multicast for mapped ipv4 using the v4 ioctls'>)}
            )
            (C {<add_test>} {<conninet6>} {(DQ <'-c -6'>)} {(DQ <'Checks connected multicast for ipv6'>)})
            (C {<add_test>} {<unconninet4>} {(DQ <-4>)} {(DQ <'Checks unconnected multicast for ipv4'>)})
            (C {<add_test>} {<unconnmappedinet4>} {(DQ <'-m -4'>)} 
              {(DQ <'Checks unconnected multicast for mapped ipv4'>)}
            )
            (C {<add_test>} {<unconnmappedbuginet4>} {(DQ <'-m -b -4'>)} 
              {(DQ <'Checks unconnected multicast for mapped ipv4 using the v4 ioctls'>)}
            )
            (C {<add_test>} {<unconninet6>} {(DQ <-6>)} {(DQ <'Checks unconnected multicast for ipv6'>)})
          ]
        )
    )
  ]
)