clusterstorage_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package storage
  2. import (
  3. "crypto/tls"
  4. "encoding/json"
  5. "io"
  6. "net/http"
  7. "net/http/httptest"
  8. "net/url"
  9. "os"
  10. "path/filepath"
  11. "strconv"
  12. "strings"
  13. "testing"
  14. )
  15. // TestClusterStorage_scheme tests the scheme() method returns correct values based on TLS configuration
  16. func TestClusterStorage_scheme(t *testing.T) {
  17. tests := []struct {
  18. name string
  19. transport http.RoundTripper
  20. want string
  21. }{
  22. {
  23. name: "nil transport returns http",
  24. transport: nil,
  25. want: "http",
  26. },
  27. {
  28. name: "transport without TLS config returns http",
  29. transport: &http.Transport{},
  30. want: "http",
  31. },
  32. {
  33. name: "transport with TLS config returns https",
  34. transport: &http.Transport{
  35. TLSClientConfig: &tls.Config{},
  36. },
  37. want: "https",
  38. },
  39. {
  40. name: "transport with InsecureSkipVerify returns http",
  41. transport: &http.Transport{
  42. TLSClientConfig: &tls.Config{
  43. InsecureSkipVerify: true,
  44. },
  45. },
  46. want: "http",
  47. },
  48. }
  49. for _, tt := range tests {
  50. t.Run(tt.name, func(t *testing.T) {
  51. cs := &ClusterStorage{
  52. client: &http.Client{
  53. Transport: tt.transport,
  54. },
  55. }
  56. got := cs.scheme()
  57. if got != tt.want {
  58. t.Errorf("ClusterStorage.scheme() = %v, want %v", got, tt.want)
  59. }
  60. // Also test that strings.ToUpper(scheme()) works as expected in log statements
  61. gotUpper := strings.ToUpper(cs.scheme())
  62. wantUpper := strings.ToUpper(tt.want)
  63. if gotUpper != wantUpper {
  64. t.Errorf("strings.ToUpper(ClusterStorage.scheme()) = %v, want %v", gotUpper, wantUpper)
  65. }
  66. })
  67. }
  68. }
  69. func TestClusterStorage_ReadToLocalFile(t *testing.T) {
  70. expected := []byte("cluster-storage-contents")
  71. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  72. if r.URL.Path != "/clusterStorage/read" {
  73. w.WriteHeader(http.StatusNotFound)
  74. return
  75. }
  76. resp := Response[[]byte]{
  77. Code: 0,
  78. Data: expected,
  79. }
  80. w.Header().Set("Content-Type", "application/json")
  81. _ = json.NewEncoder(w).Encode(resp)
  82. }))
  83. defer srv.Close()
  84. u, err := url.Parse(srv.URL)
  85. if err != nil {
  86. t.Fatalf("parsing test server URL: %s", err)
  87. }
  88. port, err := strconv.Atoi(u.Port())
  89. if err != nil {
  90. t.Fatalf("parsing test server port: %s", err)
  91. }
  92. cs := &ClusterStorage{
  93. client: &http.Client{},
  94. host: u.Hostname(),
  95. port: port,
  96. }
  97. destPath := filepath.Join(t.TempDir(), "out.bin")
  98. if err := cs.ReadToLocalFile("some/path", destPath); err != nil {
  99. t.Fatalf("ReadToLocalFile failed: %s", err)
  100. }
  101. data, err := os.ReadFile(destPath)
  102. if err != nil {
  103. t.Fatalf("reading destination file: %s", err)
  104. }
  105. if string(data) != string(expected) {
  106. t.Fatalf("destination file contents mismatch: got %q want %q", string(data), string(expected))
  107. }
  108. }
  109. func TestClusterStorage_ReadStream(t *testing.T) {
  110. expected := []byte("cluster-storage-stream-contents")
  111. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  112. if r.URL.Path != "/clusterStorage/read" {
  113. w.WriteHeader(http.StatusNotFound)
  114. return
  115. }
  116. resp := Response[[]byte]{
  117. Code: 0,
  118. Data: expected,
  119. }
  120. w.Header().Set("Content-Type", "application/json")
  121. _ = json.NewEncoder(w).Encode(resp)
  122. }))
  123. defer srv.Close()
  124. u, err := url.Parse(srv.URL)
  125. if err != nil {
  126. t.Fatalf("parsing test server URL: %s", err)
  127. }
  128. port, err := strconv.Atoi(u.Port())
  129. if err != nil {
  130. t.Fatalf("parsing test server port: %s", err)
  131. }
  132. cs := &ClusterStorage{
  133. client: &http.Client{},
  134. host: u.Hostname(),
  135. port: port,
  136. }
  137. r, err := cs.ReadStream("some/path")
  138. if err != nil {
  139. t.Fatalf("ReadStream failed: %s", err)
  140. }
  141. defer r.Close()
  142. data, err := io.ReadAll(r)
  143. if err != nil {
  144. t.Fatalf("reading stream failed: %s", err)
  145. }
  146. if string(data) != string(expected) {
  147. t.Fatalf("stream contents mismatch: got %q want %q", string(data), string(expected))
  148. }
  149. }