github.com/grailbio/base@v0.0.11/embedbin/embedbin_test.go (about)

     1  // Copyright 2019 GRAIL, Inc. All rights reserved.
     2  // Use of this source code is governed by the Apache 2.0
     3  // license that can be found in the LICENSE file.
     4  
     5  package embedbin
     6  
     7  import (
     8  	"bytes"
     9  	"io"
    10  	"io/ioutil"
    11  	"os"
    12  	"testing"
    13  )
    14  
    15  func TestEmbedbin(t *testing.T) {
    16  	filename, err := os.Executable()
    17  	if err != nil {
    18  		t.Fatal(err)
    19  	}
    20  	body, err := ioutil.ReadFile(filename)
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  
    25  	self, err := Self()
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  	r, err := self.OpenBase()
    30  	if err != nil {
    31  		t.Fatal(err)
    32  	}
    33  	defer r.Close()
    34  	embedded, err := ioutil.ReadAll(r)
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  	if !bytes.Equal(body, embedded) {
    39  		t.Error("content mismatch")
    40  	}
    41  }
    42  
    43  func TestEmbedbinNonExist(t *testing.T) {
    44  	self, err := Self()
    45  	if err != nil {
    46  		t.Fatal(err)
    47  	}
    48  	_, err = self.Open("nonexistent")
    49  	if got, want := err, ErrNoSuchFile; got != want {
    50  		t.Errorf("got %v, want %v", got, want)
    51  	}
    52  }
    53  
    54  func TestSniff(t *testing.T) {
    55  	filename, err := os.Executable()
    56  	if err != nil {
    57  		t.Fatal(err)
    58  	}
    59  	f, err := os.Open(filename)
    60  	if err != nil {
    61  		t.Fatal(err)
    62  	}
    63  	defer f.Close()
    64  	info, err := f.Stat()
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  
    69  	size, err := Sniff(f, info.Size())
    70  	if err != nil {
    71  		t.Fatal(err)
    72  	}
    73  	if got, want := size, info.Size(); got != want {
    74  		t.Errorf("got %v, want %v", got, want)
    75  	}
    76  }
    77  
    78  func TestCreate(t *testing.T) {
    79  	f, err := ioutil.TempFile("", "")
    80  	must(t, err)
    81  	_, err = f.Write(svelteLinuxElfBinary)
    82  	must(t, err)
    83  	w, err := NewFileWriter(f)
    84  	must(t, err)
    85  	dw, err := w.Create("darwin/amd64")
    86  	must(t, err)
    87  	_, err = dw.Write([]byte("darwin/amd64"))
    88  	must(t, err)
    89  	dw, err = w.Create("darwin/386")
    90  	must(t, err)
    91  	_, err = dw.Write([]byte("darwin/386"))
    92  	must(t, err)
    93  	must(t, w.Close())
    94  	info, err := f.Stat()
    95  	must(t, err)
    96  	r, err := OpenFile(f, info.Size())
    97  	must(t, err)
    98  
    99  	cases := []struct {
   100  		base bool
   101  		name string
   102  		body []byte
   103  	}{
   104  		{base: true, body: svelteLinuxElfBinary},
   105  		{name: "darwin/amd64", body: []byte("darwin/amd64")},
   106  		{name: "darwin/386", body: []byte("darwin/386")},
   107  	}
   108  	for _, c := range cases {
   109  		t.Run(c.name, func(t *testing.T) {
   110  			var rc io.ReadCloser
   111  			if c.base {
   112  				rc, err = r.OpenBase()
   113  			} else {
   114  				rc, err = r.Open(c.name)
   115  			}
   116  			if err != nil {
   117  				t.Fatal(err)
   118  			}
   119  			mustBytes(t, rc, c.body)
   120  			must(t, rc.Close())
   121  			if c.base {
   122  				return
   123  			}
   124  			info, ok := r.Stat(c.name)
   125  			if !ok {
   126  				t.Errorf("%s/%t: not found", c.name, c.base)
   127  				return
   128  			}
   129  			if got, want := info.Size, int64(len(c.body)); got != want {
   130  				t.Errorf("%s: got %v, want %v", c.name, got, want)
   131  			}
   132  		})
   133  	}
   134  
   135  	_, err = r.Open("nonexistent")
   136  	if got, want := err, ErrNoSuchFile; got != want {
   137  		t.Errorf("got %v, want %v", got, want)
   138  	}
   139  }
   140  
   141  func must(t *testing.T, err error) {
   142  	t.Helper()
   143  	if err != nil {
   144  		t.Fatal(err)
   145  	}
   146  }
   147  
   148  func mustBytes(t *testing.T, r io.Reader, want []byte) {
   149  	t.Helper()
   150  	got, err := ioutil.ReadAll(r)
   151  	if err != nil {
   152  		t.Fatal(err)
   153  	}
   154  	if !bytes.Equal(got, want) {
   155  		t.Errorf("got %s, want %s", got, want)
   156  	}
   157  }