(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:'check receive input limits' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_pack_input_limit
      body: 
        (command.BraceGroup
          children: [
            (command.Case
              to_match: {(DQ ($ Id.VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(index)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:unpack_limit)
                          op: assign_op.Equal
                          rhs: {(1)}
                          spids: [44]
                        )
                      ]
                    )
                  ]
                  spids: [41 42 47 -1]
                )
                (case_arm
                  pat_list: [{(unpack)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:unpack_limit)
                          op: assign_op.Equal
                          rhs: {(10000)}
                          spids: [53]
                        )
                      ]
                    )
                  ]
                  spids: [50 51 56 -1]
                )
              ]
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'prepare destination repository' span_id:66))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:70) 
                  (Token id:Id.Lit_Chars val:'\t\trm -fr dest &&\n' span_id:71) (Token id:Id.Lit_Chars val:'\t\tgit --bare init dest\n' span_id:72) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:73)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('set unpacklimit to ') ($ Id.VSub_DollarName '$unpack_limit'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:86) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tgit --git-dir=dest config receive.unpacklimit "$unpack_limit"\n'
                    span_id: 87
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:88)
                )
              }
            )
            (C {(test_expect_success)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'setting receive.maxInputSize to 512 rejects push'
                    span_id: 96
                  )
                )
              } 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:100) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tgit --git-dir=dest config receive.maxInputSize 512 &&\n'
                    span_id: 101
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git push dest HEAD\n' span_id:102) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:103)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'bumping limit to 4k allows push' span_id:111))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tgit --git-dir=dest config receive.maxInputSize 4k &&\n'
                    span_id: 116
                  ) (Token id:Id.Lit_Chars val:'\t\tgit push dest HEAD\n' span_id:117) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:118)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'prepare destination repository (again)' span_id:126))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:130) 
                  (Token id:Id.Lit_Chars val:'\t\trm -fr dest &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\tgit --bare init dest\n' span_id:132) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:133)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'lifting the limit allows push' span_id:141))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:145) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tgit --git-dir=dest config receive.maxInputSize 0 &&\n'
                    span_id: 146
                  ) (Token id:Id.Lit_Chars val:'\t\tgit push dest HEAD\n' span_id:147) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:148)
                )
              }
            )
          ]
        )
    )
    (C {(test_expect_success)} {(DQ ('create known-size (1024 bytes) commit'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\ttest-genrandom foo 1024 >one-k &&\n' span_id:162) (Token id:Id.Lit_Chars val:'\tgit add one-k &&\n' span_id:163) 
          (Token id:Id.Lit_Chars val:'\ttest_commit one-k\n' span_id:164)
        )
      }
    )
    (C {(test_pack_input_limit)} {(index)})
    (C {(test_pack_input_limit)} {(unpack)})
    (C {(test_done)})
  ]
)