(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'external credential helper tests\n' span_id:6) 
                (Token id:Id.Lit_Chars val:'\n' span_id:7) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This is a tool for authors of external helper tools to sanity-check\n'
                  span_id: 8
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'their helpers. If you have written the "git-credential-foo" helper,\n'
                  span_id: 9
                ) (Token id:Id.Lit_Chars val:'you check it with:\n' span_id:10) 
                (Token id:Id.Lit_Chars val:'\n' span_id:11) 
                (Token
                  id: Id.Lit_Chars
                  val: '  make GIT_TEST_CREDENTIAL_HELPER=foo t0303-credential-external.sh\n'
                  span_id: 12
                ) (Token id:Id.Lit_Chars val:'\n' span_id:13) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This assumes that your helper is capable of both storing and\n'
                  span_id: 14
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'retrieving credentials (some helpers may be read-only, and they will\n'
                  span_id: 15
                ) (Token id:Id.Lit_Chars val:'fail these tests).\n' span_id:16) 
                (Token id:Id.Lit_Chars val:'\n' span_id:17) 
                (Token
                  id: Id.Lit_Chars
                  val: 'Please note that the individual tests do not verify all of the\n'
                  span_id: 18
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'preconditions themselves, but rather build on each other. A failing\n'
                  span_id: 19
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'test means that tests later in the sequence can return false "OK"\n'
                  span_id: 20
                ) (Token id:Id.Lit_Chars val:'results.\n' span_id:21) (Token id:Id.Lit_Chars val:'\n' span_id:22) 
                (Token
                  id: Id.Lit_Chars
                  val: 'If your helper supports time-based expiration with a configurable\n'
                  span_id: 23
                ) (Token id:Id.Lit_Chars val:'timeout, you can test that feature with:\n' span_id:24) 
                (Token id:Id.Lit_Chars val:'\n' span_id:25) (Token id:Id.Lit_Chars val:'  make GIT_TEST_CREDENTIAL_HELPER=foo \\\n' span_id:26) 
                (Token
                  id: Id.Lit_Chars
                  val: '       GIT_TEST_CREDENTIAL_HELPER_TIMEOUT="foo --timeout=1" \\\n'
                  span_id: 27
                ) (Token id:Id.Lit_Chars val:'       t0303-credential-external.sh\n' span_id:28) 
                (Token id:Id.Lit_Chars val:'\n' span_id:29) 
                (Token
                  id: Id.Lit_Chars
                  val: 'If your helper requires additional setup before the tests are started,\n'
                  span_id: 30
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'you can set GIT_TEST_CREDENTIAL_HELPER_SETUP to a sequence of shell\n'
                  span_id: 31
                ) (Token id:Id.Lit_Chars val:'commands.\n' span_id:32)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-credential.sh)})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER'))})
              terminator: (Token id:Id.Op_Semi val:';' span_id:57)
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: {(DQ ('used to test external credential helpers'))}
                  spids: [62]
                )
              ]
            )
            (C {(test_done)})
          ]
          spids: [48 59]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER_SETUP'))})
        (C {(eval)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER_SETUP'))})
      ]
    )
    (C {(helper_test_clean)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER'))})
    (C {(helper_test)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER'))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER_TIMEOUT'))})
              terminator: (Token id:Id.Op_Semi val:';' span_id:120)
            )
          ]
          action: [
            (C {(say)} {(DQ ('# skipping timeout tests (GIT_TEST_CREDENTIAL_HELPER_TIMEOUT not set)'))})
          ]
          spids: [111 122]
        )
      ]
      else_action: [
        (C {(helper_test_timeout)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER_TIMEOUT'))})
      ]
    )
    (C {(helper_test_clean)} {(DQ ($ Id.VSub_DollarName '$GIT_TEST_CREDENTIAL_HELPER'))})
    (C {(test_done)})
  ]
)