bldy.build/build@v0.0.0-20181002085557-d04b29acc6a7/skylark/rulehash_test.go (about) 1 package skylark 2 3 import ( 4 "fmt" 5 "html/template" 6 "io" 7 "io/ioutil" 8 "math/rand" 9 "os" 10 "path/filepath" 11 "testing" 12 "time" 13 14 "bldy.build/build/label" 15 "bldy.build/build/workspace" 16 fuzz "github.com/google/gofuzz" 17 "github.com/icrowley/fake" 18 ) 19 20 func TestFile(t *testing.T) { 21 22 // lets create a tmp dir 23 dir, _ := ioutil.TempDir("", "bldy_fuzz") 24 // and make it a workspace 25 os.Create(filepath.Join(dir, "WORKSPACE")) 26 27 bytz, err := ioutil.ReadFile("testdata/hashtest/hashtest.sky") 28 if err != nil { 29 t.Log(err) 30 t.Fail() 31 return 32 } 33 34 ioutil.WriteFile(filepath.Join(dir, "hashtest.sky"), bytz, 0755) 35 if err != nil { 36 t.Log(err) 37 t.Fail() 38 return 39 } 40 41 tmpl := template.Must(template.New("BUILD").ParseFiles("testdata/hashtest/BUILD.tmpl")) 42 f, err := os.Create(filepath.Join(dir, "BUILD")) 43 if err != nil { 44 t.Log(err) 45 t.Fail() 46 return 47 } 48 49 data := randomData(dir) 50 51 if err := tmpl.Execute(f, data); err != nil { 52 t.Log(err) 53 t.Fail() 54 return 55 } 56 57 ws, err := workspace.New(dir) 58 vm, _ := New(ws) 59 _ = vm 60 x := make(map[string]string) 61 for _, d := range data { 62 l, err := label.Parse(fmt.Sprintf("//.:%s", d.Name)) 63 if err != nil { 64 panic(err) 65 } 66 67 target, err := vm.GetTarget(l) 68 if err != nil { 69 t.Log(err) 70 t.Fail() 71 return 72 } 73 h := target.Hash() 74 hs := fmt.Sprintf("%x", h) 75 76 if e, ok := x[hs]; ok && e != hs { 77 t.Logf("%s and %s have the same hash %x", l.String(), e, hs) 78 t.FailNow() 79 } 80 81 x[hs] = l.String() 82 break 83 } 84 85 os.RemoveAll(dir) 86 87 } 88 89 type testData struct { 90 Name string 91 Files []string 92 } 93 94 func randomData(wd string) []testData { 95 96 tds := []testData{} 97 for i := 0; i < 10+r(10); i++ { 98 td := testData{ 99 Name: fake.WordsN(1), 100 } 101 for k := 0; k < 1+r(10); k++ { 102 n := fake.WordsN(1) 103 f, _ := os.Create(filepath.Join(wd, fmt.Sprintf("%s.c", n))) 104 fzz := fuzz.New() 105 var s string 106 for j := 0; j < 10+r(50); j++ { 107 fzz.Fuzz(&s) 108 io.WriteString(f, s) 109 } 110 td.Files = append(td.Files, n) 111 } 112 tds = append(tds, td) 113 } 114 return tds 115 } 116 117 func r(i int) int { 118 r := rand.New(rand.NewSource(time.Now().UnixNano())) 119 return r.Intn(i) 120 }