github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/buildtools/maven/maven_test.go (about)

     1  package maven_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	"github.com/fossas/fossa-cli/buildtools/maven"
    11  	"github.com/fossas/fossa-cli/files"
    12  	"github.com/fossas/fossa-cli/pkg"
    13  )
    14  
    15  var testPoms = filepath.Join("testdata", "poms")
    16  
    17  func TestModules(t *testing.T) {
    18  	// Here we mostly just test the discovery of POM files, and analyzers/maven tests that we get the correct
    19  	// list of MvnModules.
    20  
    21  	simplePom := filepath.Join(testPoms, "pom.xml")
    22  	checked := make(map[string]bool)
    23  	mods, err := maven.Modules(simplePom, testPoms, checked)
    24  	assert.NoError(t, err)
    25  	assert.Len(t, mods, 1)
    26  	exists, err := files.Exists(mods[0].Dir, mods[0].Target)
    27  	assert.NoError(t, err)
    28  	assert.True(t, exists)
    29  
    30  	// Now that pom.xml in testPoms has been checked, make sure we don't check it again.
    31  	modsAgain, err := maven.Modules(simplePom, testPoms, checked)
    32  	assert.NoError(t, err)
    33  	assert.Nil(t, modsAgain)
    34  
    35  	// Make sure we follow references to other modules (module as path to a file) listed in the POM file.
    36  	pomWithModules := filepath.Join(testPoms, "nested", "pom.xml")
    37  	mods2, err := maven.Modules(pomWithModules, testPoms, make(map[string]bool))
    38  	assert.NoError(t, err)
    39  	assert.Len(t, mods2, 3)
    40  	for _, mod := range mods2 {
    41  		exists, err := files.Exists(mod.Dir, mod.Target)
    42  		assert.NoError(t, err)
    43  		assert.True(t, exists)
    44  	}
    45  
    46  	// Make sure we follow references to other modules (module as path to a directory) listed in the POM file.
    47  	pomWithModules2 := filepath.Join(testPoms, "pom-minimal.xml")
    48  	mods3, err := maven.Modules(pomWithModules2, testPoms, make(map[string]bool))
    49  	assert.NoError(t, err)
    50  	assert.Len(t, mods3, 4)
    51  	for _, mod := range mods3 {
    52  		exists, err := files.Exists(mod.Dir, mod.Target)
    53  		assert.NoError(t, err)
    54  		assert.True(t, exists)
    55  	}
    56  
    57  	// Test the fallback to artifact ID if name is not given in the manifest.
    58  	assert.Contains(t, mods3, maven.MvnModule{Name: "minimal", Target: "pom-minimal.xml", Dir: testPoms})
    59  }
    60  
    61  func TestParseDependencyTreeDOS(t *testing.T) {
    62  	// Check that the file is still DOS formatted.
    63  	data, err := ioutil.ReadFile(filepath.Join("testdata", "dos.out"))
    64  	assert.NoError(t, err)
    65  
    66  	fixture := string(data)
    67  	for i := range fixture {
    68  		if i == 0 {
    69  			continue
    70  		}
    71  		if fixture[i] == '\n' {
    72  			assert.Equal(t, uint8('\r'), fixture[i-1])
    73  		}
    74  	}
    75  
    76  	deps, err := maven.ParseDependencyTree(fixture)
    77  	assert.NoError(t, err)
    78  	assert.NotEmpty(t, deps.Direct)
    79  	assert.NotEmpty(t, deps.Transitive)
    80  }
    81  
    82  func TestParseDependencyTreeUnix(t *testing.T) {
    83  	// Check that the file is still Unix formatted.
    84  	data, err := ioutil.ReadFile(filepath.Join("testdata", "unix.out"))
    85  	assert.NoError(t, err)
    86  
    87  	fixture := string(data)
    88  	for i := range fixture {
    89  		if i == 0 {
    90  			continue
    91  		}
    92  		if fixture[i] == '\n' {
    93  			assert.NotEqual(t, '\r', fixture[i-1])
    94  		}
    95  	}
    96  
    97  	deps, err := maven.ParseDependencyTree(fixture)
    98  	assert.NoError(t, err)
    99  	assert.NotEmpty(t, deps.Direct)
   100  	assert.NotEmpty(t, deps.Transitive)
   101  }
   102  
   103  /*
   104  	├── dep:one:1.0.0
   105  	└─┬ dep:two:2.0.0
   106  	  ├─┬ dep:three:3.0.0
   107  	  │ └── dep:four:4.0.0
   108  	  └── dep:five:5.0.0
   109  */
   110  
   111  var depOne = pkg.ID{Type: pkg.Maven, Name: "dep:one", Revision: "1.0.0"}
   112  var depTwo = pkg.ID{Type: pkg.Maven, Name: "dep:two", Revision: "2.0.0"}
   113  var depThree = pkg.ID{Type: pkg.Maven, Name: "dep:three", Revision: "3.0.0"}
   114  var depFour = pkg.ID{Type: pkg.Maven, Name: "dep:four", Revision: "4.0.0"}
   115  var depFive = pkg.ID{Type: pkg.Maven, Name: "dep:five", Revision: "5.0.0"}
   116  
   117  func TestParseDependencyTree(t *testing.T) {
   118  	dat, err := ioutil.ReadFile("testdata/unix.out")
   119  	assert.NoError(t, err)
   120  	deps, err := maven.ParseDependencyTree(string(dat))
   121  	assert.NoError(t, err)
   122  
   123  	assert.Equal(t, 2, len(deps.Direct))
   124  	assert.Contains(t, deps.Direct, pkg.Import{Target: "", Resolved: depOne})
   125  	assert.Contains(t, deps.Direct, pkg.Import{Target: "", Resolved: depTwo})
   126  
   127  	assert.Equal(t, 5, len(deps.Transitive))
   128  	assert.Contains(t, deps.Transitive, depOne)
   129  	assert.Contains(t, deps.Transitive, depTwo)
   130  	assert.Contains(t, deps.Transitive[depTwo].Imports, pkg.Import{Target: "3.0.0", Resolved: depThree})
   131  	assert.Contains(t, deps.Transitive[depTwo].Imports, pkg.Import{Target: "5.0.0", Resolved: depFive})
   132  	assert.Contains(t, deps.Transitive, depThree)
   133  	assert.Contains(t, deps.Transitive[depThree].Imports, pkg.Import{Target: "4.0.0", Resolved: depFour})
   134  	assert.Contains(t, deps.Transitive, depFour)
   135  	assert.Contains(t, deps.Transitive, depFive)
   136  }