diff options
Diffstat (limited to 'sonar-css-plugin')
5 files changed, 66 insertions, 0 deletions
diff --git a/sonar-css-plugin/css-bundle/src/server.ts b/sonar-css-plugin/css-bundle/src/server.ts index 93bb6cb..e9c66c0 100644 --- a/sonar-css-plugin/css-bundle/src/server.ts +++ b/sonar-css-plugin/css-bundle/src/server.ts @@ -27,6 +27,13 @@ export function start(port = 0): Promise<Server> { resp.send("OK!") ); + app.post("/close", (_req: express.Request, resp: express.Response) => { + console.log("DEBUG stylelint-bridge server will shutdown"); + resp.end(() => { + server.close(); + }); + }); + // every time something is wrong we log error and send empty response (with 0 issues) // it's important to keep this call last in configuring "app" app.use( diff --git a/sonar-css-plugin/css-bundle/tests/server.test.ts b/sonar-css-plugin/css-bundle/tests/server.test.ts index 84fc617..8574129 100644 --- a/sonar-css-plugin/css-bundle/tests/server.test.ts +++ b/sonar-css-plugin/css-bundle/tests/server.test.ts @@ -167,3 +167,12 @@ describe("server", () => { return postToServer(data, endpoint, server); } }); + +describe("server close", () => { + it("should stop listening when closed", async () => { + const server = await start(); + expect(server.listening).toBeTruthy(); + await postToServer("", "/close", server); + expect(server.listening).toBeFalsy(); + }); +}); diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServer.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServer.java index b998f4f..424021a 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServer.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServer.java @@ -238,11 +238,24 @@ public class CssAnalyzerBridgeServer implements Startable { void clean() { if (nodeCommand != null) { + callClose(); nodeCommand.destroy(); nodeCommand = null; } } + private void callClose() { + okhttp3.Request request = new okhttp3.Request.Builder() + .url(url("close")) + .post(RequestBody.create(MediaType.get("application/json"), "")) + .build(); + try (Response response = client.newCall(request).execute()) { + // nothing to do here + } catch (IOException e) { + LOG.warn("Failed to close stylelint-bridge server", e); + } + } + private HttpUrl url(String endpoint) { HttpUrl.Builder builder = new HttpUrl.Builder(); return builder diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServerTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServerTest.java index d0a2c2f..a880b14 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServerTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/server/CssAnalyzerBridgeServerTest.java @@ -215,6 +215,15 @@ public class CssAnalyzerBridgeServerTest { } @Test + public void should_log_warning_when_failed_to_close() throws Exception { + cssAnalyzerBridgeServer = createCssAnalyzerBridgeServer("failedClose.js"); + cssAnalyzerBridgeServer.startServerLazily(context); + cssAnalyzerBridgeServer.stop(); + assertThat(logTester.logs(WARN)).contains("Failed to close stylelint-bridge server"); + } + + + @Test public void should_fail_if_bad_json_response() throws Exception { cssAnalyzerBridgeServer = createCssAnalyzerBridgeServer(START_SERVER_SCRIPT); cssAnalyzerBridgeServer.deploy(context.fileSystem().workDir()); diff --git a/sonar-css-plugin/src/test/resources/mock-start-server/failedClose.js b/sonar-css-plugin/src/test/resources/mock-start-server/failedClose.js new file mode 100644 index 0000000..3c0039e --- /dev/null +++ b/sonar-css-plugin/src/test/resources/mock-start-server/failedClose.js @@ -0,0 +1,28 @@ +#!/usr/bin/env node + +const http = require('http'); +const port = process.argv[2]; + +const requestHandler = (request, response) => { + let data = []; + request.on('data', chunk => { + data.push(chunk); + }); + if (request.url === '/status') { + response.writeHead(200, {'Content-Type': 'text/plain'}); + response.end('OK!'); + } else { + throw "Failure"; + } +}; + +const server = http.createServer(requestHandler); + +server.listen(port, (err) => { + if (err) { + return console.log('something bad happened', err) + } + + console.log(`server is listening on ${port}`) +}); + |
