Skip to content

Commit df259c6

Browse files
committed
Add test cases to verfiy call graph edges and test application as well.
Signed-off-by: Rahul Krishna <i.m.ralk@gmail.com>
1 parent c2d1fc3 commit df259c6

File tree

1 file changed

+70
-42
lines changed

1 file changed

+70
-42
lines changed

src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java

Lines changed: 70 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package 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;
38
import org.junit.jupiter.api.BeforeAll;
49
import org.junit.jupiter.api.Test;
510
import org.junit.jupiter.api.Assertions;
@@ -16,6 +21,7 @@
1621
import java.nio.file.Paths;
1722
import java.time.Duration;
1823
import 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

Comments
 (0)