github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/buildtools/sbt/sbt_test.go (about) 1 package sbt_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/sbt" 11 "github.com/fossas/fossa-cli/files" 12 "github.com/fossas/fossa-cli/pkg" 13 ) 14 15 /* 16 ├─┬ dep:one:1.0.0 17 | └─┬ dep:three:3.0.0 18 | └── dep:four:4.0.0 19 └─┬ dep:two:2.0.0 20 ├─┬ dep:three:3.0.0 21 │ └── dep:four:4.0.0 22 └── dep:five:5.0.0 23 */ 24 25 func TestParseDependencyTree(t *testing.T) { 26 var graph sbt.GraphML 27 err := files.ReadXML(&graph, filepath.Join("testdata", "sbt_test_graph.xml")) 28 assert.NoError(t, err) 29 30 evicted, err := ioutil.ReadFile(filepath.Join("testdata", "sbt_test_evicted")) 31 assert.NoError(t, err) 32 33 imports, transitive, err := sbt.ParseDependencyGraph(graph.Graph, string(evicted)) 34 assert.NoError(t, err) 35 36 assert.Equal(t, 2, len(imports)) 37 assertImport(t, imports, "dep:one", "1.0.0") 38 assertImport(t, imports, "dep:two", "2.0.0") 39 40 assert.Equal(t, 5, len(transitive)) 41 42 packageOne := findPackage(transitive, "dep:one", "1.0.0") 43 assert.NotEmpty(t, packageOne) 44 assert.Equal(t, 1, len(packageOne.Imports)) 45 assertImport(t, packageOne.Imports, "dep:three", "3.0.0") 46 47 packageTwo := findPackage(transitive, "dep:two", "2.0.0") 48 assert.NotEmpty(t, packageTwo) 49 assert.Equal(t, 2, len(packageTwo.Imports)) 50 assertImport(t, packageTwo.Imports, "dep:three", "3.0.0") 51 assertImport(t, packageTwo.Imports, "dep:five", "5.0.0") 52 53 packageThree := findPackage(transitive, "dep:three", "3.0.0") 54 assert.NotEmpty(t, packageThree) 55 assert.Equal(t, 1, len(packageThree.Imports)) 56 assertImport(t, packageThree.Imports, "dep:four", "4.0.0") 57 58 packageFour := findPackage(transitive, "dep:four", "4.0.0") 59 assert.NotEmpty(t, packageFour) 60 assert.Equal(t, 0, len(packageFour.Imports)) 61 62 packageFive := findPackage(transitive, "dep:five", "5.0.0") 63 assert.NotEmpty(t, packageFive) 64 assert.Equal(t, 0, len(packageFive.Imports)) 65 } 66 67 func TestSanityCheckParseDependencyTree(t *testing.T) { 68 var graph sbt.GraphML 69 err := files.ReadXML(&graph, filepath.Join("testdata", "sbt_dependencygraphml-prisma.xml")) 70 assert.NoError(t, err) 71 72 evicted, err := ioutil.ReadFile(filepath.Join("testdata", "sbt_evicted_nocolor-prisma")) 73 assert.NoError(t, err) 74 75 _, pkgs, err := sbt.ParseDependencyGraph(graph.Graph, string(evicted)) 76 assert.NoError(t, err) 77 78 for id, pkg := range pkgs { 79 assert.Equal(t, id, pkg.ID) 80 } 81 } 82 83 func TestFilterLines(t *testing.T) { 84 // This is a sampling of example disallowed lines from `sbt_dependencytree-prisma-stdout_and_stderr` 85 disallowed := []string{ 86 `Getting org.scala-sbt sbt 1.0.4 (this may take some time)...`, 87 `downloading https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.0.4/sbt-1.0.4.jar ...`, 88 ` [SUCCESSFUL ] org.scala-sbt#sbt;1.0.4!sbt.jar (111ms)`, 89 `:: retrieving :: org.scala-sbt#boot-app`, 90 ` confs: [default]`, 91 ` 69 artifacts copied, 0 already retrieved (22031kB/75ms)`, 92 `[info] Loading settings from plugins.sbt ...`, 93 `[info] Loading global plugins from /home/fossa/.sbt/1.0/plugins`, 94 `[info] Updating {file:/home/fossa/.sbt/1.0/plugins/}global-plugins...`, 95 `[info] Done updating.`, 96 `[info] Loading settings from plugins.sbt ...`, 97 `[info] Loading project definition from /home/fossa/prisma/server/project`, 98 `[info] Updating {file:/home/fossa/prisma/server/project/}server-build...`, 99 `[info] downloading https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar ...`, 100 `[info] [SUCCESSFUL ] commons-logging#commons-logging;1.2!commons-logging.jar (103ms)`, 101 `[info] Done updating.`, 102 `[warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:`, 103 `[warn] Run 'evicted' to see detailed eviction warnings`, 104 `[info] Compiling 2 Scala sources to /home/fossa/prisma/server/project/target/scala-2.12/sbt-1.0/classes ...`, 105 `[info] Non-compiled module 'compiler-bridge_2.12' for Scala 2.12.4. Compiling...`, 106 `[info] Compilation completed in 9.09s.`, 107 `[info] Done compiling.`, 108 `[info] Loading settings from build.sbt ...`, 109 `[info] Loading settings from build.sbt,version.sbt ...`, 110 `[info] Resolving key references (27245 settings) ...`, 111 `[info] Set current project to server (in build file:/home/fossa/prisma/server/)`, 112 `[info] Updating gc-values`, 113 `https://repo1.maven.org/maven2/org/scalatest/scalatest_2.12/3.0.4/scalatest_2.12-3.0.4.pom`, 114 ` 100.0% [##########] 5.2 KiB (29.7 KiB / s)`, 115 `[info] Resolved gc-values dependencies`, 116 `[info] Updating gc-values`, 117 `[info] Resolved gc-values dependencies`, 118 `[info] Updating authorg/maven2/com/pauldijou/jwt-core_2.12/0.14.1/jwt-core_2.12-0.14.1.pom`, 119 `https://repo1.maven.org/maven2/com/pauldijou/jwt-core_2.12/0.14.1/jwt-core_2.12-0.14.1.pom`, 120 ` 100.0% [##########] 2.3 KiB (90.6 KiB / s)`, 121 `[info] Fetched artifacts of gc-values`, 122 `[info] Updating prisma-config`, 123 `https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.19/snakeyaml-1.19.pom`, 124 ` 100.0% [##########] 34.4 KiB (649.6 KiB / s)`, 125 `[info] Resolved prisma-config dependencies`, 126 `[info] Updating {file:/home/fossa/prisma/server/}shared-models...`, 127 ` https://repo1.maven.org/maven2/com/rabbitmq/amqp-client/4.1.0/amqp-client-4.1.0.jar`, 128 `[info] Fetching artifacts of api-connector-postgresql`, 129 } 130 131 for _, line := range disallowed { 132 actual := sbt.FilterLine(line) 133 assert.False(t, actual, line) 134 } 135 136 allowed := []string{ 137 "[info] * prisma", 138 } 139 140 for _, line := range allowed { 141 actual := sbt.FilterLine(line) 142 assert.True(t, actual, line) 143 } 144 } 145 func findPackage(packages map[pkg.ID]pkg.Package, name, revision string) pkg.Package { 146 for id := range packages { 147 if id.Name == name && id.Revision == revision { 148 return packages[id] 149 } 150 } 151 return pkg.Package{} 152 } 153 154 func assertImport(t *testing.T, imports pkg.Imports, name, revision string) { 155 for _, importedProj := range imports { 156 if importedProj.Resolved.Name == name { 157 if importedProj.Resolved.Revision == revision { 158 return 159 } 160 assert.Fail(t, "found "+name+"@"+importedProj.Resolved.Revision+" instead of "+revision) 161 } 162 } 163 assert.Fail(t, "missing "+name+"@"+revision) 164 }