github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/embed/internal/embedtest/embed_test.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package embedtest 6 7 import ( 8 "embed" 9 "reflect" 10 "testing" 11 "testing/fstest" 12 ) 13 14 //go:embed testdata/h*.txt 15 //go:embed c*.txt testdata/g*.txt 16 var global embed.FS 17 18 //go:embed c*txt 19 var concurrency string 20 21 //go:embed testdata/g*.txt 22 var glass []byte 23 24 func testFiles(t *testing.T, f embed.FS, name, data string) { 25 t.Helper() 26 d, err := f.ReadFile(name) 27 if err != nil { 28 t.Error(err) 29 return 30 } 31 if string(d) != data { 32 t.Errorf("read %v = %q, want %q", name, d, data) 33 } 34 } 35 36 func testString(t *testing.T, s, name, data string) { 37 t.Helper() 38 if s != data { 39 t.Errorf("%v = %q, want %q", name, s, data) 40 } 41 } 42 43 func testDir(t *testing.T, f embed.FS, name string, expect ...string) { 44 t.Helper() 45 dirs, err := f.ReadDir(name) 46 if err != nil { 47 t.Error(err) 48 return 49 } 50 var names []string 51 for _, d := range dirs { 52 name := d.Name() 53 if d.IsDir() { 54 name += "/" 55 } 56 names = append(names, name) 57 } 58 if !reflect.DeepEqual(names, expect) { 59 t.Errorf("readdir %v = %v, want %v", name, names, expect) 60 } 61 } 62 63 func TestGlobal(t *testing.T) { 64 testFiles(t, global, "concurrency.txt", "Concurrency is not parallelism.\n") 65 testFiles(t, global, "testdata/hello.txt", "hello, world\n") 66 testFiles(t, global, "testdata/glass.txt", "I can eat glass and it doesn't hurt me.\n") 67 68 if err := fstest.TestFS(global, "concurrency.txt", "testdata/hello.txt"); err != nil { 69 t.Fatal(err) 70 } 71 72 testString(t, concurrency, "concurrency", "Concurrency is not parallelism.\n") 73 testString(t, string(glass), "glass", "I can eat glass and it doesn't hurt me.\n") 74 } 75 76 //go:embed testdata 77 var testDirAll embed.FS 78 79 func TestDir(t *testing.T) { 80 all := testDirAll 81 testFiles(t, all, "testdata/hello.txt", "hello, world\n") 82 testFiles(t, all, "testdata/i/i18n.txt", "internationalization\n") 83 testFiles(t, all, "testdata/i/j/k/k8s.txt", "kubernetes\n") 84 testFiles(t, all, "testdata/ken.txt", "If a program is too slow, it must have a loop.\n") 85 86 testDir(t, all, ".", "testdata/") 87 testDir(t, all, "testdata/i", "i18n.txt", "j/") 88 testDir(t, all, "testdata/i/j", "k/") 89 testDir(t, all, "testdata/i/j/k", "k8s.txt") 90 } 91 92 //go:embed testdata 93 var testHiddenDir embed.FS 94 95 //go:embed testdata/* 96 var testHiddenStar embed.FS 97 98 func TestHidden(t *testing.T) { 99 dir := testHiddenDir 100 star := testHiddenStar 101 102 t.Logf("//go:embed testdata") 103 104 testDir(t, dir, "testdata", 105 "-not-hidden/", "ascii.txt", "glass.txt", "hello.txt", "i/", "ken.txt") 106 107 t.Logf("//go:embed testdata/*") 108 109 testDir(t, star, "testdata", 110 "-not-hidden/", ".hidden/", "_hidden/", "ascii.txt", "glass.txt", "hello.txt", "i/", "ken.txt") 111 112 testDir(t, star, "testdata/.hidden", 113 "fortune.txt", "more/") // but not .more or _more 114 } 115 116 func TestUninitialized(t *testing.T) { 117 var uninitialized embed.FS 118 testDir(t, uninitialized, ".") 119 f, err := uninitialized.Open(".") 120 if err != nil { 121 t.Fatal(err) 122 } 123 defer f.Close() 124 fi, err := f.Stat() 125 if err != nil { 126 t.Fatal(err) 127 } 128 if !fi.IsDir() { 129 t.Errorf("in uninitialized embed.FS, . is not a directory") 130 } 131 } 132 133 var ( 134 //go:embed "testdata/hello.txt" 135 helloT []T 136 //go:embed "testdata/hello.txt" 137 helloUint8 []uint8 138 //go:embed "testdata/hello.txt" 139 helloEUint8 []EmbedUint8 140 //go:embed "testdata/hello.txt" 141 helloBytes EmbedBytes 142 //go:embed "testdata/hello.txt" 143 helloString EmbedString 144 ) 145 146 type T byte 147 type EmbedUint8 uint8 148 type EmbedBytes []byte 149 type EmbedString string 150 151 // golang.org/issue/47735 152 func TestAliases(t *testing.T) { 153 all := testDirAll 154 want, e := all.ReadFile("testdata/hello.txt") 155 if e != nil { 156 t.Fatal("ReadFile:", e) 157 } 158 check := func(g interface{}) { 159 got := reflect.ValueOf(g) 160 for i := 0; i < got.Len(); i++ { 161 if byte(got.Index(i).Uint()) != want[i] { 162 t.Fatalf("got %v want %v", got.Bytes(), want) 163 } 164 } 165 } 166 check(helloT) 167 check(helloUint8) 168 check(helloEUint8) 169 check(helloBytes) 170 check(helloString) 171 }