github.com/git-lfs/git-lfs@v2.5.2+incompatible/t/git-lfs-test-server-api/testdownload.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"fmt"
     7  
     8  	"github.com/git-lfs/git-lfs/tools"
     9  	"github.com/git-lfs/git-lfs/tq"
    10  )
    11  
    12  // "download" - all present
    13  func downloadAllExist(manifest *tq.Manifest, oidsExist, oidsMissing []TestObject) error {
    14  	retobjs, err := callBatchApi(manifest, tq.Download, oidsExist)
    15  
    16  	if err != nil {
    17  		return err
    18  	}
    19  
    20  	if len(retobjs) != len(oidsExist) {
    21  		return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", len(oidsExist), len(retobjs))
    22  	}
    23  
    24  	var errbuf bytes.Buffer
    25  	for _, o := range retobjs {
    26  		rel, _ := o.Rel("download")
    27  		if rel == nil {
    28  			errbuf.WriteString(fmt.Sprintf("Missing download link for %s\n", o.Oid))
    29  		}
    30  	}
    31  
    32  	if errbuf.Len() > 0 {
    33  		return errors.New(errbuf.String())
    34  	}
    35  
    36  	return nil
    37  }
    38  
    39  // "download" - all missing (test includes 404 error entry)
    40  func downloadAllMissing(manifest *tq.Manifest, oidsExist, oidsMissing []TestObject) error {
    41  	retobjs, err := callBatchApi(manifest, tq.Download, oidsMissing)
    42  
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	if len(retobjs) != len(oidsMissing) {
    48  		return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", len(oidsMissing), len(retobjs))
    49  	}
    50  
    51  	var errbuf bytes.Buffer
    52  	for _, o := range retobjs {
    53  		link, _ := o.Rel("download")
    54  		if link != nil {
    55  			errbuf.WriteString(fmt.Sprintf("Download link should not exist for %s, was %+v\n", o.Oid, link))
    56  		}
    57  		if o.Error == nil {
    58  			errbuf.WriteString(fmt.Sprintf("Download should include an error for missing object %s\n", o.Oid))
    59  		} else if o.Error.Code != 404 {
    60  			errbuf.WriteString(fmt.Sprintf("Download error code for missing object %s should be 404, got %d\n", o.Oid, o.Error.Code))
    61  		}
    62  	}
    63  
    64  	if errbuf.Len() > 0 {
    65  		return errors.New(errbuf.String())
    66  	}
    67  
    68  	return nil
    69  }
    70  
    71  // "download" - mixture
    72  func downloadMixed(manifest *tq.Manifest, oidsExist, oidsMissing []TestObject) error {
    73  	existSet := tools.NewStringSetWithCapacity(len(oidsExist))
    74  	for _, o := range oidsExist {
    75  		existSet.Add(o.Oid)
    76  	}
    77  	missingSet := tools.NewStringSetWithCapacity(len(oidsMissing))
    78  	for _, o := range oidsMissing {
    79  		missingSet.Add(o.Oid)
    80  	}
    81  
    82  	calloids := interleaveTestData(oidsExist, oidsMissing)
    83  	retobjs, err := callBatchApi(manifest, tq.Download, calloids)
    84  
    85  	if err != nil {
    86  		return err
    87  	}
    88  
    89  	count := len(oidsExist) + len(oidsMissing)
    90  	if len(retobjs) != count {
    91  		return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", count, len(retobjs))
    92  	}
    93  
    94  	var errbuf bytes.Buffer
    95  	for _, o := range retobjs {
    96  		link, _ := o.Rel("download")
    97  		if missingSet.Contains(o.Oid) {
    98  			if link != nil {
    99  				errbuf.WriteString(fmt.Sprintf("Download link should not exist for %s, was %+v\n", o.Oid, link))
   100  			}
   101  			if o.Error == nil {
   102  				errbuf.WriteString(fmt.Sprintf("Download should include an error for missing object %s", o.Oid))
   103  			} else if o.Error.Code != 404 {
   104  				errbuf.WriteString(fmt.Sprintf("Download error code for missing object %s should be 404, got %d\n", o.Oid, o.Error.Code))
   105  			}
   106  		}
   107  		if existSet.Contains(o.Oid) && link == nil {
   108  			errbuf.WriteString(fmt.Sprintf("Missing download link for %s\n", o.Oid))
   109  		}
   110  
   111  	}
   112  
   113  	if errbuf.Len() > 0 {
   114  		return errors.New(errbuf.String())
   115  	}
   116  
   117  	return nil
   118  
   119  }
   120  
   121  func init() {
   122  	addTest("Test download: all existing", downloadAllExist)
   123  	addTest("Test download: all missing", downloadAllMissing)
   124  	addTest("Test download: mixed", downloadMixed)
   125  }