From 670ad24cb2eb6c5bdc77bbef49ac36a58fcab2e5 Mon Sep 17 00:00:00 2001 From: Karuppiah Natarajan Date: Mon, 23 Mar 2020 20:02:00 +0530 Subject: [PATCH] feat(test): add ability to serve index.json using test repo server Signed-off-by: Karuppiah Natarajan --- pkg/repo/repotest/server.go | 37 +++++++++++++++---- pkg/repo/repotest/server_test.go | 63 ++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index b18bce49c..c1123edaa 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -24,8 +24,6 @@ import ( "helm.sh/helm/v3/internal/tlsutil" - "sigs.k8s.io/yaml" - "helm.sh/helm/v3/pkg/repo" ) @@ -79,9 +77,10 @@ func NewServer(docroot string) *Server { // Server is an implementation of a repository server for testing. type Server struct { - docroot string - srv *httptest.Server - middleware http.HandlerFunc + docroot string + srv *httptest.Server + middleware http.HandlerFunc + jsonIndexEnabled bool } // WithMiddleware injects middleware in front of the server. This can be used to inject @@ -95,6 +94,13 @@ func (s *Server) Root() string { return s.docroot } +// ServeJSONIndex allows you to enable or disable serving +// index.json repository index file +func (s *Server) ServeJSONIndex(enabled bool) { + s.jsonIndexEnabled = enabled + s.CreateIndex() +} + // CopyCharts takes a glob expression and copies those charts to the server root. func (s *Server) CopyCharts(origin string) ([]string, error) { files, err := filepath.Glob(origin) @@ -121,19 +127,34 @@ func (s *Server) CopyCharts(origin string) ([]string, error) { // CreateIndex will read docroot and generate an index.yaml file. func (s *Server) CreateIndex() error { + // generate the index index, err := repo.IndexDirectory(s.docroot, s.URL()) if err != nil { return err } - d, err := yaml.Marshal(index) + yamlIndexFile := filepath.Join(s.docroot, "index.yaml") + + err = index.WriteFile(yamlIndexFile, 0644) + if err != nil { + return err + } + + jsonIndexFile := filepath.Join(s.docroot, "index.json") + // cleanup existing files + err = os.RemoveAll(jsonIndexFile) if err != nil { return err } - ifile := filepath.Join(s.docroot, "index.yaml") - return ioutil.WriteFile(ifile, d, 0644) + if s.jsonIndexEnabled { + err = index.WriteJSONFile(jsonIndexFile, 0644) + if err != nil { + return err + } + } + return nil } func (s *Server) Start() { diff --git a/pkg/repo/repotest/server_test.go b/pkg/repo/repotest/server_test.go index ee62791af..46c704638 100644 --- a/pkg/repo/repotest/server_test.go +++ b/pkg/repo/repotest/server_test.go @@ -16,6 +16,7 @@ limitations under the License. package repotest import ( + "encoding/json" "io/ioutil" "net/http" "path/filepath" @@ -65,6 +66,9 @@ func TestServer(t *testing.T) { if err != nil { t.Fatal(err) } + if res.StatusCode != 200 { + t.Fatalf("Expected 200, got %d", res.StatusCode) + } data, err := ioutil.ReadAll(res.Body) res.Body.Close() @@ -94,6 +98,65 @@ func TestServer(t *testing.T) { if res.StatusCode != 404 { t.Fatalf("Expected 404, got %d", res.StatusCode) } + + // By default index.json should not be served, + // unless a toggle is enabled. + // So the below should give 404 + res, err = http.Get(srv.URL() + "/index.json") + res.Body.Close() + if err != nil { + t.Fatal(err) + } + if res.StatusCode != 404 { + t.Fatalf("Expected 404, got %d", res.StatusCode) + } + + // Let's enable the toggle to serve index.json + srv.ServeJSONIndex(true) + + // Now we should be able to fetch the index.json + // with appropriate content + + res, err = http.Get(srv.URL() + "/index.json") + if err != nil { + t.Fatal(err) + } + + if res.StatusCode != 200 { + t.Fatalf("Expected 200, got %d", res.StatusCode) + } + + indexJSONData, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + t.Fatal(err) + } + + jsonIndex := repo.NewIndexFile() + if err := json.Unmarshal(indexJSONData, jsonIndex); err != nil { + t.Fatal(err) + } + + if l := len(jsonIndex.Entries); l != 1 { + t.Fatalf("Expected 1 entry, got %d", l) + } + + if !jsonIndex.Has(expect, "0.1.0") { + t.Errorf("missing %q", expect) + } + + // Let's disable the toggle to serve index.json + srv.ServeJSONIndex(false) + + // Now the below should give 404 + res, err = http.Get(srv.URL() + "/index.json") + res.Body.Close() + if err != nil { + t.Fatal(err) + } + if res.StatusCode != 404 { + t.Fatalf("Expected 404, got %d", res.StatusCode) + } } func TestNewTempServer(t *testing.T) {