gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package lfs
  4. import (
  5. "bytes"
  6. "io"
  7. "net/http"
  8. "strings"
  9. "testing"
  10. "code.gitea.io/gitea/modules/json"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestBasicTransferAdapterName(t *testing.T) {
  14. a := &BasicTransferAdapter{}
  15. assert.Equal(t, "basic", a.Name())
  16. }
  17. func TestBasicTransferAdapter(t *testing.T) {
  18. p := Pointer{Oid: "b5a2c96250612366ea272ffac6d9744aaf4b45aacd96aa7cfcb931ee3b558259", Size: 5}
  19. roundTripHandler := func(req *http.Request) *http.Response {
  20. assert.Equal(t, AcceptHeader, req.Header.Get("Accept"))
  21. assert.Equal(t, "test-value", req.Header.Get("test-header"))
  22. url := req.URL.String()
  23. if strings.Contains(url, "download-request") {
  24. assert.Equal(t, "GET", req.Method)
  25. return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("dummy"))}
  26. } else if strings.Contains(url, "upload-request") {
  27. assert.Equal(t, "PUT", req.Method)
  28. assert.Equal(t, "application/octet-stream", req.Header.Get("Content-Type"))
  29. b, err := io.ReadAll(req.Body)
  30. assert.NoError(t, err)
  31. assert.Equal(t, "dummy", string(b))
  32. return &http.Response{StatusCode: http.StatusOK}
  33. } else if strings.Contains(url, "verify-request") {
  34. assert.Equal(t, "POST", req.Method)
  35. assert.Equal(t, MediaType, req.Header.Get("Content-Type"))
  36. var vp Pointer
  37. err := json.NewDecoder(req.Body).Decode(&vp)
  38. assert.NoError(t, err)
  39. assert.Equal(t, p.Oid, vp.Oid)
  40. assert.Equal(t, p.Size, vp.Size)
  41. return &http.Response{StatusCode: http.StatusOK}
  42. } else if strings.Contains(url, "error-response") {
  43. er := &ErrorResponse{
  44. Message: "Object not found",
  45. }
  46. payload := new(bytes.Buffer)
  47. json.NewEncoder(payload).Encode(er)
  48. return &http.Response{StatusCode: http.StatusNotFound, Body: io.NopCloser(payload)}
  49. }
  50. t.Errorf("Unknown test case: %s", url)
  51. return nil
  52. }
  53. hc := &http.Client{Transport: RoundTripFunc(roundTripHandler)}
  54. a := &BasicTransferAdapter{hc}
  55. t.Run("Download", func(t *testing.T) {
  56. cases := []struct {
  57. link *Link
  58. expectederror string
  59. }{
  60. // case 0
  61. {
  62. link: &Link{
  63. Href: "https://download-request.io",
  64. Header: map[string]string{"test-header": "test-value"},
  65. },
  66. expectederror: "",
  67. },
  68. // case 1
  69. {
  70. link: &Link{
  71. Href: "https://error-response.io",
  72. Header: map[string]string{"test-header": "test-value"},
  73. },
  74. expectederror: "Object not found",
  75. },
  76. }
  77. for n, c := range cases {
  78. _, err := a.Download(t.Context(), c.link)
  79. if len(c.expectederror) > 0 {
  80. assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror)
  81. } else {
  82. assert.NoError(t, err, "case %d", n)
  83. }
  84. }
  85. })
  86. t.Run("Upload", func(t *testing.T) {
  87. cases := []struct {
  88. link *Link
  89. expectederror string
  90. }{
  91. // case 0
  92. {
  93. link: &Link{
  94. Href: "https://upload-request.io",
  95. Header: map[string]string{"test-header": "test-value"},
  96. },
  97. expectederror: "",
  98. },
  99. // case 1
  100. {
  101. link: &Link{
  102. Href: "https://error-response.io",
  103. Header: map[string]string{"test-header": "test-value"},
  104. },
  105. expectederror: "Object not found",
  106. },
  107. }
  108. for n, c := range cases {
  109. err := a.Upload(t.Context(), c.link, p, strings.NewReader("dummy"))
  110. if len(c.expectederror) > 0 {
  111. assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror)
  112. } else {
  113. assert.NoError(t, err, "case %d", n)
  114. }
  115. }
  116. })
  117. t.Run("Verify", func(t *testing.T) {
  118. cases := []struct {
  119. link *Link
  120. expectederror string
  121. }{
  122. // case 0
  123. {
  124. link: &Link{
  125. Href: "https://verify-request.io",
  126. Header: map[string]string{"test-header": "test-value"},
  127. },
  128. expectederror: "",
  129. },
  130. // case 1
  131. {
  132. link: &Link{
  133. Href: "https://error-response.io",
  134. Header: map[string]string{"test-header": "test-value"},
  135. },
  136. expectederror: "Object not found",
  137. },
  138. }
  139. for n, c := range cases {
  140. err := a.Verify(t.Context(), c.link, p)
  141. if len(c.expectederror) > 0 {
  142. assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror)
  143. } else {
  144. assert.NoError(t, err, "case %d", n)
  145. }
  146. }
  147. })
  148. }