@@ -469,6 +469,63 @@ loop:
469
469
}
470
470
}
471
471
472
+ func TestMaxBuffer (t * testing.T ) {
473
+ // Exceeding the maximum buffer size generates ErrBufferExceeded.
474
+ z := NewTokenizer (strings .NewReader ("<" + strings .Repeat ("t" , 10 )))
475
+ z .SetMaxBuf (5 )
476
+ tt := z .Next ()
477
+ if got , want := tt , ErrorToken ; got != want {
478
+ t .Fatalf ("token type: got: %v want: %v" , got , want )
479
+ }
480
+ if got , want := z .Err (), ErrBufferExceeded ; got != want {
481
+ t .Errorf ("error type: got: %v want: %v" , got , want )
482
+ }
483
+ if got , want := string (z .Raw ()), "<tttt" ; got != want {
484
+ t .Fatalf ("buffered before overflow: got: %q want: %q" , got , want )
485
+ }
486
+ }
487
+
488
+ func TestMaxBufferReconstruction (t * testing.T ) {
489
+ // Exceeding the maximum buffer size at any point while tokenizing permits
490
+ // reconstructing the original input.
491
+ tests:
492
+ for _ , test := range tokenTests {
493
+ buffer:
494
+ for maxBuf := 1 ; ; maxBuf ++ {
495
+ r := strings .NewReader (test .html )
496
+ z := NewTokenizer (r )
497
+ z .SetMaxBuf (maxBuf )
498
+ var tokenized bytes.Buffer
499
+ for {
500
+ tt := z .Next ()
501
+ tokenized .Write (z .Raw ())
502
+ if tt == ErrorToken {
503
+ if z .Err () == ErrBufferExceeded {
504
+ continue buffer
505
+ }
506
+ // EOF is expected, and indicates that we found the max maxBuf that
507
+ // generates ErrBufferExceeded, so continue to the next test.
508
+ if err := z .Err (); err != io .EOF {
509
+ t .Errorf ("%s: unexpected error: %v" , test .desc , err )
510
+ }
511
+ break
512
+ }
513
+ }
514
+ // Anything tokenizing along with input left in the reader.
515
+ assembled , err := ioutil .ReadAll (io .MultiReader (& tokenized , r ))
516
+ if err != nil {
517
+ t .Errorf ("%s: ReadAll: %v" , test .desc , err )
518
+ continue tests
519
+ }
520
+ if got , want := string (assembled ), test .html ; got != want {
521
+ t .Errorf ("%s: reassembled html:\n got: %q\n want: %q" , test .desc , got , want )
522
+ continue tests
523
+ }
524
+ break
525
+ } // buffer sizes
526
+ } // tests
527
+ }
528
+
472
529
func TestPassthrough (t * testing.T ) {
473
530
// Accumulating the raw output for each parse event should reconstruct the
474
531
// original input.
0 commit comments