Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

http_client_test.go 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package lfs
  5. import (
  6. "bytes"
  7. "context"
  8. "encoding/json"
  9. "io"
  10. "io/ioutil"
  11. "net/http"
  12. "strings"
  13. "testing"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. type RoundTripFunc func(req *http.Request) *http.Response
  17. func (f RoundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
  18. return f(req), nil
  19. }
  20. type DummyTransferAdapter struct {
  21. }
  22. func (a *DummyTransferAdapter) Name() string {
  23. return "dummy"
  24. }
  25. func (a *DummyTransferAdapter) Download(ctx context.Context, r *ObjectResponse) (io.ReadCloser, error) {
  26. return ioutil.NopCloser(bytes.NewBufferString("dummy")), nil
  27. }
  28. func TestHTTPClientDownload(t *testing.T) {
  29. oid := "fb8f7d8435968c4f82a726a92395be4d16f2f63116caf36c8ad35c60831ab041"
  30. size := int64(6)
  31. roundTripHandler := func(req *http.Request) *http.Response {
  32. url := req.URL.String()
  33. if strings.Contains(url, "status-not-ok") {
  34. return &http.Response{StatusCode: http.StatusBadRequest}
  35. }
  36. if strings.Contains(url, "invalid-json-response") {
  37. return &http.Response{StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewBufferString("invalid json"))}
  38. }
  39. if strings.Contains(url, "valid-batch-request-download") {
  40. assert.Equal(t, "POST", req.Method)
  41. assert.Equal(t, MediaType, req.Header.Get("Content-type"), "case %s: error should match", url)
  42. assert.Equal(t, MediaType, req.Header.Get("Accept"), "case %s: error should match", url)
  43. var batchRequest BatchRequest
  44. err := json.NewDecoder(req.Body).Decode(&batchRequest)
  45. assert.NoError(t, err)
  46. assert.Equal(t, "download", batchRequest.Operation)
  47. assert.Len(t, batchRequest.Objects, 1)
  48. assert.Equal(t, oid, batchRequest.Objects[0].Oid)
  49. assert.Equal(t, size, batchRequest.Objects[0].Size)
  50. batchResponse := &BatchResponse{
  51. Transfer: "dummy",
  52. Objects: make([]*ObjectResponse, 1),
  53. }
  54. payload := new(bytes.Buffer)
  55. json.NewEncoder(payload).Encode(batchResponse)
  56. return &http.Response{StatusCode: http.StatusOK, Body: ioutil.NopCloser(payload)}
  57. }
  58. if strings.Contains(url, "invalid-response-no-objects") {
  59. batchResponse := &BatchResponse{Transfer: "dummy"}
  60. payload := new(bytes.Buffer)
  61. json.NewEncoder(payload).Encode(batchResponse)
  62. return &http.Response{StatusCode: http.StatusOK, Body: ioutil.NopCloser(payload)}
  63. }
  64. if strings.Contains(url, "unknown-transfer-adapter") {
  65. batchResponse := &BatchResponse{Transfer: "unknown_adapter"}
  66. payload := new(bytes.Buffer)
  67. json.NewEncoder(payload).Encode(batchResponse)
  68. return &http.Response{StatusCode: http.StatusOK, Body: ioutil.NopCloser(payload)}
  69. }
  70. t.Errorf("Unknown test case: %s", url)
  71. return nil
  72. }
  73. hc := &http.Client{Transport: RoundTripFunc(roundTripHandler)}
  74. dummy := &DummyTransferAdapter{}
  75. var cases = []struct {
  76. endpoint string
  77. expectederror string
  78. }{
  79. // case 0
  80. {
  81. endpoint: "https://status-not-ok.io",
  82. expectederror: "Unexpected servers response: ",
  83. },
  84. // case 1
  85. {
  86. endpoint: "https://invalid-json-response.io",
  87. expectederror: "json.Decode: ",
  88. },
  89. // case 2
  90. {
  91. endpoint: "https://valid-batch-request-download.io",
  92. expectederror: "",
  93. },
  94. // case 3
  95. {
  96. endpoint: "https://invalid-response-no-objects.io",
  97. expectederror: "No objects in result",
  98. },
  99. // case 4
  100. {
  101. endpoint: "https://unknown-transfer-adapter.io",
  102. expectederror: "Transferadapter not found: ",
  103. },
  104. }
  105. for n, c := range cases {
  106. client := &HTTPClient{
  107. client: hc,
  108. endpoint: c.endpoint,
  109. transfers: make(map[string]TransferAdapter),
  110. }
  111. client.transfers["dummy"] = dummy
  112. _, err := client.Download(context.Background(), oid, size)
  113. if len(c.expectederror) > 0 {
  114. assert.True(t, strings.Contains(err.Error(), c.expectederror), "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror)
  115. } else {
  116. assert.NoError(t, err, "case %d", n)
  117. }
  118. }
  119. }