2016-05-17 12:00:32 +00:00
|
|
|
package api_test // prevent import cycles
|
2015-03-20 01:55:40 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
2015-03-20 02:56:56 +00:00
|
|
|
"fmt"
|
2015-03-20 01:55:40 +00:00
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"os"
|
2016-05-27 16:41:20 +00:00
|
|
|
"path/filepath"
|
2015-03-20 01:55:40 +00:00
|
|
|
"strconv"
|
|
|
|
"testing"
|
2016-05-13 16:38:06 +00:00
|
|
|
|
2016-11-15 17:01:18 +00:00
|
|
|
"github.com/git-lfs/git-lfs/api"
|
|
|
|
"github.com/git-lfs/git-lfs/config"
|
|
|
|
"github.com/git-lfs/git-lfs/errors"
|
|
|
|
"github.com/git-lfs/git-lfs/httputil"
|
|
|
|
"github.com/git-lfs/git-lfs/lfs"
|
|
|
|
"github.com/git-lfs/git-lfs/test"
|
2015-03-20 01:55:40 +00:00
|
|
|
)
|
|
|
|
|
2015-03-20 17:13:16 +00:00
|
|
|
func TestExistingUpload(t *testing.T) {
|
2016-05-16 14:06:02 +00:00
|
|
|
SetupTestCredentialsFunc()
|
2016-05-17 09:45:56 +00:00
|
|
|
repo := test.NewRepo(t)
|
|
|
|
repo.Pushd()
|
|
|
|
defer func() {
|
|
|
|
repo.Popd()
|
|
|
|
repo.Cleanup()
|
|
|
|
RestoreCredentialsFunc()
|
|
|
|
}()
|
2016-05-16 14:06:02 +00:00
|
|
|
|
2015-03-20 17:13:16 +00:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
server := httptest.NewServer(mux)
|
|
|
|
tmp := tempdir(t)
|
|
|
|
defer server.Close()
|
|
|
|
defer os.RemoveAll(tmp)
|
|
|
|
|
|
|
|
postCalled := false
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/media/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-20 17:13:16 +00:00
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Accept") != api.MediaType {
|
2015-03-20 17:13:16 +00:00
|
|
|
t.Errorf("Invalid Accept")
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Content-Type") != api.MediaType {
|
2015-03-20 17:13:16 +00:00
|
|
|
t.Errorf("Invalid Content-Type")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
tee := io.TeeReader(r.Body, buf)
|
2016-11-08 18:22:29 +00:00
|
|
|
reqObj := batchResponse{}
|
|
|
|
err := json.NewDecoder(tee).Decode(&reqObj)
|
2015-03-20 17:13:16 +00:00
|
|
|
t.Logf("request header: %v", r.Header)
|
|
|
|
t.Logf("request body: %s", buf.String())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
var obj *api.ObjectResource
|
|
|
|
if len(reqObj.Objects) != 1 {
|
|
|
|
t.Errorf("Invalid number of objects")
|
|
|
|
w.WriteHeader(400)
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
obj = reqObj.Objects[0]
|
|
|
|
if obj.Oid != "988881adc9fc3655077dc2d4d757d480b5ea0e11" {
|
|
|
|
t.Errorf("invalid oid from request: %s", obj.Oid)
|
|
|
|
}
|
2015-03-20 17:13:16 +00:00
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
if obj.Size != 4 {
|
|
|
|
t.Errorf("invalid size from request: %d", obj.Size)
|
|
|
|
}
|
2015-03-20 17:13:16 +00:00
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
obj.Actions = map[string]*api.LinkRelation{
|
|
|
|
"download": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/download",
|
|
|
|
Header: map[string]string{"A": "1"},
|
2015-03-20 17:13:16 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
by, err := json.Marshal(newBatchResponse("", obj))
|
2015-03-20 17:13:16 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
postCalled = true
|
|
|
|
head := w.Header()
|
2016-05-17 10:52:56 +00:00
|
|
|
head.Set("Content-Type", api.MediaType)
|
2015-03-20 17:13:16 +00:00
|
|
|
head.Set("Content-Length", strconv.Itoa(len(by)))
|
2015-03-21 17:28:33 +00:00
|
|
|
w.WriteHeader(200)
|
2015-03-20 17:13:16 +00:00
|
|
|
w.Write(by)
|
|
|
|
})
|
|
|
|
|
2016-08-09 19:18:18 +00:00
|
|
|
cfg := config.NewFrom(config.Values{
|
|
|
|
Git: map[string]string{
|
|
|
|
"lfs.url": server.URL + "/media",
|
|
|
|
},
|
|
|
|
})
|
2015-03-20 17:13:16 +00:00
|
|
|
|
2016-05-17 12:00:32 +00:00
|
|
|
oidPath, _ := lfs.LocalMediaPath("988881adc9fc3655077dc2d4d757d480b5ea0e11")
|
2015-03-20 17:13:16 +00:00
|
|
|
if err := ioutil.WriteFile(oidPath, []byte("test"), 0744); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-05-27 16:41:20 +00:00
|
|
|
oid := filepath.Base(oidPath)
|
|
|
|
stat, _ := os.Stat(oidPath)
|
2016-11-08 18:22:29 +00:00
|
|
|
o, _, err := api.BatchSingle(cfg, &api.ObjectResource{Oid: oid, Size: stat.Size()}, "upload", []string{"basic"})
|
2015-08-21 18:31:06 +00:00
|
|
|
if err != nil {
|
2016-03-01 16:34:05 +00:00
|
|
|
if isDockerConnectionError(err) {
|
|
|
|
return
|
|
|
|
}
|
2015-08-21 18:31:06 +00:00
|
|
|
t.Fatal(err)
|
2015-03-20 17:13:16 +00:00
|
|
|
}
|
2016-11-08 18:22:29 +00:00
|
|
|
|
|
|
|
if o == nil {
|
|
|
|
t.Fatal("Got no objects back")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := o.Rel("upload"); ok {
|
|
|
|
t.Errorf("has upload relation")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := o.Rel("download"); !ok {
|
|
|
|
t.Errorf("has no download relation")
|
2015-05-27 20:56:03 +00:00
|
|
|
}
|
2015-03-20 17:13:16 +00:00
|
|
|
|
|
|
|
if !postCalled {
|
|
|
|
t.Errorf("POST not called")
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-03-26 18:46:33 +00:00
|
|
|
func TestUploadWithRedirect(t *testing.T) {
|
2016-05-16 14:06:02 +00:00
|
|
|
SetupTestCredentialsFunc()
|
2016-05-17 09:45:56 +00:00
|
|
|
repo := test.NewRepo(t)
|
|
|
|
repo.Pushd()
|
|
|
|
defer func() {
|
|
|
|
repo.Popd()
|
|
|
|
repo.Cleanup()
|
|
|
|
RestoreCredentialsFunc()
|
|
|
|
}()
|
2016-05-16 14:06:02 +00:00
|
|
|
|
2015-03-26 18:46:33 +00:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
server := httptest.NewServer(mux)
|
|
|
|
tmp := tempdir(t)
|
|
|
|
defer server.Close()
|
|
|
|
defer os.RemoveAll(tmp)
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/redirect/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-26 18:46:33 +00:00
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
w.Header().Set("Location", server.URL+"/redirect2/objects/batch")
|
2015-03-26 18:46:33 +00:00
|
|
|
w.WriteHeader(307)
|
|
|
|
})
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/redirect2/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-26 18:46:33 +00:00
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
w.Header().Set("Location", server.URL+"/media/objects/batch")
|
2015-03-26 18:46:33 +00:00
|
|
|
w.WriteHeader(307)
|
|
|
|
})
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/media/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-26 18:46:33 +00:00
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Accept") != api.MediaType {
|
2015-03-26 18:46:33 +00:00
|
|
|
t.Errorf("Invalid Accept")
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Content-Type") != api.MediaType {
|
2015-03-26 18:46:33 +00:00
|
|
|
t.Errorf("Invalid Content-Type")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
tee := io.TeeReader(r.Body, buf)
|
2016-11-08 18:22:29 +00:00
|
|
|
reqObj := batchResponse{}
|
|
|
|
err := json.NewDecoder(tee).Decode(&reqObj)
|
2015-03-26 18:46:33 +00:00
|
|
|
t.Logf("request header: %v", r.Header)
|
|
|
|
t.Logf("request body: %s", buf.String())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
var obj *api.ObjectResource
|
|
|
|
if len(reqObj.Objects) != 1 {
|
|
|
|
t.Errorf("Invalid number of objects")
|
|
|
|
w.WriteHeader(400)
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
obj = reqObj.Objects[0]
|
|
|
|
if obj.Oid != "988881adc9fc3655077dc2d4d757d480b5ea0e11" {
|
|
|
|
t.Errorf("invalid oid from request: %s", obj.Oid)
|
|
|
|
}
|
2015-03-26 18:46:33 +00:00
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
if obj.Size != 4 {
|
|
|
|
t.Errorf("invalid size from request: %d", obj.Size)
|
|
|
|
}
|
2015-03-26 18:46:33 +00:00
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
obj.Actions = map[string]*api.LinkRelation{
|
|
|
|
"upload": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/upload",
|
|
|
|
Header: map[string]string{"A": "1"},
|
|
|
|
},
|
|
|
|
"verify": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/verify",
|
|
|
|
Header: map[string]string{"B": "2"},
|
2015-03-26 18:46:33 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
by, err := json.Marshal(newBatchResponse("", obj))
|
2015-03-26 18:46:33 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
head := w.Header()
|
2016-05-17 10:52:56 +00:00
|
|
|
head.Set("Content-Type", api.MediaType)
|
2015-03-26 18:46:33 +00:00
|
|
|
head.Set("Content-Length", strconv.Itoa(len(by)))
|
|
|
|
w.WriteHeader(200)
|
|
|
|
w.Write(by)
|
|
|
|
})
|
|
|
|
|
2016-08-09 19:18:18 +00:00
|
|
|
cfg := config.NewFrom(config.Values{
|
|
|
|
Git: map[string]string{
|
|
|
|
"lfs.url": server.URL + "/redirect",
|
|
|
|
},
|
|
|
|
})
|
2015-03-26 18:46:33 +00:00
|
|
|
|
2016-05-17 12:00:32 +00:00
|
|
|
oidPath, _ := lfs.LocalMediaPath("988881adc9fc3655077dc2d4d757d480b5ea0e11")
|
2015-03-26 18:46:33 +00:00
|
|
|
if err := ioutil.WriteFile(oidPath, []byte("test"), 0744); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-05-27 16:41:20 +00:00
|
|
|
oid := filepath.Base(oidPath)
|
|
|
|
stat, _ := os.Stat(oidPath)
|
2016-11-08 18:22:29 +00:00
|
|
|
o, _, err := api.BatchSingle(cfg, &api.ObjectResource{Oid: oid, Size: stat.Size()}, "upload", []string{"basic"})
|
2015-08-21 18:31:06 +00:00
|
|
|
if err != nil {
|
2016-03-01 16:34:05 +00:00
|
|
|
if isDockerConnectionError(err) {
|
|
|
|
return
|
|
|
|
}
|
2015-08-21 18:31:06 +00:00
|
|
|
t.Fatal(err)
|
2015-03-26 18:46:33 +00:00
|
|
|
}
|
2015-05-27 20:56:03 +00:00
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
if o == nil {
|
|
|
|
t.Fatal("Got no objects back")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := o.Rel("download"); ok {
|
|
|
|
t.Errorf("has download relation")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := o.Rel("upload"); !ok {
|
|
|
|
t.Errorf("has no upload relation")
|
2015-05-27 20:56:03 +00:00
|
|
|
}
|
2015-03-26 18:46:33 +00:00
|
|
|
}
|
|
|
|
|
2015-03-20 01:55:40 +00:00
|
|
|
func TestSuccessfulUploadWithVerify(t *testing.T) {
|
2016-05-16 14:06:02 +00:00
|
|
|
SetupTestCredentialsFunc()
|
2016-05-17 09:45:56 +00:00
|
|
|
repo := test.NewRepo(t)
|
|
|
|
repo.Pushd()
|
|
|
|
defer func() {
|
|
|
|
repo.Popd()
|
|
|
|
repo.Cleanup()
|
|
|
|
RestoreCredentialsFunc()
|
|
|
|
}()
|
2016-05-16 14:06:02 +00:00
|
|
|
|
2015-03-20 01:55:40 +00:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
server := httptest.NewServer(mux)
|
|
|
|
tmp := tempdir(t)
|
|
|
|
defer server.Close()
|
|
|
|
defer os.RemoveAll(tmp)
|
|
|
|
|
|
|
|
postCalled := false
|
|
|
|
verifyCalled := false
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/media/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-20 01:55:40 +00:00
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Accept") != api.MediaType {
|
2015-03-20 01:55:40 +00:00
|
|
|
t.Errorf("Invalid Accept")
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Content-Type") != api.MediaType {
|
2015-03-20 01:55:40 +00:00
|
|
|
t.Errorf("Invalid Content-Type")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
tee := io.TeeReader(r.Body, buf)
|
2016-11-08 18:22:29 +00:00
|
|
|
reqObj := batchResponse{}
|
|
|
|
err := json.NewDecoder(tee).Decode(&reqObj)
|
2015-03-20 01:55:40 +00:00
|
|
|
t.Logf("request header: %v", r.Header)
|
|
|
|
t.Logf("request body: %s", buf.String())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
var obj *api.ObjectResource
|
|
|
|
if len(reqObj.Objects) != 1 {
|
|
|
|
t.Errorf("Invalid number of objects")
|
|
|
|
w.WriteHeader(400)
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
obj = reqObj.Objects[0]
|
|
|
|
if obj.Oid != "988881adc9fc3655077dc2d4d757d480b5ea0e11" {
|
|
|
|
t.Errorf("invalid oid from request: %s", obj.Oid)
|
|
|
|
}
|
2015-03-20 01:55:40 +00:00
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
if obj.Size != 4 {
|
|
|
|
t.Errorf("invalid size from request: %d", obj.Size)
|
|
|
|
}
|
2015-03-20 01:55:40 +00:00
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
obj.Actions = map[string]*api.LinkRelation{
|
|
|
|
"upload": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/upload",
|
|
|
|
Header: map[string]string{"A": "1"},
|
|
|
|
},
|
|
|
|
"verify": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/verify",
|
|
|
|
Header: map[string]string{"B": "2"},
|
2015-03-20 01:55:40 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
by, err := json.Marshal(newBatchResponse("", obj))
|
2015-03-20 01:55:40 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
postCalled = true
|
|
|
|
head := w.Header()
|
2016-05-17 10:52:56 +00:00
|
|
|
head.Set("Content-Type", api.MediaType)
|
2015-03-20 01:55:40 +00:00
|
|
|
head.Set("Content-Length", strconv.Itoa(len(by)))
|
2016-11-08 18:22:29 +00:00
|
|
|
w.WriteHeader(200)
|
2015-03-20 01:55:40 +00:00
|
|
|
w.Write(by)
|
|
|
|
})
|
|
|
|
|
|
|
|
mux.HandleFunc("/verify", func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if r.Header.Get("B") != "2" {
|
|
|
|
t.Error("Invalid B")
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Content-Type") != api.MediaType {
|
2015-03-20 01:55:40 +00:00
|
|
|
t.Error("Invalid Content-Type")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
tee := io.TeeReader(r.Body, buf)
|
2016-05-16 11:31:23 +00:00
|
|
|
reqObj := &api.ObjectResource{}
|
2015-03-20 01:55:40 +00:00
|
|
|
err := json.NewDecoder(tee).Decode(reqObj)
|
|
|
|
t.Logf("request header: %v", r.Header)
|
|
|
|
t.Logf("request body: %s", buf.String())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-05-27 20:56:03 +00:00
|
|
|
if reqObj.Oid != "988881adc9fc3655077dc2d4d757d480b5ea0e11" {
|
2015-03-20 01:55:40 +00:00
|
|
|
t.Errorf("invalid oid from request: %s", reqObj.Oid)
|
|
|
|
}
|
|
|
|
|
|
|
|
if reqObj.Size != 4 {
|
|
|
|
t.Errorf("invalid size from request: %d", reqObj.Size)
|
|
|
|
}
|
|
|
|
|
|
|
|
verifyCalled = true
|
|
|
|
w.WriteHeader(200)
|
|
|
|
})
|
|
|
|
|
2016-08-09 19:18:18 +00:00
|
|
|
cfg := config.NewFrom(config.Values{
|
|
|
|
Git: map[string]string{
|
|
|
|
"lfs.url": server.URL + "/media",
|
|
|
|
},
|
|
|
|
})
|
2015-03-20 01:55:40 +00:00
|
|
|
|
2016-05-17 12:00:32 +00:00
|
|
|
oidPath, _ := lfs.LocalMediaPath("988881adc9fc3655077dc2d4d757d480b5ea0e11")
|
2015-03-20 01:55:40 +00:00
|
|
|
if err := ioutil.WriteFile(oidPath, []byte("test"), 0744); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-05-27 16:41:20 +00:00
|
|
|
oid := filepath.Base(oidPath)
|
|
|
|
stat, _ := os.Stat(oidPath)
|
2016-11-08 18:22:29 +00:00
|
|
|
o, _, err := api.BatchSingle(cfg, &api.ObjectResource{Oid: oid, Size: stat.Size()}, "upload", []string{"basic"})
|
2015-08-21 18:31:06 +00:00
|
|
|
if err != nil {
|
2016-03-01 16:34:05 +00:00
|
|
|
if isDockerConnectionError(err) {
|
|
|
|
return
|
|
|
|
}
|
2015-08-21 18:31:06 +00:00
|
|
|
t.Fatal(err)
|
2015-05-27 20:56:03 +00:00
|
|
|
}
|
2016-08-10 17:33:48 +00:00
|
|
|
api.VerifyUpload(cfg, o)
|
2015-03-20 01:55:40 +00:00
|
|
|
|
|
|
|
if !postCalled {
|
|
|
|
t.Errorf("POST not called")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !verifyCalled {
|
|
|
|
t.Errorf("verify not called")
|
|
|
|
}
|
|
|
|
}
|
2015-03-20 02:56:56 +00:00
|
|
|
|
|
|
|
func TestUploadApiError(t *testing.T) {
|
2016-05-16 14:06:02 +00:00
|
|
|
SetupTestCredentialsFunc()
|
2016-05-17 09:45:56 +00:00
|
|
|
repo := test.NewRepo(t)
|
|
|
|
repo.Pushd()
|
|
|
|
defer func() {
|
|
|
|
repo.Popd()
|
|
|
|
repo.Cleanup()
|
|
|
|
RestoreCredentialsFunc()
|
|
|
|
}()
|
2016-05-16 14:06:02 +00:00
|
|
|
|
2015-03-20 02:56:56 +00:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
server := httptest.NewServer(mux)
|
|
|
|
tmp := tempdir(t)
|
|
|
|
defer server.Close()
|
|
|
|
defer os.RemoveAll(tmp)
|
|
|
|
|
|
|
|
postCalled := false
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/media/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-20 02:56:56 +00:00
|
|
|
postCalled = true
|
|
|
|
w.WriteHeader(404)
|
|
|
|
})
|
|
|
|
|
2016-08-09 19:18:18 +00:00
|
|
|
cfg := config.NewFrom(config.Values{
|
|
|
|
Git: map[string]string{
|
|
|
|
"lfs.url": server.URL + "/media",
|
|
|
|
},
|
|
|
|
})
|
2015-03-20 02:56:56 +00:00
|
|
|
|
2016-05-17 12:00:32 +00:00
|
|
|
oidPath, _ := lfs.LocalMediaPath("988881adc9fc3655077dc2d4d757d480b5ea0e11")
|
2015-03-20 02:56:56 +00:00
|
|
|
if err := ioutil.WriteFile(oidPath, []byte("test"), 0744); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-05-27 16:41:20 +00:00
|
|
|
oid := filepath.Base(oidPath)
|
|
|
|
stat, _ := os.Stat(oidPath)
|
2016-11-08 18:22:29 +00:00
|
|
|
_, _, err := api.BatchSingle(cfg, &api.ObjectResource{Oid: oid, Size: stat.Size()}, "upload", []string{"basic"})
|
2015-08-21 18:31:06 +00:00
|
|
|
if err == nil {
|
|
|
|
t.Fatal(err)
|
2015-03-20 02:56:56 +00:00
|
|
|
}
|
|
|
|
|
2016-08-18 20:20:33 +00:00
|
|
|
if errors.IsFatalError(err) {
|
2015-03-20 02:56:56 +00:00
|
|
|
t.Fatal("should not panic")
|
|
|
|
}
|
|
|
|
|
2016-03-01 16:34:05 +00:00
|
|
|
if isDockerConnectionError(err) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
expected := "batch response: " + fmt.Sprintf(httputil.GetDefaultError(404), server.URL+"/media/objects/batch")
|
2016-08-17 23:56:44 +00:00
|
|
|
if err.Error() != expected {
|
|
|
|
t.Fatalf("Expected: %s\nGot: %s", expected, err.Error())
|
2015-03-20 02:56:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if !postCalled {
|
|
|
|
t.Errorf("POST not called")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUploadVerifyError(t *testing.T) {
|
2016-05-16 14:06:02 +00:00
|
|
|
SetupTestCredentialsFunc()
|
2016-05-17 09:45:56 +00:00
|
|
|
repo := test.NewRepo(t)
|
|
|
|
repo.Pushd()
|
|
|
|
defer func() {
|
|
|
|
repo.Popd()
|
|
|
|
repo.Cleanup()
|
|
|
|
RestoreCredentialsFunc()
|
|
|
|
}()
|
2016-05-16 14:06:02 +00:00
|
|
|
|
2015-03-20 02:56:56 +00:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
server := httptest.NewServer(mux)
|
|
|
|
tmp := tempdir(t)
|
|
|
|
defer server.Close()
|
|
|
|
defer os.RemoveAll(tmp)
|
|
|
|
|
|
|
|
postCalled := false
|
|
|
|
verifyCalled := false
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
mux.HandleFunc("/media/objects/batch", func(w http.ResponseWriter, r *http.Request) {
|
2015-03-20 02:56:56 +00:00
|
|
|
t.Logf("Server: %s %s", r.Method, r.URL)
|
|
|
|
|
|
|
|
if r.Method != "POST" {
|
|
|
|
w.WriteHeader(405)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Accept") != api.MediaType {
|
2015-03-20 02:56:56 +00:00
|
|
|
t.Errorf("Invalid Accept")
|
|
|
|
}
|
|
|
|
|
2016-05-17 10:52:56 +00:00
|
|
|
if r.Header.Get("Content-Type") != api.MediaType {
|
2015-03-20 02:56:56 +00:00
|
|
|
t.Errorf("Invalid Content-Type")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
tee := io.TeeReader(r.Body, buf)
|
2016-11-08 18:22:29 +00:00
|
|
|
reqObj := batchResponse{}
|
|
|
|
err := json.NewDecoder(tee).Decode(&reqObj)
|
2015-03-20 02:56:56 +00:00
|
|
|
t.Logf("request header: %v", r.Header)
|
|
|
|
t.Logf("request body: %s", buf.String())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
var obj *api.ObjectResource
|
|
|
|
if len(reqObj.Objects) != 1 {
|
|
|
|
t.Errorf("Invalid number of objects")
|
|
|
|
w.WriteHeader(400)
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
obj = reqObj.Objects[0]
|
|
|
|
if obj.Oid != "988881adc9fc3655077dc2d4d757d480b5ea0e11" {
|
|
|
|
t.Errorf("invalid oid from request: %s", obj.Oid)
|
|
|
|
}
|
2015-03-20 02:56:56 +00:00
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
if obj.Size != 4 {
|
|
|
|
t.Errorf("invalid size from request: %d", obj.Size)
|
|
|
|
}
|
2015-03-20 02:56:56 +00:00
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
obj.Actions = map[string]*api.LinkRelation{
|
|
|
|
"upload": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/upload",
|
|
|
|
Header: map[string]string{"A": "1"},
|
|
|
|
},
|
|
|
|
"verify": &api.LinkRelation{
|
|
|
|
Href: server.URL + "/verify",
|
|
|
|
Header: map[string]string{"B": "2"},
|
2015-03-20 02:56:56 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2016-11-08 18:22:29 +00:00
|
|
|
by, err := json.Marshal(newBatchResponse("", obj))
|
2015-03-20 02:56:56 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
postCalled = true
|
|
|
|
head := w.Header()
|
2016-05-17 10:52:56 +00:00
|
|
|
head.Set("Content-Type", api.MediaType)
|
2015-03-20 02:56:56 +00:00
|
|
|
head.Set("Content-Length", strconv.Itoa(len(by)))
|
2016-11-08 18:22:29 +00:00
|
|
|
w.WriteHeader(200)
|
2015-03-20 02:56:56 +00:00
|
|
|
w.Write(by)
|
|
|
|
})
|
|
|
|
|
|
|
|
mux.HandleFunc("/verify", func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
verifyCalled = true
|
|
|
|
w.WriteHeader(404)
|
|
|
|
})
|
|
|
|
|
2016-08-09 19:18:18 +00:00
|
|
|
cfg := config.NewFrom(config.Values{
|
|
|
|
Git: map[string]string{
|
|
|
|
"lfs.url": server.URL + "/media",
|
|
|
|
},
|
|
|
|
})
|
2015-03-20 02:56:56 +00:00
|
|
|
|
2016-05-17 12:00:32 +00:00
|
|
|
oidPath, _ := lfs.LocalMediaPath("988881adc9fc3655077dc2d4d757d480b5ea0e11")
|
2015-03-20 02:56:56 +00:00
|
|
|
if err := ioutil.WriteFile(oidPath, []byte("test"), 0744); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2016-05-27 16:41:20 +00:00
|
|
|
oid := filepath.Base(oidPath)
|
|
|
|
stat, _ := os.Stat(oidPath)
|
2016-11-08 18:22:29 +00:00
|
|
|
o, _, err := api.BatchSingle(cfg, &api.ObjectResource{Oid: oid, Size: stat.Size()}, "upload", []string{"basic"})
|
2015-08-21 18:31:06 +00:00
|
|
|
if err != nil {
|
2016-03-01 16:34:05 +00:00
|
|
|
if isDockerConnectionError(err) {
|
|
|
|
return
|
|
|
|
}
|
2015-08-21 18:31:06 +00:00
|
|
|
t.Fatal(err)
|
2015-05-27 20:56:03 +00:00
|
|
|
}
|
2016-08-10 17:33:48 +00:00
|
|
|
err = api.VerifyUpload(cfg, o)
|
2015-08-21 18:31:06 +00:00
|
|
|
if err == nil {
|
2016-05-27 16:41:20 +00:00
|
|
|
t.Fatal("verify should fail")
|
2015-03-20 02:56:56 +00:00
|
|
|
}
|
|
|
|
|
2016-08-18 20:20:33 +00:00
|
|
|
if errors.IsFatalError(err) {
|
2015-03-20 02:56:56 +00:00
|
|
|
t.Fatal("should not panic")
|
|
|
|
}
|
|
|
|
|
2016-08-18 21:02:21 +00:00
|
|
|
expected := fmt.Sprintf(httputil.GetDefaultError(404), server.URL+"/verify")
|
2016-08-17 23:56:44 +00:00
|
|
|
if err.Error() != expected {
|
|
|
|
t.Fatalf("Expected: %s\nGot: %s", expected, err.Error())
|
2015-03-20 02:56:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if !postCalled {
|
|
|
|
t.Errorf("POST not called")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !verifyCalled {
|
|
|
|
t.Errorf("verify not called")
|
|
|
|
}
|
2016-05-16 14:06:02 +00:00
|
|
|
|
2015-03-20 02:56:56 +00:00
|
|
|
}
|