git-lfs/t/git-lfs-test-server-api/testdownload.go
Taylor Blau 7b1420243e test: move to 'test' to 't'
By default, the prove(1) program looks for tests to run in the 't'
directory at the repository root, so let's put existing tests there in
order to remove a non-default argument from prove.
2018-07-09 16:07:32 -05:00

126 lines
3.3 KiB
Go

package main
import (
"bytes"
"errors"
"fmt"
"github.com/git-lfs/git-lfs/tools"
"github.com/git-lfs/git-lfs/tq"
)
// "download" - all present
func downloadAllExist(manifest *tq.Manifest, oidsExist, oidsMissing []TestObject) error {
retobjs, err := callBatchApi(manifest, tq.Download, oidsExist)
if err != nil {
return err
}
if len(retobjs) != len(oidsExist) {
return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", len(oidsExist), len(retobjs))
}
var errbuf bytes.Buffer
for _, o := range retobjs {
rel, _ := o.Rel("download")
if rel == nil {
errbuf.WriteString(fmt.Sprintf("Missing download link for %s\n", o.Oid))
}
}
if errbuf.Len() > 0 {
return errors.New(errbuf.String())
}
return nil
}
// "download" - all missing (test includes 404 error entry)
func downloadAllMissing(manifest *tq.Manifest, oidsExist, oidsMissing []TestObject) error {
retobjs, err := callBatchApi(manifest, tq.Download, oidsMissing)
if err != nil {
return err
}
if len(retobjs) != len(oidsMissing) {
return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", len(oidsMissing), len(retobjs))
}
var errbuf bytes.Buffer
for _, o := range retobjs {
link, _ := o.Rel("download")
if link != nil {
errbuf.WriteString(fmt.Sprintf("Download link should not exist for %s, was %+v\n", o.Oid, link))
}
if o.Error == nil {
errbuf.WriteString(fmt.Sprintf("Download should include an error for missing object %s\n", o.Oid))
} else if o.Error.Code != 404 {
errbuf.WriteString(fmt.Sprintf("Download error code for missing object %s should be 404, got %d\n", o.Oid, o.Error.Code))
}
}
if errbuf.Len() > 0 {
return errors.New(errbuf.String())
}
return nil
}
// "download" - mixture
func downloadMixed(manifest *tq.Manifest, oidsExist, oidsMissing []TestObject) error {
existSet := tools.NewStringSetWithCapacity(len(oidsExist))
for _, o := range oidsExist {
existSet.Add(o.Oid)
}
missingSet := tools.NewStringSetWithCapacity(len(oidsMissing))
for _, o := range oidsMissing {
missingSet.Add(o.Oid)
}
calloids := interleaveTestData(oidsExist, oidsMissing)
retobjs, err := callBatchApi(manifest, tq.Download, calloids)
if err != nil {
return err
}
count := len(oidsExist) + len(oidsMissing)
if len(retobjs) != count {
return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", count, len(retobjs))
}
var errbuf bytes.Buffer
for _, o := range retobjs {
link, _ := o.Rel("download")
if missingSet.Contains(o.Oid) {
if link != nil {
errbuf.WriteString(fmt.Sprintf("Download link should not exist for %s, was %+v\n", o.Oid, link))
}
if o.Error == nil {
errbuf.WriteString(fmt.Sprintf("Download should include an error for missing object %s", o.Oid))
} else if o.Error.Code != 404 {
errbuf.WriteString(fmt.Sprintf("Download error code for missing object %s should be 404, got %d\n", o.Oid, o.Error.Code))
}
}
if existSet.Contains(o.Oid) && link == nil {
errbuf.WriteString(fmt.Sprintf("Missing download link for %s\n", o.Oid))
}
}
if errbuf.Len() > 0 {
return errors.New(errbuf.String())
}
return nil
}
func init() {
addTest("Test download: all existing", downloadAllExist)
addTest("Test download: all missing", downloadAllMissing)
addTest("Test download: mixed", downloadMixed)
}