httphdr_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package httphdr
  4. import (
  5. "testing"
  6. "github.com/google/go-cmp/cmp"
  7. )
  8. func valOk[T any](v T, ok bool) (out struct {
  9. V T
  10. Ok bool
  11. }) {
  12. out.V = v
  13. out.Ok = ok
  14. return out
  15. }
  16. func TestRange(t *testing.T) {
  17. tests := []struct {
  18. in string
  19. want []Range
  20. wantOk bool
  21. roundtrip bool
  22. }{
  23. {"", nil, false, false},
  24. {"1-3", nil, false, false},
  25. {"units=1-3", []Range{{1, 3}}, false, false},
  26. {"bytes=1-3", []Range{{1, 3}}, true, true},
  27. {"bytes=#-3", nil, false, false},
  28. {"bytes=#-", nil, false, false},
  29. {"bytes=13", nil, false, false},
  30. {"bytes=1-#", nil, false, false},
  31. {"bytes=-#", nil, false, false},
  32. {"bytes= , , , ,\t , \t 1-3", []Range{{1, 3}}, true, false},
  33. {"bytes=1-1", []Range{{1, 1}}, true, true},
  34. {"bytes=01-01", []Range{{1, 1}}, true, false},
  35. {"bytes=1-0", nil, false, false},
  36. {"bytes=0-5,2-3", []Range{{0, 6}, {2, 2}}, true, true},
  37. {"bytes=2-3,0-5", []Range{{2, 2}, {0, 6}}, true, true},
  38. {"bytes=0-5,2-,-5", []Range{{0, 6}, {2, 0}, {0, -5}}, true, true},
  39. }
  40. for _, tt := range tests {
  41. got, gotOk := ParseRange(tt.in)
  42. if d := cmp.Diff(valOk(got, gotOk), valOk(tt.want, tt.wantOk)); d != "" {
  43. t.Errorf("ParseRange(%q) mismatch (-got +want):\n%s", tt.in, d)
  44. }
  45. if tt.roundtrip {
  46. got, gotOk := FormatRange(tt.want)
  47. if d := cmp.Diff(valOk(got, gotOk), valOk(tt.in, tt.wantOk)); d != "" {
  48. t.Errorf("FormatRange(%v) mismatch (-got +want):\n%s", tt.want, d)
  49. }
  50. }
  51. }
  52. }
  53. type contentRange struct{ Start, Length, CompleteLength int64 }
  54. func TestContentRange(t *testing.T) {
  55. tests := []struct {
  56. in string
  57. want contentRange
  58. wantOk bool
  59. roundtrip bool
  60. }{
  61. {"", contentRange{}, false, false},
  62. {"bytes 5-6/*", contentRange{5, 2, -1}, true, true},
  63. {"units 5-6/*", contentRange{}, false, false},
  64. {"bytes 5-6/*", contentRange{}, false, false},
  65. {"bytes 5-5/*", contentRange{5, 1, -1}, true, true},
  66. {"bytes 5-4/*", contentRange{}, false, false},
  67. {"bytes 5-5/6", contentRange{5, 1, 6}, true, true},
  68. {"bytes 05-005/0006", contentRange{5, 1, 6}, true, false},
  69. {"bytes 5-5/5", contentRange{}, false, false},
  70. {"bytes #-5/6", contentRange{}, false, false},
  71. {"bytes 5-#/6", contentRange{}, false, false},
  72. {"bytes 5-5/#", contentRange{}, false, false},
  73. }
  74. for _, tt := range tests {
  75. start, length, completeLength, gotOk := ParseContentRange(tt.in)
  76. got := contentRange{start, length, completeLength}
  77. if d := cmp.Diff(valOk(got, gotOk), valOk(tt.want, tt.wantOk)); d != "" {
  78. t.Errorf("ParseContentRange mismatch (-got +want):\n%s", d)
  79. }
  80. if tt.roundtrip {
  81. got, gotOk := FormatContentRange(tt.want.Start, tt.want.Length, tt.want.CompleteLength)
  82. if d := cmp.Diff(valOk(got, gotOk), valOk(tt.in, tt.wantOk)); d != "" {
  83. t.Errorf("FormatContentRange mismatch (-got +want):\n%s", d)
  84. }
  85. }
  86. }
  87. }