package lfs import ( "encoding/json" "io/ioutil" "net/http" "net/http/httptest" "os" "testing" ) func TestDownload(t *testing.T) { mux := http.NewServeMux() server := httptest.NewServer(mux) tmp := tempdir(t) defer server.Close() defer os.RemoveAll(tmp) mux.HandleFunc("/media/objects/oid", func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.WriteHeader(405) return } head := w.Header() head.Set("Content-Type", "application/octet-stream") head.Set("Content-Length", "4") w.WriteHeader(200) w.Write([]byte("test")) }) Config.SetConfig("lfs.url", server.URL+"/media") reader, size, wErr := Download("whatever/oid") if wErr != nil { t.Fatalf("unexpected error: %s", wErr) } defer reader.Close() if size != 4 { t.Errorf("unexpected size: %d", size) } by, err := ioutil.ReadAll(reader) if err != nil { t.Fatalf("unexpected error: %s", err) } if body := string(by); body != "test" { t.Errorf("unexpected body: %s", body) } } func TestDownloadFromMeta(t *testing.T) { mux := http.NewServeMux() server := httptest.NewServer(mux) tmp := tempdir(t) defer server.Close() defer os.RemoveAll(tmp) // simulates an endpoint that returns the meta data for every request. // this way downloads keep working with the older prototype server during // the pre-release. mux.HandleFunc("/media/objects/oid", func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.WriteHeader(405) return } obj := &objectResource{ Oid: "oid", Size: 4, Links: map[string]*linkRelation{ "download": &linkRelation{ Href: server.URL + "/media/download/oid", }, }, } by, err := json.Marshal(obj) if err != nil { t.Errorf("Error marshaling json: %s", err) } head := w.Header() head.Set("Content-Type", "application/vnd.git-media+json") w.WriteHeader(200) w.Write(by) }) mux.HandleFunc("/media/download/oid", func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.WriteHeader(405) return } head := w.Header() head.Set("Content-Type", "application/octet-stream") head.Set("Content-Length", "4") w.WriteHeader(200) w.Write([]byte("test")) }) Config.SetConfig("lfs.url", server.URL+"/media") reader, size, wErr := Download("whatever/oid") if wErr != nil { t.Fatalf("unexpected error: %s", wErr) } defer reader.Close() if size != 4 { t.Errorf("unexpected size: %d", size) } by, err := ioutil.ReadAll(reader) if err != nil { t.Fatalf("unexpected error: %s", err) } if body := string(by); body != "test" { t.Errorf("unexpected body: %s", body) } } func TestDownloadWithRedirect(t *testing.T) { mux := http.NewServeMux() server := httptest.NewServer(mux) tmp := tempdir(t) defer server.Close() defer os.RemoveAll(tmp) mux.HandleFunc("/media/objects/oid", func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.WriteHeader(405) return } head := w.Header() head.Set("Location", server.URL+"/media/objects/redirect") w.WriteHeader(302) }) mux.HandleFunc("/media/objects/redirect", func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.WriteHeader(405) return } head := w.Header() head.Set("Content-Type", "application/octet-stream") head.Set("Content-Length", "4") w.WriteHeader(200) w.Write([]byte("test")) }) Config.SetConfig("lfs.url", server.URL+"/media") reader, size, wErr := Download("whatever/oid") if wErr != nil { t.Fatalf("unexpected error: %s", wErr) } defer reader.Close() if size != 4 { t.Errorf("unexpected size: %d", size) } by, err := ioutil.ReadAll(reader) if err != nil { t.Fatalf("unexpected error: %s", err) } if body := string(by); body != "test" { t.Errorf("unexpected body: %s", body) } }