1
1
package com .ibm .cldk ;
2
2
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 ;
3
8
import org .junit .jupiter .api .BeforeAll ;
4
9
import org .junit .jupiter .api .Test ;
5
10
import org .junit .jupiter .api .Assertions ;
16
21
import java .nio .file .Paths ;
17
22
import java .time .Duration ;
18
23
import java .util .Properties ;
24
+ import java .util .stream .StreamSupport ;
19
25
20
26
21
27
@ Testcontainers
@@ -27,7 +33,7 @@ public class CodeAnalyzerIntegrationTest {
27
33
*/
28
34
static String codeanalyzerVersion ;
29
35
static final String javaVersion = "17" ;
30
-
36
+ static String javaHomePath ;
31
37
static {
32
38
// Build project first
33
39
try {
@@ -62,8 +68,29 @@ public class CodeAnalyzerIntegrationTest {
62
68
.withCopyFileToContainer (MountableFile .forHostPath (Paths .get (System .getProperty ("user.dir" )).resolve ("src/test/resources/test-applications/mvnw-working-test" )), "/test-applications/mvnw-working-test" )
63
69
.withCopyFileToContainer (MountableFile .forHostPath (Paths .get (System .getProperty ("user.dir" )).resolve ("src/test/resources/test-applications/daytrader8" )), "/test-applications/daytrader8" );
64
70
71
+ public CodeAnalyzerIntegrationTest () throws IOException , InterruptedException {
72
+ }
73
+
65
74
@ BeforeAll
66
75
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
67
94
Properties properties = new Properties ();
68
95
try (FileInputStream fis = new FileInputStream (
69
96
Paths .get (System .getProperty ("user.dir" ), "gradle.properties" ).toFile ())) {
@@ -92,11 +119,10 @@ void shouldHaveCodeAnalyzerJar() throws Exception {
92
119
@ Test
93
120
void shouldBeAbleToRunCodeAnalyzer () throws Exception {
94
121
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
+ ));
100
126
101
127
Assertions .assertEquals (0 , runCodeAnalyzerJar .getExitCode (),
102
128
"Command should execute successfully" );
@@ -106,25 +132,29 @@ void shouldBeAbleToRunCodeAnalyzer() throws Exception {
106
132
107
133
@ Test
108
134
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
+ )
121
141
);
122
142
123
- String output = runCodeAnalyzerOnCallGraphTest .getStdout ();
124
143
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" );
127
156
}
157
+
128
158
@ Test
129
159
void corruptMavenShouldNotBuildWithWrapper () throws IOException , InterruptedException {
130
160
// Make executable
@@ -152,46 +182,44 @@ void corruptMavenShouldProduceAnalysisArtifactsWhenMVNCommandIsInPath() throws I
152
182
153
183
@ Test
154
184
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
156
186
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
+ )
163
192
);
193
+
164
194
Assertions .assertEquals (1 , runCodeAnalyzer .getExitCode ());
165
195
Assertions .assertTrue (runCodeAnalyzer .getStderr ().contains ("java.lang.RuntimeException" ));
166
196
}
167
197
168
198
@ Test
169
199
void shouldBeAbleToGenerateAnalysisArtifactForDaytrader8 () throws Exception {
170
200
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
+ )
176
206
);
207
+
177
208
Assertions .assertTrue (runCodeAnalyzerOnDaytrader8 .getStdout ().contains ("\" is_entrypoint_class\" : true" ), "No entry point classes found" );
178
209
Assertions .assertTrue (runCodeAnalyzerOnDaytrader8 .getStdout ().contains ("\" is_entrypoint\" : true" ), "No entry point methods found" );
179
210
}
180
211
181
212
@ Test
182
213
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" );
187
214
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
+ )
193
220
);
194
221
222
+
195
223
String output = runCodeAnalyzerOnPlantsByWebsphere .getStdout ();
196
224
197
225
Assertions .assertTrue (output .contains ("\" query_type\" : \" NAMED\" " ), "No entry point classes found" );
0 commit comments