github.com/0xKiwi/rules_go@v0.24.3/tests/core/go_embed_data/embed_test.go (about)

     1  package go_embed_data
     2  
     3  import (
     4  	"io"
     5  	"log"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/bazelbuild/rules_go/go/tools/bazel"
    11  )
    12  
    13  func TestMain(m *testing.M) {
    14  	// This test must run from the workspace root since it accesses files using
    15  	// relative paths. We look at parent directories until we find AUTHORS,
    16  	// then change to that directory.
    17  	for {
    18  		if _, err := os.Stat("AUTHORS"); err == nil {
    19  			break
    20  		}
    21  		if err := os.Chdir(".."); err != nil {
    22  			log.Fatal(err)
    23  		}
    24  		if wd, err := os.Getwd(); err != nil {
    25  			log.Fatal(err)
    26  		} else if wd == "/" {
    27  			log.Fatal("could not locate workspace root")
    28  		}
    29  	}
    30  	os.Exit(m.Run())
    31  }
    32  
    33  func TestCgo(t *testing.T) {
    34  	if len(cgo) == 0 {
    35  		t.Fatalf("cgo is empty")
    36  	}
    37  }
    38  
    39  func TestEmpty(t *testing.T) {
    40  	if len(empty) != 0 {
    41  		t.Fatalf("empty is not empty")
    42  	}
    43  }
    44  
    45  func TestSingle(t *testing.T) {
    46  	checkFile(t, "AUTHORS", single)
    47  }
    48  
    49  func TestLocal(t *testing.T) {
    50  	for path, data := range local {
    51  		checkFile(t, path, data)
    52  	}
    53  }
    54  
    55  func TestExternal(t *testing.T) {
    56  	for path, data := range ext {
    57  		checkFile(t, path, data)
    58  	}
    59  }
    60  
    61  func TestFlat(t *testing.T) {
    62  	for key := range flat {
    63  		if filepath.Base(key) != key {
    64  			t.Errorf("filename %q is not flat", key)
    65  		}
    66  	}
    67  }
    68  
    69  func TestString(t *testing.T) {
    70  	for _, data := range str {
    71  		var _ string = data // just check the type; contents covered by other tests.
    72  	}
    73  }
    74  
    75  func TestUnpack(t *testing.T) {
    76  	for _, data := range unpack {
    77  		checkFile(t, "tests/core/go_embed_data/BUILD.bazel", data)
    78  	}
    79  	for _, key := range []string{
    80  		"from-zip/BUILD.bazel",
    81  		// Note: Bazel's pkg_tar always adds a leading "./" to its outputs,
    82  		// but tars generated from other sources can match the original
    83  		// inputs more exactly.
    84  		"./from-tar/BUILD.bazel",
    85  	} {
    86  		if _, ok := unpack[key]; !ok {
    87  			t.Errorf("filename %q is not in unpacked set", key)
    88  		}
    89  	}
    90  }
    91  
    92  func checkFile(t *testing.T, rawPath string, data []byte) {
    93  	path, err := bazel.Runfile(rawPath)
    94  	if err != nil {
    95  		t.Error(err)
    96  		return
    97  	}
    98  
    99  	f, err := os.Open(path)
   100  	if err != nil {
   101  		t.Error(err)
   102  		return
   103  	}
   104  	defer f.Close()
   105  
   106  	count := 0
   107  	buffer := make([]byte, 8192)
   108  	for {
   109  		n, err := f.Read(buffer)
   110  		if err != nil && err != io.EOF {
   111  			t.Error(err)
   112  			return
   113  		}
   114  		if n == 0 {
   115  			return
   116  		}
   117  		if n > len(data) {
   118  			t.Errorf("%q: file on disk is longer than embedded data", path)
   119  			return
   120  		}
   121  
   122  		for i := 0; i < n; i++ {
   123  			if buffer[i] != data[i] {
   124  				t.Errorf("data mismatch on file %q at offset %d", path, count+i)
   125  				return
   126  			}
   127  		}
   128  		count += n
   129  		data = data[n:]
   130  	}
   131  }