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  }