|  | // Copyright 2020 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package embedtest_test | 
|  |  | 
|  | import ( | 
|  | "embed" | 
|  | "os" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | var ( | 
|  | global2      = global | 
|  | concurrency2 = concurrency | 
|  | glass2       = glass | 
|  | sbig2        = sbig | 
|  | bbig2        = bbig | 
|  | ) | 
|  |  | 
|  | //go:embed testdata/*.txt | 
|  | var global embed.FS | 
|  |  | 
|  | //go:embed c*txt | 
|  | var concurrency string | 
|  |  | 
|  | //go:embed testdata/g*.txt | 
|  | var glass []byte | 
|  |  | 
|  | //go:embed testdata/ascii.txt | 
|  | var sbig string | 
|  |  | 
|  | //go:embed testdata/ascii.txt | 
|  | var bbig []byte | 
|  |  | 
|  | func testFiles(t *testing.T, f embed.FS, name, data string) { | 
|  | t.Helper() | 
|  | d, err := f.ReadFile(name) | 
|  | if err != nil { | 
|  | t.Error(err) | 
|  | return | 
|  | } | 
|  | if string(d) != data { | 
|  | t.Errorf("read %v = %q, want %q", name, d, data) | 
|  | } | 
|  | } | 
|  |  | 
|  | func testString(t *testing.T, s, name, data string) { | 
|  | t.Helper() | 
|  | if s != data { | 
|  | t.Errorf("%v = %q, want %q", name, s, data) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestXGlobal(t *testing.T) { | 
|  | testFiles(t, global, "testdata/hello.txt", "hello, world\n") | 
|  | testString(t, concurrency, "concurrency", "Concurrency is not parallelism.\n") | 
|  | testString(t, string(glass), "glass", "I can eat glass and it doesn't hurt me.\n") | 
|  | testString(t, concurrency2, "concurrency2", "Concurrency is not parallelism.\n") | 
|  | testString(t, string(glass2), "glass2", "I can eat glass and it doesn't hurt me.\n") | 
|  |  | 
|  | big, err := os.ReadFile("testdata/ascii.txt") | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | testString(t, sbig, "sbig", string(big)) | 
|  | testString(t, sbig2, "sbig2", string(big)) | 
|  | testString(t, string(bbig), "bbig", string(big)) | 
|  | testString(t, string(bbig2), "bbig", string(big)) | 
|  |  | 
|  | if t.Failed() { | 
|  | return | 
|  | } | 
|  |  | 
|  | // Could check &glass[0] == &glass2[0] but also want to make sure write does not fault | 
|  | // (data must not be in read-only memory). | 
|  | old := glass[0] | 
|  | glass[0]++ | 
|  | if glass2[0] != glass[0] { | 
|  | t.Fatalf("glass and glass2 do not share storage") | 
|  | } | 
|  | glass[0] = old | 
|  |  | 
|  | // Could check &bbig[0] == &bbig2[0] but also want to make sure write does not fault | 
|  | // (data must not be in read-only memory). | 
|  | old = bbig[0] | 
|  | bbig[0]++ | 
|  | if bbig2[0] != bbig[0] { | 
|  | t.Fatalf("bbig and bbig2 do not share storage") | 
|  | } | 
|  | bbig[0] = old | 
|  | } |