Skip to content

Commit

Permalink
Adopt new api changes
Browse files Browse the repository at this point in the history
  • Loading branch information
jdneo committed Jul 3, 2024
1 parent 97e65fe commit b385096
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ public void onBuildTaskStart(TaskStartParams params) {
// ignore the suite start message as the display name.
displayName = null;
}
String testIdentifier = getTestIdentifier(testStartEx.getTestName());
List<String> testParts = getTestParts(testStartEx.getTestName());
lsClient.sendNotification(new ExecuteCommandParams("java.gradle.buildServer.onDidChangeTestItemStatus",
Arrays.asList(testIdentifier, 2/*Running status*/, displayName)));
Arrays.asList(testParts, 2/*Running status*/, displayName)));
} else {
Either<String, Integer> id = Either.forLeft(params.getTaskId().getId());
lsClient.createProgress(new WorkDoneProgressCreateParams(id));
Expand Down Expand Up @@ -187,7 +187,7 @@ public void onBuildTaskFinish(TaskFinishParams params) {
}
} else if (Objects.equals(params.getDataKind(), TaskDataKind.TEST_FINISH)) {
TestFinishEx testFinishEx = JSONUtility.toModel(params.getData(), TestFinishEx.class);
String testIdentifier = getTestIdentifier(testFinishEx.getTestName());
List<String> testParts = getTestParts(testFinishEx.getTestName());
JavaTestStatus testStatus = switch (testFinishEx.getStatus()) {
case PASSED -> JavaTestStatus.Passed;
case FAILED -> JavaTestStatus.Failed;
Expand All @@ -198,7 +198,7 @@ public void onBuildTaskFinish(TaskFinishParams params) {
throw new IllegalArgumentException("Unsupported test status: " + testFinishEx.getStatus());
}
lsClient.sendNotification(new ExecuteCommandParams("java.gradle.buildServer.onDidChangeTestItemStatus",
Arrays.asList(testIdentifier, testStatus.getValue(), null, testFinishEx.getStackTrace()))); // TODO: test duration is missing
Arrays.asList(testParts, testStatus.getValue(), null, testFinishEx.getStackTrace()))); // TODO: test duration is missing
} else if (Objects.equals(params.getDataKind(), TaskDataKind.TEST_REPORT)) {
lsClient.sendNotification(new ExecuteCommandParams("java.gradle.buildServer.onDidFinishTestRun",
Arrays.asList(params.getTaskId().getId(), params.getMessage())));
Expand All @@ -214,9 +214,9 @@ public void onBuildTaskFinish(TaskFinishParams params) {
/**
* Currently, the test name returned from gradle build server is started from the class name,
* then follows the method or invocation name.
* @return The test identifier
* @return The test identifier parts
*/
private String getTestIdentifier(TestName testName) {
private List<String> getTestParts(TestName testName) {
List<String> testNames = new LinkedList<>();
while (testName != null) {
if (testName.getSuiteName() != null) {
Expand All @@ -241,7 +241,7 @@ private String getTestIdentifier(TestName testName) {
}
}

return String.join("#", testNames.subList(i, testNames.size()));
return testNames.subList(i, testNames.size());
}

private class LruCache<T> extends LinkedHashSet<T> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;

import org.eclipse.core.resources.IProject;
Expand Down Expand Up @@ -33,7 +31,7 @@ public Object executeCommand(String commandId, List<Object> arguments, IProgress
switch (commandId) {
case "java.gradle.delegateTest":
String projectName = (String) arguments.get(0);
List<String> tests = (ArrayList<String>) arguments.get(1);
Map<String, List<String>> tests = JSONUtility.toModel(arguments.get(1), Map.class);
IProject project = ProjectUtils.getProject(projectName);
if (project == null) {
throw new IllegalArgumentException("Project not found: " + projectName);
Expand All @@ -56,9 +54,8 @@ public Object executeCommand(String commandId, List<Object> arguments, IProgress
TestParams testParams = new TestParams(btIds);
testParams.setDataKind("scala-test-suites-selection");
testParams.setArguments(getArguments(arguments));
Map<String, List<String>> groupedTests = groupTests(tests);
List<ScalaTestSuiteSelection> testSelections = new LinkedList<>();
for (Map.Entry<String, List<String>> entry : groupedTests.entrySet()) {
for (Map.Entry<String, List<String>> entry : tests.entrySet()) {
ScalaTestSuiteSelection testSelection = new ScalaTestSuiteSelection(
entry.getKey(),
entry.getValue()
Expand All @@ -79,26 +76,6 @@ public Object executeCommand(String commandId, List<Object> arguments, IProgress
throw new UnsupportedOperationException("The command: " + commandId + "is not supported.");
}

private Map<String, List<String>> groupTests(List<String> tests) {
Map<String, List<String>> groupedTests = new HashMap<>();

for (String test : tests) {
String[] parts = test.split("#");
String className = parts[0];
String methodName = parts.length > 1 ? parts[1] : null;

groupedTests.computeIfAbsent(className, k -> new ArrayList<>());
if (methodName != null) {
if (methodName.contains("(")) {
methodName = methodName.substring(0, methodName.indexOf('(')); // gradle test task doesn't support method with parameters
}
groupedTests.get(className).add(methodName);
}
}

return groupedTests;
}

private List<String> getArguments(List<Object> arguments) {
if (arguments.size() < 3) {
return Collections.emptyList();
Expand Down
15 changes: 10 additions & 5 deletions extension/src/Extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import {
import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper";
import { GradleBuildContentProvider } from "./client/GradleBuildContentProvider";
import { BuildServerController } from "./bs/BuildServerController";
import { GradleTestRunner } from "./bs/GradleTestRunner";

export class Extension {
private readonly client: GradleClient;
Expand Down Expand Up @@ -230,11 +231,15 @@ export class Extension {
const testExtension = vscode.extensions.getExtension("vscjava.vscode-java-test");
if (testExtension) {
testExtension.activate().then((api: any) => {
api.registerTestProfile(
"Delegate Test to Gradle",
vscode.TestRunProfileKind.Run,
this.buildServerController.getGradleTestRunner()
);
if (api) {
const testRunner: GradleTestRunner = this.buildServerController.getGradleTestRunner(api);
api.registerTestProfile(
"Delegate Test to Gradle",
vscode.TestRunProfileKind.Run,
testRunner,
);
}

});
}
const activated = !!(await this.rootProjectsStore.getProjectRoots()).length;
Expand Down
14 changes: 8 additions & 6 deletions extension/src/bs/BuildServerController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,9 @@ export class BuildServerController implements Disposable {
private disposable: Disposable;
private buildOutputChannel: OutputChannel;
private logOutputChannel: OutputChannel;
private gradleTestRunner: GradleTestRunner;
private gradleTestRunner: GradleTestRunner | undefined;

public constructor(readonly context: ExtensionContext) {
this.gradleTestRunner = new GradleTestRunner();
this.buildOutputChannel = window.createOutputChannel("Build Server for Gradle (Build)", "gradle-build");
this.logOutputChannel = window.createOutputChannel("Build Server for Gradle (Log)");
this.disposable = Disposable.from(
Expand Down Expand Up @@ -89,13 +88,13 @@ export class BuildServerController implements Disposable {
commands.registerCommand(
"java.gradle.buildServer.onDidFinishTestRun",
(status: number, message?: string) => {
this.gradleTestRunner.finishTestRun(status, message);
this.gradleTestRunner?.finishTestRun(status, message);
}
),
commands.registerCommand(
"java.gradle.buildServer.onDidChangeTestItemStatus",
(test: string, state: number, displayName?: string, message?: string, duration?: number) => {
this.gradleTestRunner.updateTestItem(test, state, displayName, message, duration);
(testParts: string[], state: number, displayName?: string, message?: string, duration?: number) => {
this.gradleTestRunner?.updateTestItem(testParts, state, displayName, message, duration);
}
),
workspace.onDidChangeConfiguration((e: ConfigurationChangeEvent) => {
Expand Down Expand Up @@ -125,7 +124,10 @@ export class BuildServerController implements Disposable {
this.checkMachineStatus();
}

public getGradleTestRunner(): GradleTestRunner {
public getGradleTestRunner(testRunnerApi: any): GradleTestRunner {
if (!this.gradleTestRunner) {
this.gradleTestRunner = new GradleTestRunner(testRunnerApi);
}
return this.gradleTestRunner;
}

Expand Down
42 changes: 32 additions & 10 deletions extension/src/bs/GradleTestRunner.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,37 @@
import * as vscode from "vscode";
import { TestRunner, TestItemStatusChangeEvent, TestFinishEvent, IRunTestContext } from "../java-test-runner.api";
import { TestRunner, TestItemStatusChangeEvent, TestFinishEvent, IRunTestContext, TestIdParts } from "../java-test-runner.api";

export class GradleTestRunner implements TestRunner {
private readonly _onDidChangeTestItemStatus = new vscode.EventEmitter<TestItemStatusChangeEvent>();
private readonly _onDidFinishTestRun = new vscode.EventEmitter<TestFinishEvent>();
private context: IRunTestContext;
private testRunnerApi: any;

public onDidChangeTestItemStatus: vscode.Event<TestItemStatusChangeEvent> = this._onDidChangeTestItemStatus.event;
public onDidFinishTestRun: vscode.Event<TestFinishEvent> = this._onDidFinishTestRun.event;

constructor(testRunnerApi: any) {
this.testRunnerApi = testRunnerApi;
}

public launch(context: IRunTestContext): void {
const tests: string[] = context.testItems.map((testItem) => {
this.context = context;
const tests: Map<string, string[]> = new Map();
context.testItems.forEach((testItem) => {
const id = testItem.id;
if (id.includes("@")) {
return id.slice(id.indexOf("@") + 1);
const parts: TestIdParts = this.testRunnerApi.parsePartsFromTestId(id);
if (!parts.class) {
return;
}
return id;
const testMethods = tests.get(parts.class) || [];
if (parts.invocations?.length) {
let methodId = parts.invocations[0];
if (methodId.includes("(")) {
methodId = methodId.slice(0, methodId.indexOf("(")); // gradle test task doesn't support method with parameters
}
testMethods.push(methodId);
}
tests.set(parts.class, testMethods);
});

const agrs = context.testConfig?.args;
Expand All @@ -24,15 +41,15 @@ export class GradleTestRunner implements TestRunner {
"java.execute.workspaceCommand",
"java.gradle.delegateTest",
context.projectName,
tests,
JSON.stringify([...tests]),
agrs,
vmArgs,
env
);
}

public updateTestItem(
test: string,
testParts: string[],
state: number,
displayName?: string,
message?: string,
Expand All @@ -41,18 +58,23 @@ export class GradleTestRunner implements TestRunner {
if (message) {
message = this.filterStackTrace(message);
}
const testId = this.testRunnerApi.parseTestIdFromParts({
project: this.context.projectName,
class: testParts[0],
invocations: testParts.slice(1),
});
this._onDidChangeTestItemStatus.fire({
test,
testId,
state,
displayName,
message,
duration,
});
}

public finishTestRun(status: number, message?: string): void {
public finishTestRun(statusCode: number, message?: string): void {
this._onDidFinishTestRun.fire({
status,
statusCode,
message,
});
}
Expand Down
Loading

0 comments on commit b385096

Please sign in to comment.