11package com .ibm .cldk ;
22
3+ import com .google .gson .Gson ;
4+ import com .google .gson .JsonArray ;
5+ import com .google .gson .JsonElement ;
6+ import com .google .gson .JsonObject ;
7+ import org .json .JSONArray ;
38import org .junit .jupiter .api .BeforeAll ;
49import org .junit .jupiter .api .Test ;
510import org .junit .jupiter .api .Assertions ;
1621import java .nio .file .Paths ;
1722import java .time .Duration ;
1823import java .util .Properties ;
24+ import java .util .stream .StreamSupport ;
1925
2026
2127@ Testcontainers
@@ -27,7 +33,7 @@ public class CodeAnalyzerIntegrationTest {
2733 */
2834 static String codeanalyzerVersion ;
2935 static final String javaVersion = "17" ;
30-
36+ static String javaHomePath ;
3137 static {
3238 // Build project first
3339 try {
@@ -62,8 +68,29 @@ public class CodeAnalyzerIntegrationTest {
6268 .withCopyFileToContainer (MountableFile .forHostPath (Paths .get (System .getProperty ("user.dir" )).resolve ("src/test/resources/test-applications/mvnw-working-test" )), "/test-applications/mvnw-working-test" )
6369 .withCopyFileToContainer (MountableFile .forHostPath (Paths .get (System .getProperty ("user.dir" )).resolve ("src/test/resources/test-applications/daytrader8" )), "/test-applications/daytrader8" );
6470
71+ public CodeAnalyzerIntegrationTest () throws IOException , InterruptedException {
72+ }
73+
6574 @ BeforeAll
6675 static void setUp () {
76+ // Install Java 17 in the base container
77+ try {
78+ container .execInContainer ("apt-get" , "update" );
79+ container .execInContainer ("apt-get" , "install" , "-y" , "openjdk-17-jdk" );
80+
81+ // Get JAVA_HOME dynamically
82+ var javaHomeResult = container .execInContainer ("bash" , "-c" ,
83+ "dirname $(dirname $(readlink -f $(which java)))"
84+ );
85+ javaHomePath = javaHomeResult .getStdout ().trim ();
86+ Assertions .assertFalse (javaHomePath .isEmpty (), "Failed to determine JAVA_HOME" );
87+
88+ } catch (IOException | InterruptedException e ) {
89+ throw new RuntimeException (e );
90+ }
91+
92+
93+ // Get the version of the codeanalyzer jar
6794 Properties properties = new Properties ();
6895 try (FileInputStream fis = new FileInputStream (
6996 Paths .get (System .getProperty ("user.dir" ), "gradle.properties" ).toFile ())) {
@@ -92,11 +119,10 @@ void shouldHaveCodeAnalyzerJar() throws Exception {
92119 @ Test
93120 void shouldBeAbleToRunCodeAnalyzer () throws Exception {
94121 var runCodeAnalyzerJar = container .execInContainer (
95- "java" ,
96- "-jar" ,
97- String .format ("/opt/jars/codeanalyzer-%s.jar" , codeanalyzerVersion ),
98- "--help"
99- );
122+ "bash" , "-c" ,
123+ String .format ("export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --help" ,
124+ javaHomePath , codeanalyzerVersion
125+ ));
100126
101127 Assertions .assertEquals (0 , runCodeAnalyzerJar .getExitCode (),
102128 "Command should execute successfully" );
@@ -106,25 +132,29 @@ void shouldBeAbleToRunCodeAnalyzer() throws Exception {
106132
107133 @ Test
108134 void callGraphShouldHaveKnownEdges () throws Exception {
109- var listContentsOfTestApplicationDirectory = container .execInContainer ("ls" , "/test-applications/call-graph-test" );
110- Assertions .assertFalse (listContentsOfTestApplicationDirectory .getStdout ().isEmpty (), "Directory listing should not be empty" );
111- var runGradlew = container .execInContainer ("sh" , "-c" , "/test-applications/call-graph-test/gradlew" , "-v" );
112- Assertions .assertEquals (0 , runGradlew .getExitCode (), "Failed to run gradlew" );
113- var runCodeAnalyzerOnCallGraphTest = container .withWorkingDirectory ("/test-applications/call-graph-test" )
114- .execInContainer (
115- "java" ,
116- "-jar" ,
117- String .format ("/opt/jars/codeanalyzer-%s.jar" , codeanalyzerVersion ),
118- "--input=/test-applications/call-graph-test" ,
119- "--analysis-level=2" ,
120- "--verbose"
135+ var runCodeAnalyzerOnCallGraphTest = container .execInContainer (
136+ "bash" , "-c" ,
137+ String .format (
138+ "export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --input=/test-applications/call-graph-test --analysis-level=2" ,
139+ javaHomePath , codeanalyzerVersion
140+ )
121141 );
122142
123- String output = runCodeAnalyzerOnCallGraphTest .getStdout ();
124143
125- // Normalize the output to ignore formatting differences
126- String normalizedOutput = output .replaceAll ("\\ s+" , "" );
144+ // Read the output JSON
145+ Gson gson = new Gson ();
146+ JsonObject jsonObject = gson .fromJson (runCodeAnalyzerOnCallGraphTest .getStdout (), JsonObject .class );
147+ JsonArray systemDepGraph = jsonObject .getAsJsonArray ("system_dependency_graph" );
148+ Assertions .assertTrue (StreamSupport .stream (systemDepGraph .spliterator (), false )
149+ .map (JsonElement ::getAsJsonObject )
150+ .anyMatch (entry ->
151+ "CALL_DEP" .equals (entry .get ("type" ).getAsString ()) &&
152+ "1" .equals (entry .get ("weight" ).getAsString ()) &&
153+ entry .getAsJsonObject ("source" ).get ("signature" ).getAsString ().equals ("helloString()" ) &&
154+ entry .getAsJsonObject ("target" ).get ("signature" ).getAsString ().equals ("log()" )
155+ ), "Expected edge not found in the system dependency graph" );
127156 }
157+
128158 @ Test
129159 void corruptMavenShouldNotBuildWithWrapper () throws IOException , InterruptedException {
130160 // Make executable
@@ -152,46 +182,44 @@ void corruptMavenShouldProduceAnalysisArtifactsWhenMVNCommandIsInPath() throws I
152182
153183 @ Test
154184 void corruptMavenShouldNotTerminateWithErrorWhenMavenIsNotPresentUnlessAnalysisLevel2 () throws IOException , InterruptedException {
155- // When javaee level 2, we should get a Runtime Exception
185+ // When analysis level 2, we should get a Runtime Exception
156186 var runCodeAnalyzer = container .execInContainer (
157- "java" ,
158- "-jar" ,
159- String .format ("/opt/jars/codeanalyzer-%s.jar" , codeanalyzerVersion ),
160- "--input=/test-applications/mvnw-corrupt-test" ,
161- "--output=/tmp/" ,
162- "--analysis-level=2"
187+ "bash" , "-c" ,
188+ String .format (
189+ "export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --input=/test-applications/mvnw-corrupt-test --output=/tmp/ --analysis-level=2" ,
190+ javaHomePath , codeanalyzerVersion
191+ )
163192 );
193+
164194 Assertions .assertEquals (1 , runCodeAnalyzer .getExitCode ());
165195 Assertions .assertTrue (runCodeAnalyzer .getStderr ().contains ("java.lang.RuntimeException" ));
166196 }
167197
168198 @ Test
169199 void shouldBeAbleToGenerateAnalysisArtifactForDaytrader8 () throws Exception {
170200 var runCodeAnalyzerOnDaytrader8 = mavenContainer .execInContainer (
171- "java " ,
172- "-jar" ,
173- String . format ( " /opt/jars/codeanalyzer-%s.jar" , codeanalyzerVersion ) ,
174- "--input=/test-applications/daytrader8" ,
175- "--analysis-level=1"
201+ "bash" , "-c " ,
202+ String . format (
203+ "export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --input=/test-applications/daytrader8 --analysis-level=1" ,
204+ javaHomePath , codeanalyzerVersion
205+ )
176206 );
207+
177208 Assertions .assertTrue (runCodeAnalyzerOnDaytrader8 .getStdout ().contains ("\" is_entrypoint_class\" : true" ), "No entry point classes found" );
178209 Assertions .assertTrue (runCodeAnalyzerOnDaytrader8 .getStdout ().contains ("\" is_entrypoint\" : true" ), "No entry point methods found" );
179210 }
180211
181212 @ Test
182213 void shouldBeAbleToDetectCRUDOperationsAndQueriesForPlantByWebsphere () throws Exception {
183- container .execInContainer ("apt-get" , "update" );
184- var installFindUtils = container .execInContainer ("apt-get" , "install" , "-y" , "openjdk-17-jdk" , "findutils" );
185- var printJavaVersion = container .execInContainer ("java" , "-version" );
186- var printGradleVersion = container .execInContainer ("/test-applications/plantsbywebsphere/gradlew" , "-v" );
187214 var runCodeAnalyzerOnPlantsByWebsphere = container .execInContainer (
188- "java " ,
189- "-jar" ,
190- String . format ( " /opt/jars/codeanalyzer-%s.jar" , codeanalyzerVersion ) ,
191- "--input=/test-applications/plantsbywebsphere" ,
192- "--analysis-level=1" , "--verbose"
215+ "bash" , "-c " ,
216+ String . format (
217+ "export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --input=/test-applications/plantsbywebsphere --analysis-level=1 --verbose" ,
218+ javaHomePath , codeanalyzerVersion
219+ )
193220 );
194221
222+
195223 String output = runCodeAnalyzerOnPlantsByWebsphere .getStdout ();
196224
197225 Assertions .assertTrue (output .contains ("\" query_type\" : \" NAMED\" " ), "No entry point classes found" );
0 commit comments