diff options
| author | Tibor Blenessy | 2020-01-13 11:44:34 +0100 | 
|---|---|---|
| committer | GitHub | 2020-01-13 11:44:34 +0100 | 
| commit | 13d52b7dd495c68c72ad8ab3f5063307bf42cfad (patch) | |
| tree | 057fd574afec4bd7f32283088c9fa2d8b8c66360 /sonar-css-plugin | |
| parent | c0ba07e77931f187a788c7b1ab5420ead525e3d3 (diff) | |
| download | sonar-css-13d52b7dd495c68c72ad8ab3f5063307bf42cfad.tar.bz2 | |
Implement close endpoint to shutdown the Node.js process (#243)
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}`) +}); + | 
