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  }