diff --git a/.circleci/config.yml b/.circleci/config.yml index e1d8e99..500bf72 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -29,6 +29,11 @@ commands: root: . paths: - node_modules/ + install_maven: + description: Install maven + steps: + - run: apt-get update + - run: apt-get install -y maven checkout_and_merge: steps: - checkout @@ -49,6 +54,7 @@ jobs: <<: *defaults steps: - install_deps + - install_maven lint: <<: *defaults steps: diff --git a/lib/call-graph.ts b/lib/call-graph.ts index 9078466..610502a 100644 --- a/lib/call-graph.ts +++ b/lib/call-graph.ts @@ -1,10 +1,11 @@ import { Graph } from 'graphlib'; import { removeParams, toFQclassName } from './class-parsing'; +import { CallGraphNode } from './types'; function getNodeLabel( functionCall: string, classPerJarMapping: { [index: string]: string }, -): {} { +): CallGraphNode { // com.ibm.wala.FakeRootClass:fakeRootMethod const [className, functionName] = functionCall.split(':'); const jarName = classPerJarMapping[className]; diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 0000000..655b957 --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,5 @@ +export interface CallGraphNode { + className: string; + functionName: string; + jarName: string; +} diff --git a/package.json b/package.json index 3e56cc0..81dc760 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,9 @@ "format": "prettier --write '{lib,test}/**/*.{js,ts,json,yml}'", "lint": "npm run format:check && npm run lint:eslint", "lint:eslint": "eslint --color --cache 'lib/**/*.{js,ts}'", - "test": "npm run lint && npm run test:unit", - "test:unit": "jest", + "test": "npm run lint && npm run test:unit && npm run test:system", + "test:unit": "jest unit", + "test:system": "jest system", "test:coverage": "npm run test:unit -- --coverage", "test:watch": "tsc-watch --onSuccess 'npm run test:unit'", "build": "tsc", diff --git a/test/fixtures/java-project-integration-test/pom.xml b/test/fixtures/java-project-integration-test/pom.xml new file mode 100644 index 0000000..f48f1c5 --- /dev/null +++ b/test/fixtures/java-project-integration-test/pom.xml @@ -0,0 +1,142 @@ + + + 4.0.0 + cy.alavrov + JMinerGuide + 0.2.0-DEVELOPMENT + jar + + UTF-8 + 1.7 + 1.7 + + JMinerGuide + + JMinerGuide + + + org.apache.maven.plugins + maven-clean-plugin + 2.4.1 + + + + dist + false + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + lib/ + false + cy.alavrov.jminerguide.App + true + true + + + + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/../dist/lib/ + + + + + + maven-resources-plugin + 2.5 + + + copy-exec + install + + copy-resources + + + ${project.build.directory}/../dist/ + + + ${project.build.directory} + + ${project.build.finalName}.${project.packaging} + + + + + + + + + + + src/main/resources + true + + *.properties + + + + src/main/resources + false + + *.properties + + + + + + + net.java.dev.jna + jna + 4.1.0 + + + net.java.dev.jna + jna-platform + 4.1.0 + + + org.jdesktop + beansbinding + 1.2.1 + + + org.jdom + jdom2 + 2.0.5 + + + org.apache.httpcomponents + httpclient + 4.3.1 + + + commons-io + commons-io + 2.4 + + + joda-time + joda-time + 2.6 + + + \ No newline at end of file diff --git a/test/fixtures/java-project-integration-test/target/classes/app.properties b/test/fixtures/java-project-integration-test/target/classes/app.properties new file mode 100644 index 0000000..7ac4d1f --- /dev/null +++ b/test/fixtures/java-project-integration-test/target/classes/app.properties @@ -0,0 +1 @@ +application.version=0.2.0-DEVELOPMENT \ No newline at end of file diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/App$1.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/App$1.class new file mode 100644 index 0000000..829cd93 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/App$1.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/App.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/App.class new file mode 100644 index 0000000..3fda2be Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/App.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats$1.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats$1.class new file mode 100644 index 0000000..defeac1 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats$1.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats$2.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats$2.class new file mode 100644 index 0000000..ee2e5dc Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats$2.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats.class new file mode 100644 index 0000000..4570109 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/CalculatedStats.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/DataContainer.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/DataContainer.class new file mode 100644 index 0000000..a9d866e Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/DataContainer.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ICalculatedStats.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ICalculatedStats.class new file mode 100644 index 0000000..a57d05f Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ICalculatedStats.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/SimpleCalculatedStats.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/SimpleCalculatedStats.class new file mode 100644 index 0000000..7287498 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/SimpleCalculatedStats.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice$CompressionType.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice$CompressionType.class new file mode 100644 index 0000000..5209c81 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice$CompressionType.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice$ItemType.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice$ItemType.class new file mode 100644 index 0000000..f77ab4d Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice$ItemType.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice.class new file mode 100644 index 0000000..4af4cbb Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPrice.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPriceContainer$ItemPriceTableModel.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPriceContainer$ItemPriceTableModel.class new file mode 100644 index 0000000..20ff8ed Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPriceContainer$ItemPriceTableModel.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPriceContainer.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPriceContainer.class new file mode 100644 index 0000000..10485b8 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/price/ItemPriceContainer.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/HarvestUpgrade.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/HarvestUpgrade.class new file mode 100644 index 0000000..05e98f5 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/HarvestUpgrade.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$1.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$1.class new file mode 100644 index 0000000..f7baac0 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$1.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$10.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$10.class new file mode 100644 index 0000000..651f354 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$10.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$2.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$2.class new file mode 100644 index 0000000..ad55e5a Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$2.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$3.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$3.class new file mode 100644 index 0000000..2605454 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$3.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$4.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$4.class new file mode 100644 index 0000000..9a3266c Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$4.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$5.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$5.class new file mode 100644 index 0000000..42252dd Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$5.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$6.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$6.class new file mode 100644 index 0000000..0bd45a4 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$6.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$7.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$7.class new file mode 100644 index 0000000..f46fd28 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$7.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$8.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$8.class new file mode 100644 index 0000000..3e53615 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$8.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$9.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$9.class new file mode 100644 index 0000000..83edcad Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$9.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$BonusCalculationResult.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$BonusCalculationResult.class new file mode 100644 index 0000000..4bebdce Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$BonusCalculationResult.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$BonusCalculator.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$BonusCalculator.class new file mode 100644 index 0000000..220aa28 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull$BonusCalculator.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull.class new file mode 100644 index 0000000..9d3370d Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Hull.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/MiningCrystalLevel.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/MiningCrystalLevel.class new file mode 100644 index 0000000..34bfef9 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/MiningCrystalLevel.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/MiningDrone.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/MiningDrone.class new file mode 100644 index 0000000..f2413fe Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/MiningDrone.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Rig.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Rig.class new file mode 100644 index 0000000..ded6b7f Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Rig.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Ship.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Ship.class new file mode 100644 index 0000000..3d4f086 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Ship.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/ShipContainer.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/ShipContainer.class new file mode 100644 index 0000000..b215fae Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/ShipContainer.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Turret.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Turret.class new file mode 100644 index 0000000..5ec3a4a Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/Turret.class differ diff --git a/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/TurretType.class b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/TurretType.class new file mode 100644 index 0000000..70d9bb2 Binary files /dev/null and b/test/fixtures/java-project-integration-test/target/classes/cy/alavrov/jminerguide/data/ship/TurretType.class differ diff --git a/test/system/maven-call-graph.test.ts b/test/system/maven-call-graph.test.ts new file mode 100644 index 0000000..3af8016 --- /dev/null +++ b/test/system/maven-call-graph.test.ts @@ -0,0 +1,33 @@ +import { getCallGraphMvn } from '../../lib'; +import * as path from 'path'; +import { CallGraphNode } from '../../lib/types'; + +jest.setTimeout(60000); + +test('simple call graph', async () => { + const callGraph = await getCallGraphMvn( + path.join(__dirname, '../fixtures/java-project-integration-test'), + ); + + expect(callGraph.edgeCount()).toBeGreaterThan(0); + expect(callGraph.nodeCount()).toBeGreaterThan(0); + expect( + callGraph.hasNode('cy.alavrov.jminerguide.data.ship.Ship:getMaxDrones'), + ).toBeTruthy; + + const userLandNode = callGraph.node( + 'cy.alavrov.jminerguide.data.ship.Ship:getMaxDrones', + ) as CallGraphNode; + expect(userLandNode.className).toEqual( + 'cy.alavrov.jminerguide.data.ship.Ship', + ); + expect(userLandNode.functionName).toEqual('getMaxDrones'); + expect(userLandNode.jarName).toBeUndefined(); // user land code doesn't have a jar + + const thirdPartyNode = callGraph.node( + 'java.util.zip.Inflater:finalize', + ) as CallGraphNode; + expect(thirdPartyNode.className).toEqual('java.util.zip.Inflater'); + expect(thirdPartyNode.functionName).toEqual('finalize'); + expect(thirdPartyNode.jarName).toBeUndefined(); // TODO seems like a bug +}); diff --git a/test/lib/call-graph.test.ts b/test/unit/call-graph.test.ts similarity index 100% rename from test/lib/call-graph.test.ts rename to test/unit/call-graph.test.ts diff --git a/test/lib/fetch-snyk-java-call-graph-generator.test.ts b/test/unit/fetch-snyk-java-call-graph-generator.test.ts similarity index 100% rename from test/lib/fetch-snyk-java-call-graph-generator.test.ts rename to test/unit/fetch-snyk-java-call-graph-generator.test.ts diff --git a/test/lib/gradle-wrapper.test.ts b/test/unit/gradle-wrapper.test.ts similarity index 100% rename from test/lib/gradle-wrapper.test.ts rename to test/unit/gradle-wrapper.test.ts diff --git a/test/lib/java-wrapper.test.ts b/test/unit/java-wrapper.test.ts similarity index 100% rename from test/lib/java-wrapper.test.ts rename to test/unit/java-wrapper.test.ts diff --git a/test/lib/mvn-wrapper.test.ts b/test/unit/mvn-wrapper.test.ts similarity index 100% rename from test/lib/mvn-wrapper.test.ts rename to test/unit/mvn-wrapper.test.ts