github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/src/cmd/internal/buildid/buildid_test.go (about) 1 // Copyright 2017 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 buildid 6 7 import ( 8 "bytes" 9 "crypto/sha256" 10 "io/ioutil" 11 "os" 12 "reflect" 13 "testing" 14 ) 15 16 const ( 17 expectedID = "abcdefghijklmnopqrstuvwxyz.1234567890123456789012345678901234567890123456789012345678901234" 18 newID = "bcdefghijklmnopqrstuvwxyza.2345678901234567890123456789012345678901234567890123456789012341" 19 ) 20 21 func TestReadFile(t *testing.T) { 22 var files = []string{ 23 "p.a", 24 "a.elf", 25 "a.macho", 26 "a.pe", 27 } 28 29 f, err := ioutil.TempFile("", "buildid-test-") 30 if err != nil { 31 t.Fatal(err) 32 } 33 tmp := f.Name() 34 defer os.Remove(tmp) 35 f.Close() 36 37 for _, f := range files { 38 id, err := ReadFile("testdata/" + f) 39 if id != expectedID || err != nil { 40 t.Errorf("ReadFile(testdata/%s) = %q, %v, want %q, nil", f, id, err, expectedID) 41 } 42 old := readSize 43 readSize = 2048 44 id, err = ReadFile("testdata/" + f) 45 readSize = old 46 if id != expectedID || err != nil { 47 t.Errorf("ReadFile(testdata/%s) [readSize=2k] = %q, %v, want %q, nil", f, id, err, expectedID) 48 } 49 50 data, err := ioutil.ReadFile("testdata/" + f) 51 if err != nil { 52 t.Fatal(err) 53 } 54 m, _, err := FindAndHash(bytes.NewReader(data), expectedID, 1024) 55 if err != nil { 56 t.Errorf("FindAndHash(testdata/%s): %v", f, err) 57 continue 58 } 59 if err := ioutil.WriteFile(tmp, data, 0666); err != nil { 60 t.Error(err) 61 continue 62 } 63 tf, err := os.OpenFile(tmp, os.O_WRONLY, 0) 64 if err != nil { 65 t.Error(err) 66 continue 67 } 68 err = Rewrite(tf, m, newID) 69 err2 := tf.Close() 70 if err != nil { 71 t.Errorf("Rewrite(testdata/%s): %v", f, err) 72 continue 73 } 74 if err2 != nil { 75 t.Fatal(err2) 76 } 77 78 id, err = ReadFile(tmp) 79 if id != newID || err != nil { 80 t.Errorf("ReadFile(testdata/%s after Rewrite) = %q, %v, want %q, nil", f, id, err, newID) 81 } 82 } 83 } 84 85 func TestFindAndHash(t *testing.T) { 86 buf := make([]byte, 64) 87 buf2 := make([]byte, 64) 88 id := make([]byte, 8) 89 zero := make([]byte, 8) 90 for i := range id { 91 id[i] = byte(i) 92 } 93 numError := 0 94 errorf := func(msg string, args ...interface{}) { 95 t.Errorf(msg, args...) 96 if numError++; numError > 20 { 97 t.Logf("stopping after too many errors") 98 t.FailNow() 99 } 100 } 101 for bufSize := len(id); bufSize <= len(buf); bufSize++ { 102 for j := range buf { 103 for k := 0; k < 2*len(id) && j+k < len(buf); k++ { 104 for i := range buf { 105 buf[i] = 1 106 } 107 copy(buf[j:], id) 108 copy(buf[j+k:], id) 109 var m []int64 110 if j+len(id) <= j+k { 111 m = append(m, int64(j)) 112 } 113 if j+k+len(id) <= len(buf) { 114 m = append(m, int64(j+k)) 115 } 116 copy(buf2, buf) 117 for _, p := range m { 118 copy(buf2[p:], zero) 119 } 120 h := sha256.Sum256(buf2) 121 122 matches, hash, err := FindAndHash(bytes.NewReader(buf), string(id), bufSize) 123 if err != nil { 124 errorf("bufSize=%d j=%d k=%d: findAndHash: %v", bufSize, j, k, err) 125 continue 126 } 127 if !reflect.DeepEqual(matches, m) { 128 errorf("bufSize=%d j=%d k=%d: findAndHash: matches=%v, want %v", bufSize, j, k, matches, m) 129 continue 130 } 131 if hash != h { 132 errorf("bufSize=%d j=%d k=%d: findAndHash: matches correct, but hash=%x, want %x", bufSize, j, k, hash, h) 133 } 134 } 135 } 136 } 137 }