github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/buildtools/buck/buck_test.go (about) 1 package buck_test 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 11 "github.com/fossas/fossa-cli/api/fossa" 12 "github.com/fossas/fossa-cli/buildtools/buck" 13 "github.com/fossas/fossa-cli/pkg" 14 ) 15 16 func TestDirectDeps(t *testing.T) { 17 fossa.MockOrgID = "1" 18 testEnv := Mock() 19 20 direct, err := testEnv.Deps(false) 21 assert.NoError(t, err) 22 assert.Equal(t, 1, len(direct.Direct)) 23 assertImport(t, direct.Direct, "test-two") 24 25 transitive, err := testEnv.Deps(false) 26 assert.NoError(t, err) 27 assert.Equal(t, 2, len(transitive.Transitive)) 28 29 packageTwo, err := findPackage(transitive.Transitive, "test-two") 30 assert.NoError(t, err) 31 assert.Equal(t, 1, len(packageTwo.Imports)) 32 assertImport(t, packageTwo.Imports, "test-three") 33 34 packageThree, err := findPackage(transitive.Transitive, "test-three") 35 assert.NoError(t, err) 36 assert.Equal(t, 0, len(packageThree.Imports)) 37 } 38 39 func TestDepsAllSubprojects(t *testing.T) { 40 fossa.MockOrgID = "1" 41 testBuck := mockSubProjects() 42 43 direct, err := testBuck.Deps(false) 44 assert.NoError(t, err) 45 assert.Equal(t, 3, len(direct.Direct)) 46 assertImport(t, direct.Direct, "test-one") 47 assertImport(t, direct.Direct, "test-two") 48 assertImport(t, direct.Direct, "test-three") 49 50 transitive, err := testBuck.Deps(false) 51 assert.NoError(t, err) 52 assert.Equal(t, 3, len(transitive.Transitive)) 53 54 packageOne, err := findPackage(transitive.Transitive, "test-one") 55 assert.NoError(t, err) 56 assert.Equal(t, 1, len(packageOne.Imports)) 57 assertImport(t, packageOne.Imports, "test-two") 58 59 packageTwo, err := findPackage(transitive.Transitive, "test-two") 60 assert.NoError(t, err) 61 assert.Equal(t, 1, len(packageTwo.Imports)) 62 assertImport(t, packageTwo.Imports, "test-three") 63 64 packageThree, err := findPackage(transitive.Transitive, "test-three") 65 assert.NoError(t, err) 66 assert.Equal(t, 0, len(packageThree.Imports)) 67 } 68 69 // Mock constructs a buck.Cmd using mock build tool output. 70 func Mock() buck.Setup { 71 return buck.Setup{ 72 Target: "//buck/test:one", 73 Cmd: func(cmd string, args ...string) (string, error) { 74 switch cmd { 75 case "root": 76 return os.Getwd() 77 case "audit": 78 switch args[0] { 79 case "input": 80 return testFile("testdata/input.json") 81 case "dependencies": 82 switch args[2] { 83 case "//buck/test:one": 84 if len(args) > 3 && args[3] == "--transitive" { 85 return testFile("testdata/dependenciesTransitive.json") 86 } 87 return testFile("testdata/dependencies.json") 88 case "//buck/test:two": 89 return testFile("testdata/dependenciesDepTwo.json") 90 case "//buck/test:three": 91 return testFile("testdata/dependenciesDepThree.json") 92 default: 93 return "", nil 94 } 95 default: 96 return "", nil 97 } 98 default: 99 return "", nil 100 } 101 }, 102 } 103 } 104 105 func mockSubProjects() buck.Setup { 106 return buck.Setup{ 107 Target: "//buck/allprojects/...", 108 Cmd: func(cmd string, args ...string) (string, error) { 109 switch cmd { 110 case "root": 111 return os.Getwd() 112 case "audit": 113 switch args[0] { 114 case "input": 115 return testFile("testdata/inputAllSubprojects.json") 116 case "dependencies": 117 switch args[2] { 118 case "//buck/test:one": 119 return testFile("testdata/dependencies.json") 120 case "//buck/test:two": 121 return testFile("testdata/dependenciesDepTwo.json") 122 case "//buck/test:three": 123 return testFile("testdata/dependenciesDepThree.json") 124 default: 125 return "", nil 126 } 127 default: 128 return "", nil 129 } 130 case "targets": 131 return testFile("testdata/targets.txt") 132 default: 133 return "", nil 134 } 135 }, 136 } 137 } 138 139 func testFile(file string) (string, error) { 140 contents, err := ioutil.ReadFile(file) 141 if err != nil { 142 return "", err 143 } 144 return string(contents), nil 145 } 146 147 func findPackage(packages map[pkg.ID]pkg.Package, name string) (pkg.Package, error) { 148 for id := range packages { 149 if id.Name == name { 150 return packages[id], nil 151 } 152 } 153 return pkg.Package{}, fmt.Errorf("Package %s not found", name) 154 } 155 156 func assertImport(t *testing.T, imports pkg.Imports, name string) { 157 for _, importedProj := range imports { 158 if importedProj.Resolved.Name == name { 159 return 160 } 161 } 162 assert.Fail(t, "missing "+name) 163 }