mirror of
https://github.com/yannh/kubeconform.git
synced 2026-02-12 14:39:21 +00:00
175 lines
4.4 KiB
Go
175 lines
4.4 KiB
Go
package registry
|
|
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
type mockHTTPGetter struct {
|
|
callNumber int
|
|
httpGet func(mockHTTPGetter, string) (*http.Response, error)
|
|
}
|
|
|
|
func newMockHTTPGetter(f func(mockHTTPGetter, string) (*http.Response, error)) *mockHTTPGetter {
|
|
return &mockHTTPGetter{
|
|
callNumber: 0,
|
|
httpGet: f,
|
|
}
|
|
}
|
|
func (m *mockHTTPGetter) Get(url string) (resp *http.Response, err error) {
|
|
m.callNumber = m.callNumber + 1
|
|
return m.httpGet(*m, url)
|
|
}
|
|
|
|
//func TestDownloadSchema(t *testing.T) {
|
|
// callCounts := map[string]int{}
|
|
//
|
|
// // http server to simulate different responses
|
|
// http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
// var s int
|
|
// callCounts[r.URL.Path]++
|
|
// callCount := callCounts[r.URL.Path]
|
|
//
|
|
// switch r.URL.Path {
|
|
// case "/404":
|
|
// s = http.StatusNotFound
|
|
// case "/500":
|
|
// s = http.StatusInternalServerError
|
|
// case "/503":
|
|
// if callCount < 2 {
|
|
// s = http.StatusServiceUnavailable
|
|
// } else {
|
|
// s = http.StatusOK // Should succeed on 3rd try
|
|
// }
|
|
//
|
|
// case "/simulate-reset":
|
|
// if callCount < 2 {
|
|
// if hj, ok := w.(http.Hijacker); ok {
|
|
// conn, _, err := hj.Hijack()
|
|
// if err != nil {
|
|
// fmt.Printf("Hijacking failed: %v\n", err)
|
|
// return
|
|
// }
|
|
// conn.Close() // Close the connection to simulate a reset
|
|
// }
|
|
// return
|
|
// }
|
|
// s = http.StatusOK // Should succeed on third try
|
|
//
|
|
// default:
|
|
// s = http.StatusOK
|
|
// }
|
|
//
|
|
// w.WriteHeader(s)
|
|
// w.Write([]byte(http.StatusText(s)))
|
|
// })
|
|
//
|
|
// port := fmt.Sprint(rand.Intn(1000) + 9000) // random port
|
|
// server := &http.Server{Addr: "127.0.0.1:" + port}
|
|
// url := fmt.Sprintf("http://localhost:%s", port)
|
|
//
|
|
// go func() {
|
|
// if err := server.ListenAndServe(); err != nil {
|
|
// fmt.Printf("Failed to start server: %v\n", err)
|
|
// }
|
|
// }()
|
|
// defer server.Shutdown(nil)
|
|
//
|
|
// // Wait for the server to start
|
|
// for i := 0; i < 20; i++ {
|
|
// if _, err := http.Get(url); err == nil {
|
|
// break
|
|
// }
|
|
//
|
|
// if i == 19 {
|
|
// t.Error("http server did not start")
|
|
// return
|
|
// }
|
|
//
|
|
// time.Sleep(50 * time.Millisecond)
|
|
// }
|
|
//
|
|
// for _, testCase := range []struct {
|
|
// name string
|
|
// schemaPathTemplate string
|
|
// strict bool
|
|
// resourceKind, resourceAPIVersion, k8sversion string
|
|
// expect []byte
|
|
// expectErr error
|
|
// }{
|
|
// {
|
|
// "retry connection reset by peer",
|
|
// fmt.Sprintf("%s/simulate-reset", url),
|
|
// true,
|
|
// "Deployment",
|
|
// "v1",
|
|
// "1.18.0",
|
|
// []byte(http.StatusText(http.StatusOK)),
|
|
// nil,
|
|
// },
|
|
// {
|
|
// "getting 404",
|
|
// fmt.Sprintf("%s/404", url),
|
|
// true,
|
|
// "Deployment",
|
|
// "v1",
|
|
// "1.18.0",
|
|
// nil,
|
|
// fmt.Errorf("could not find schema at %s/404", url),
|
|
// },
|
|
// {
|
|
// "getting 500",
|
|
// fmt.Sprintf("%s/500", url),
|
|
// true,
|
|
// "Deployment",
|
|
// "v1",
|
|
// "1.18.0",
|
|
// nil,
|
|
// fmt.Errorf("failed downloading schema at %s/500: Get \"%s/500\": GET %s/500 giving up after 3 attempt(s)", url, url, url),
|
|
// },
|
|
// {
|
|
// "retry 503",
|
|
// fmt.Sprintf("%s/503", url),
|
|
// true,
|
|
// "Deployment",
|
|
// "v1",
|
|
// "1.18.0",
|
|
// []byte(http.StatusText(http.StatusOK)),
|
|
// nil,
|
|
// },
|
|
// {
|
|
// "200",
|
|
// url,
|
|
// true,
|
|
// "Deployment",
|
|
// "v1",
|
|
// "1.18.0",
|
|
// []byte(http.StatusText(http.StatusOK)),
|
|
// nil,
|
|
// },
|
|
// } {
|
|
// callCounts = map[string]int{} // Reinitialise counters
|
|
//
|
|
// reg, err := newHTTPRegistry(testCase.schemaPathTemplate, "", testCase.strict, true, true)
|
|
// if err != nil {
|
|
// t.Errorf("during test '%s': failed to create registry: %s", testCase.name, err)
|
|
// continue
|
|
// }
|
|
//
|
|
// _, res, err := reg.DownloadSchema(testCase.resourceKind, testCase.resourceAPIVersion, testCase.k8sversion)
|
|
// if err == nil || testCase.expectErr == nil {
|
|
// if err == nil && testCase.expectErr != nil {
|
|
// t.Errorf("during test '%s': expected error\n%s, got nil", testCase.name, testCase.expectErr)
|
|
// }
|
|
// if err != nil && testCase.expectErr == nil {
|
|
// t.Errorf("during test '%s': expected no error, got\n%s\n", testCase.name, err)
|
|
// }
|
|
// } else if err.Error() != testCase.expectErr.Error() {
|
|
// t.Errorf("during test '%s': expected error\n%s, got:\n%s\n", testCase.name, testCase.expectErr, err)
|
|
// }
|
|
//
|
|
// if !bytes.Equal(res, testCase.expect) {
|
|
// t.Errorf("during test '%s': expected '%s', got '%s'", testCase.name, testCase.expect, res)
|
|
// }
|
|
// }
|
|
//
|
|
//}
|