(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TYPES)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'control out in' span_id:51))}
          spids: [49]
        )
      ]
    )
    (C {(declare)} {(-i)} {(COUNT)} {(BUFLEN)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COUNT)
          op: assign_op.Equal
          rhs: {(50000)}
          spids: [95]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BUFLEN)
          op: assign_op.Equal
          rhs: {(2048)}
          spids: [98]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$DEVICE'))} {(Id.Lit_Equals '=')} {(DQ )} 
                  {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:124)
            )
          ]
          action: [
            (C {(echo)} {(DQ ('testing ALL recognized usbtest devices'))})
            (C {(echo)} {(DQ )})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:TEST_ARGS)
                  op: assign_op.Equal
                  rhs: {(DQ (-a))}
                  spids: [142]
                )
              ]
            )
          ]
          spids: [110 126]
        )
      ]
      else_action: [
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:TEST_ARGS)
              op: assign_op.Equal
              rhs: {(DQ )}
              spids: [150]
            )
          ]
        )
      ]
    )
    (command.ShFunction
      name: do_test
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [
                            {(./testusb)}
                            {($ Id.VSub_DollarName '$TEST_ARGS')}
                            {(-s)}
                            {($ Id.VSub_DollarName '$BUFLEN')}
                            {(-c)}
                            {($ Id.VSub_DollarName '$COUNT')}
                            {($ Id.VSub_Star '$*')}
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'2>' span_id:183)
                              fd: 2
                              arg_word: {(/dev/null)}
                            )
                          ]
                        )
                      ]
                      negated: T
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ (FAIL))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:197)
                      arg_word: {(1)}
                    )
                  ]
                  spids: [165 187]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ARGS)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_Star '$*'))}
          spids: [207]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$ARGS'))} {(Id.Lit_Equals '=')} {(DQ )} 
                  {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:227)
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ARGS)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$TYPES'))}
                  spids: [232]
                )
              ]
            )
          ]
          spids: [213 229]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CONFIG)
          op: assign_op.Equal
          rhs: {(SQ )}
          spids: [247]
        )
      ]
    )
    (command.ShFunction
      name: check_config
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$CONFIG'))} 
                          {(Id.Lit_Equals '=')} {(DQ )} {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:274)
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:CONFIG)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [279]
                        )
                      ]
                    )
                    (C {(echo)} {(DQ ('assuming ') ($ Id.VSub_DollarName '$CONFIG') (' configuration'))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Return val:return span_id:292)
                    )
                  ]
                  spids: [260 276]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$CONFIG'))} 
                          {(Id.Lit_Equals '=')} {($ Id.VSub_Number '$1')} {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:311)
                    )
                  ]
                  action: [
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Return val:return span_id:316)
                    )
                  ]
                  spids: [298 313]
                )
              ]
            )
            (C {(echo)} 
              {
                (DQ ('** device must be in ') ($ Id.VSub_Number '$1') (" config, but it's ") 
                  ($ Id.VSub_DollarName '$CONFIG') (' instead')
                )
              }
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:334)
              arg_word: {(1)}
            )
          ]
        )
    )
    (C {(echo)} {(DQ ('TESTING:  ') ($ Id.VSub_DollarName '$ARGS'))})
    (command.WhileUntil
      keyword: (Token id:Id.KW_While val:while span_id:350)
      cond: [(C {(Id.Lit_Other ':')} {(true)})]
      body: 
        (command.DoGroup
          children: [
            (C {(echo)} 
              {
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:361)
                  command_list: (command.CommandList children:[(C {(date)})])
                )
              }
            )
            (command.ForEach
              iter_name: TYPE
              iter_words: [{($ Id.VSub_DollarName '$ARGS')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:COUNT)
                          op: assign_op.Equal
                          rhs: {(5000)}
                          spids: [383]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:BUFLEN)
                          op: assign_op.Equal
                          rhs: {(2048)}
                          spids: [387]
                        )
                      ]
                    )
                    (command.Case
                      to_match: {($ Id.VSub_DollarName '$TYPE')}
                      arms: [
                        (case_arm
                          pat_list: [{(control)}]
                          action: [
                            (C {(echo)} 
                              {(SQ (Token id:Id.Lit_Chars val:'** Control test cases:' span_id:423))}
                            )
                            (C {(echo)} {(DQ ('test 9: ch9 postconfig'))})
                            (C {(do_test)} {(-t)} {(9)} {(-c)} {(5000)})
                            (C {(echo)} {(DQ ('test 10: control queueing'))})
                            (C {(do_test)} {(-t)} {(10)} {(-c)} {(5000)})
                            (C {(echo)} {(DQ ('test 14: control writes'))})
                            (C {(do_test)} {(-t)} {(14)} {(-c)} {(15000)} {(-s)} {(256)} {(-v)} {(1)})
                            (C {(echo)} {(DQ ('test 21: control writes, unaligned'))})
                            (C {(do_test)} {(-t)} {(21)} {(-c)} {(100)} {(-s)} {(256)} {(-v)} {(1)})
                          ]
                          spids: [412 413 523 -1]
                        )
                        (case_arm
                          pat_list: [{(out)}]
                          action: [
                            (C {(check_config)} {(sink-src)})
                            (C {(echo)} 
                              {
                                (SQ 
                                  (Token
                                    id: Id.Lit_Chars
                                    val: '** Host Write (OUT) test cases:'
                                    span_id: 539
                                  )
                                )
                              }
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 1: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, same size')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(1)})
                            (C {(echo)} 
                              {
                                (DQ ('test 3: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, variable/short size')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(3)} {(-v)} {(421)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(100)}
                                  spids: [581]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 17: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, unaligned DMA map by core')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(17)})
                            (C {(echo)} 
                              {
                                (DQ ('test 19: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, unaligned DMA map by usb_alloc_coherent')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(19)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(2000)}
                                  spids: [619]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 5: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' scatterlists, same size entries')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(5)})
                            (C {(echo)} 
                              {
                                (DQ ('test 7a: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' scatterlists, variable size/short entries')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(7)} {(-v)} {(579)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(4096)}
                                  spids: [664]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 7b: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' scatterlists, variable size/bigger entries')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(7)} {(-v)} {(41)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(64)}
                                  spids: [688]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 7c: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' scatterlists, variable size/micro entries')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(7)} {(-v)} {(63)})
                          ]
                          spids: [527 528 712 -1]
                        )
                        (case_arm
                          pat_list: [{(iso-out)}]
                          action: [
                            (C {(check_config)} {(sink-src)})
                            (C {(echo)} 
                              {
                                (SQ 
                                  (Token
                                    id: Id.Lit_Chars
                                    val: '** Host ISOCHRONOUS Write (OUT) test cases:'
                                    span_id: 728
                                  )
                                )
                              }
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(24500)}
                                  spids: [745]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(1000)}
                                  spids: [750]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 15: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, same size')
                                )
                              }
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(32768)}
                                  spids: [772]
                                )
                              ]
                            )
                            (C {(do_test)} {(-t)} {(15)} {(-g)} {(8)} {(-v)} {(0)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(100)}
                                  spids: [801]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 22: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, non aligned')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(22)} {(-g)} {(8)} {(-v)} {(0)})
                          ]
                          spids: [716 717 830 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.KW_In in)}]
                          action: [
                            (C {(check_config)} {(sink-src)})
                            (C {(echo)} 
                              {
                                (SQ 
                                  (Token
                                    id: Id.Lit_Chars
                                    val: '** Host Read (IN) test cases:'
                                    span_id: 846
                                  )
                                )
                              }
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 2: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, same size')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(2)})
                            (C {(echo)} 
                              {
                                (DQ ('test 4: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, variable size')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(4)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(100)}
                                  spids: [893]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 18: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, unaligned DMA map by core')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(18)})
                            (C {(echo)} 
                              {
                                (DQ ('test 20: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, unaligned DMA map by usb_alloc_coherent')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(20)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(2000)}
                                  spids: [931]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 6: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' scatterlists, same size entries')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(6)})
                            (C {(echo)} 
                              {
                                (DQ ('test 8: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' scatterlists, variable size entries')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(8)})
                          ]
                          spids: [834 835 967 -1]
                        )
                        (case_arm
                          pat_list: [{(iso-in)}]
                          action: [
                            (C {(check_config)} {(sink-src)})
                            (C {(echo)} 
                              {
                                (SQ 
                                  (Token
                                    id: Id.Lit_Chars
                                    val: '** Host ISOCHRONOUS Read (IN) test cases:'
                                    span_id: 983
                                  )
                                )
                              }
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(24500)}
                                  spids: [1000]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(1000)}
                                  spids: [1005]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 16: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, same size')
                                )
                              }
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(32768)}
                                  spids: [1027]
                                )
                              ]
                            )
                            (C {(do_test)} {(-t)} {(16)} {(-g)} {(8)} {(-v)} {(0)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(100)}
                                  spids: [1056]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {
                                (DQ ('test 23: ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' transfers, unaligned')
                                )
                              }
                            )
                            (C {(do_test)} {(-t)} {(23)} {(-g)} {(8)} {(-v)} {(0)})
                          ]
                          spids: [971 972 1085 -1]
                        )
                        (case_arm
                          pat_list: [{(halt)}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(2000)}
                                  spids: [1109]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {(DQ ('test 13: ') ($ Id.VSub_DollarName '$COUNT') (' halt set/clear'))}
                            )
                            (C {(do_test)} {(-t)} {(13)})
                          ]
                          spids: [1089 1090 1129 -1]
                        )
                        (case_arm
                          pat_list: [{(unlink)}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(2000)}
                                  spids: [1137]
                                )
                              ]
                            )
                            (C {(echo)} 
                              {(DQ ('test 11: ') ($ Id.VSub_DollarName '$COUNT') (' read unlinks'))}
                            )
                            (C {(do_test)} {(-t)} {(11)})
                            (C {(echo)} 
                              {(DQ ('test 12: ') ($ Id.VSub_DollarName '$COUNT') (' write unlinks'))}
                            )
                            (C {(do_test)} {(-t)} {(12)})
                          ]
                          spids: [1133 1134 1174 -1]
                        )
                        (case_arm
                          pat_list: [{(loop)}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BUFLEN)
                                  op: assign_op.Equal
                                  rhs: {(2048)}
                                  spids: [1186]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:COUNT)
                                  op: assign_op.Equal
                                  rhs: {(32)}
                                  spids: [1190]
                                )
                              ]
                            )
                            (C {(check_config)} {(loopback)})
                            (C {(echo)} 
                              {
                                (DQ ('write ') ($ Id.VSub_DollarName '$COUNT') (' buffers of ') 
                                  ($ Id.VSub_DollarName '$BUFLEN') (' bytes, read them back')
                                )
                              }
                            )
                            (C {(echo)} 
                              {
                                (DQ ('write ') ($ Id.VSub_DollarName '$COUNT') 
                                  (' variable size buffers, read them back')
                                )
                              }
                            )
                          ]
                          spids: [1178 1179 1232 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (C {(echo)} 
                              {(DQ ("Don't understand test type ") ($ Id.VSub_DollarName '$TYPE'))}
                            )
                            (command.Sentence
                              child: 
                                (command.ControlFlow
                                  token: (Token id:Id.ControlFlow_Exit val:exit span_id:1248)
                                  arg_word: {(1)}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:1251)
                            )
                          ]
                          spids: [1236 1237 -1 1254]
                        )
                      ]
                    )
                    (C {(echo)} {(SQ )})
                  ]
                )
            )
          ]
        )
    )
  ]
)