Skip to content

Commit ff7e294

Browse files
authored
Fix :docs-client devloop issues and update deps (#6155)
Motivation: - `npm run develop` on `:docs-client` fails with the following error: ``` [webpack-cli] Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options has an unknown property '_assetEmittingPreviousFiles'. ... ``` - `*DocServiceTest` times out after 60 seconds even when the demo mode is enabled. - Gradle doesn't run `*DocServiceTest` if they succeeded with the demo mode disabled, even if a dev reruns the test with the demo mode enabled. Modifications: - Updated the dependencies to fix the error returned by `npm run develop`. - Added a new JUnit extension `DocServiceExtension`, which disables the test timeout when the demo mode is enabled. - Enabled the extension for all `*DocServiceTest` classes. - Added the environment variable `DOC_SERVICE_DEMO` as the input of all test tasks. Result: - Better devloop for `:docs-client` - `npm run develop` works again. - No need to run `*DocServiceTest` in debug mode to disable the timeout - Gradle treats the tests as out-of-date if the `DOC_SERVICE_DEMO` environment variable changes. - Dependabot is happier because of less vulnerable dependency.
1 parent bb3f141 commit ff7e294

File tree

10 files changed

+414
-318
lines changed

10 files changed

+414
-318
lines changed

build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ allprojects {
112112
maxParallelForks = gradle.startParameter.maxWorkerCount
113113
}
114114

115+
// Allow re-running the tests if the DOC_SERVICE_DEMO property changes.
116+
inputs.property('DOC_SERVICE_DEMO', 'true'.equals(project.findProperty('DOC_SERVICE_DEMO')))
117+
115118
// Fail the build at the end if there was any leak.
116119
// We do not fail immediately so that we collect as many leaks as possible.
117120
doFirst {

core/src/test/java/com/linecorp/armeria/internal/server/annotation/AnnotatedDocServiceTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.stream.Stream;
4242

4343
import org.junit.jupiter.api.Test;
44+
import org.junit.jupiter.api.extension.ExtendWith;
4445
import org.junit.jupiter.api.extension.RegisterExtension;
4546
import org.junit.jupiter.params.ParameterizedTest;
4647
import org.junit.jupiter.params.provider.CsvSource;
@@ -67,6 +68,7 @@
6768
import com.linecorp.armeria.common.MediaTypeNames;
6869
import com.linecorp.armeria.common.util.UnmodifiableFuture;
6970
import com.linecorp.armeria.internal.server.annotation.AnnotatedDocServicePluginTest.CompositeBean;
71+
import com.linecorp.armeria.internal.testing.DocServiceExtension;
7072
import com.linecorp.armeria.internal.testing.TestUtil;
7173
import com.linecorp.armeria.server.HttpService;
7274
import com.linecorp.armeria.server.Route;
@@ -103,6 +105,7 @@
103105
import com.linecorp.armeria.server.docs.TypeSignature;
104106
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
105107

108+
@ExtendWith(DocServiceExtension.class)
106109
class AnnotatedDocServiceTest {
107110

108111
private static final ObjectMapper mapper = new ObjectMapper();

docs-client/package-lock.json

+306-288
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs-client/package.json

+26-26
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,31 @@
1313
"@material-ui/core": "^4.12.4",
1414
"@material-ui/icons": "^4.11.3",
1515
"@material-ui/lab": "^4.11.3-deprecations.1",
16-
"@monaco-editor/react": "^4.6.0",
17-
"core-js": "^3.39.0",
16+
"@monaco-editor/react": "^4.7.0",
17+
"core-js": "^3.41.0",
1818
"dayjs": "^1.11.13",
1919
"github-markdown-css": "^5.8.1",
2020
"graphql": "^16.10.0",
2121
"json-bigint": "^1.0.0",
2222
"jsonminify": "^0.4.2",
2323
"mermaid": "^11.4.1",
24-
"monaco-editor": "^0.51.0",
24+
"monaco-editor": "^0.52.2",
2525
"monaco-editor-webpack-plugin": "^7.1.0",
2626
"monaco-graphql": "^1.6.0",
2727
"react": "^17.0.2",
2828
"react-dom": "^17.0.2",
2929
"react-helmet": "^6.1.0",
3030
"react-hot-loader": "^4.13.1",
31-
"react-markdown": "^8.0.3",
32-
"react-router": "^5.3.1",
33-
"react-router-dom": "^5.3.1",
34-
"react-syntax-highlighter": "^15.5.0",
31+
"react-markdown": "^8.0.7",
32+
"react-router": "^5.3.4",
33+
"react-router-dom": "^5.3.4",
34+
"react-syntax-highlighter": "^15.6.1",
3535
"regenerator-runtime": "^0.14.1",
3636
"remark-gfm": "^3.0.1"
3737
},
3838
"devDependencies": {
39-
"@babel/core": "^7.26.0",
40-
"@babel/preset-env": "^7.26.0",
39+
"@babel/core": "^7.26.9",
40+
"@babel/preset-env": "^7.26.9",
4141
"@babel/preset-react": "^7.26.3",
4242
"@types/favicons-webpack-plugin": "^2.1.2",
4343
"@types/html-webpack-plugin": "^3.2.9",
@@ -46,44 +46,44 @@
4646
"@types/loadable__component": "^5.13.9",
4747
"@types/material-ui": "^0.21.18",
4848
"@types/mermaid": "^9.2.0",
49-
"@types/node": "^17.0.24",
50-
"@types/react": "^17.0.42",
51-
"@types/react-dom": "^17.0.14",
49+
"@types/node": "^17.0.45",
50+
"@types/react": "^17.0.83",
51+
"@types/react-dom": "^17.0.26",
5252
"@types/react-helmet": "^6.1.11",
5353
"@types/react-router-dom": "^5.3.3",
5454
"@types/react-syntax-highlighter": "^15.5.13",
5555
"@types/webpack": "^5.28.5",
56-
"@typescript-eslint/eslint-plugin": "^5.19.0",
57-
"@typescript-eslint/parser": "^5.19.0",
56+
"@typescript-eslint/eslint-plugin": "^5.62.0",
57+
"@typescript-eslint/parser": "^5.62.0",
5858
"babel-loader": "^9.2.1",
5959
"compression-webpack-plugin": "^11.1.0",
6060
"cross-env": "^7.0.3",
6161
"css-loader": "^7.1.2",
62-
"eslint": "^8.13.0",
62+
"eslint": "^8.57.1",
6363
"eslint-config-airbnb": "^19.0.4",
6464
"eslint-config-airbnb-typescript": "^16.2.0",
65-
"eslint-config-prettier": "^8.5.0",
65+
"eslint-config-prettier": "^8.10.0",
6666
"eslint-plugin-eslint-comments": "^3.2.0",
67-
"eslint-plugin-import": "^2.26.0",
67+
"eslint-plugin-import": "^2.31.0",
6868
"eslint-plugin-json": "^3.1.0",
69-
"eslint-plugin-jsx-a11y": "^6.5.1",
70-
"eslint-plugin-prettier": "^4.0.0",
71-
"eslint-plugin-react": "^7.29.4",
72-
"eslint-plugin-react-hooks": "^4.4.0",
69+
"eslint-plugin-jsx-a11y": "^6.10.2",
70+
"eslint-plugin-prettier": "^4.2.1",
71+
"eslint-plugin-react": "^7.37.4",
72+
"eslint-plugin-react-hooks": "^4.6.2",
7373
"favicons-webpack-plugin": "^6.0.1",
7474
"file-loader": "^6.2.0",
7575
"html-webpack-plugin": "^5.6.3",
7676
"license-webpack-plugin": "^4.0.2",
77-
"prettier": "^2.6.2",
77+
"prettier": "^2.8.8",
7878
"sharp": "^0.33.5",
7979
"style-loader": "^4.0.0",
80-
"ts-loader": "^9.5.1",
80+
"ts-loader": "^9.5.2",
8181
"ts-node": "^10.9.2",
8282
"tsconfig-paths": "^4.2.0",
83-
"typescript": "^5.7.2",
84-
"webpack": "^5.97.1",
83+
"typescript": "^5.8.2",
84+
"webpack": "^5.98.0",
8585
"webpack-bundle-analyzer": "^4.10.2",
86-
"webpack-cli": "^4.9.2",
86+
"webpack-cli": "^5.1.4",
8787
"webpack-dev-server": "^5.2.0"
8888
}
8989
}

docs-client/webpack.config.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,10 @@ const config: Configuration = {
8282
],
8383
},
8484
resolve: {
85-
// Workaround for monaco-editor issue: https://github.com/graphql/graphiql/issues/3639#issuecomment-2263636575
85+
// Workaround for monaco-editor issue:
86+
// https://github.com/graphql/graphiql/issues/3639#issuecomment-2413834355
8687
alias: {
87-
'monaco-editor/esm/vs/editor/contrib/hover/browser/hover': 'monaco-editor/esm/vs/editor/contrib/hover/browser/hoverController',
88+
'monaco-editor/esm/vs/editor/contrib/hover/browser/hover': 'monaco-editor/esm/vs/editor/contrib/hover/browser/contentHoverController2',
8889
},
8990
modules: ['src', 'node_modules'],
9091
extensions: ['.js', '.jsx', '.ts', '.tsx'],

graphql/src/test/java/com/linecorp/armeria/internal/server/graphql/GraphqlDocServiceTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import org.hamcrest.CustomTypeSafeMatcher;
2929
import org.junit.jupiter.api.Test;
30+
import org.junit.jupiter.api.extension.ExtendWith;
3031
import org.junit.jupiter.api.extension.RegisterExtension;
3132
import org.junit.jupiter.params.ParameterizedTest;
3233
import org.junit.jupiter.params.provider.ValueSource;
@@ -39,6 +40,7 @@
3940
import com.linecorp.armeria.common.AggregatedHttpResponse;
4041
import com.linecorp.armeria.common.HttpHeaderNames;
4142
import com.linecorp.armeria.common.HttpStatus;
43+
import com.linecorp.armeria.internal.testing.DocServiceExtension;
4244
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
4345
import com.linecorp.armeria.internal.testing.TestUtil;
4446
import com.linecorp.armeria.server.Route;
@@ -54,6 +56,7 @@
5456
import graphql.schema.DataFetcher;
5557

5658
@GenerateNativeImageTrace
59+
@ExtendWith(DocServiceExtension.class)
5760
class GraphqlDocServiceTest {
5861

5962
private static final ObjectMapper mapper = new ObjectMapper();

grpc/src/test/java/com/linecorp/armeria/internal/server/grpc/GrpcDocServiceTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.http.impl.client.CloseableHttpClient;
3030
import org.apache.http.impl.client.HttpClients;
3131
import org.junit.jupiter.api.Test;
32+
import org.junit.jupiter.api.extension.ExtendWith;
3233
import org.junit.jupiter.api.extension.RegisterExtension;
3334

3435
import com.fasterxml.jackson.databind.JsonNode;
@@ -48,6 +49,7 @@
4849
import com.linecorp.armeria.common.MediaType;
4950
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
5051
import com.linecorp.armeria.internal.server.grpc.GrpcDocServicePlugin.ServiceInfosBuilder;
52+
import com.linecorp.armeria.internal.testing.DocServiceExtension;
5153
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
5254
import com.linecorp.armeria.internal.testing.TestUtil;
5355
import com.linecorp.armeria.server.Route;
@@ -72,6 +74,7 @@
7274
import testing.grpc.TestServiceGrpc.TestServiceImplBase;
7375

7476
@GenerateNativeImageTrace
77+
@ExtendWith(DocServiceExtension.class)
7578
class GrpcDocServiceTest {
7679

7780
private static final ServiceDescriptor TEST_SERVICE_DESCRIPTOR =

licenses/web-licenses.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
372372

373373
core-js
374374
MIT
375-
Copyright (c) 2014-2024 Denis Pushkarev
375+
Copyright (c) 2014-2025 Denis Pushkarev
376376

377377
Permission is hereby granted, free of charge, to any person obtaining a copy
378378
of this software and associated documentation files (the "Software"), to deal
@@ -719,7 +719,7 @@ SOFTWARE.
719719
dompurify
720720
(MPL-2.0 OR Apache-2.0)
721721
DOMPurify
722-
Copyright 2024 Dr.-Ing. Mario Heiderich, Cure53
722+
Copyright 2025 Dr.-Ing. Mario Heiderich, Cure53
723723

724724
DOMPurify is free software; you can redistribute it and/or modify it under the
725725
terms of either:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright 2025 LY Corporation
3+
*
4+
* LY Corporation licenses this file to you under the Apache License,
5+
* version 2.0 (the "License"); you may not use this file except in compliance
6+
* with the License. You may obtain a copy of the License at:
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations
14+
* under the License.
15+
*/
16+
package com.linecorp.armeria.internal.testing;
17+
18+
import org.junit.jupiter.api.Timeout;
19+
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
20+
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
21+
import org.junit.jupiter.api.extension.ExtensionContext;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
25+
import com.linecorp.armeria.common.annotation.Nullable;
26+
import com.linecorp.armeria.server.docs.DocService;
27+
28+
/**
29+
* A JUnit extension that disables test timeout when {@link DocService} demo mode is enabled.
30+
*/
31+
public final class DocServiceExtension implements AfterTestExecutionCallback, BeforeTestExecutionCallback {
32+
33+
private static final Logger logger = LoggerFactory.getLogger(DocServiceExtension.class);
34+
35+
@Nullable
36+
private String oldTimeoutMode;
37+
38+
@Override
39+
public void beforeTestExecution(ExtensionContext context) throws Exception {
40+
if (TestUtil.isDocServiceDemoMode()) {
41+
oldTimeoutMode = System.getProperty(Timeout.TIMEOUT_MODE_PROPERTY_NAME);
42+
if (!"disabled".equals(oldTimeoutMode)) {
43+
logger.debug("Disabling timeout for: {}#{}",
44+
context.getRequiredTestClass().getName(),
45+
context.getDisplayName());
46+
System.setProperty(Timeout.TIMEOUT_MODE_PROPERTY_NAME, "disabled");
47+
}
48+
}
49+
}
50+
51+
@Override
52+
public void afterTestExecution(ExtensionContext context) throws Exception {
53+
if (TestUtil.isDocServiceDemoMode()) {
54+
if (oldTimeoutMode != null) {
55+
System.setProperty(Timeout.TIMEOUT_MODE_PROPERTY_NAME, oldTimeoutMode);
56+
oldTimeoutMode = null;
57+
} else {
58+
System.clearProperty(Timeout.TIMEOUT_MODE_PROPERTY_NAME);
59+
}
60+
}
61+
}
62+
}

thrift/thrift0.13/src/test/java/com/linecorp/armeria/internal/server/thrift/ThriftDocServiceTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import org.junit.ClassRule;
3030
import org.junit.Test;
31+
import org.junit.jupiter.api.extension.ExtendWith;
3132

3233
import com.fasterxml.jackson.databind.JsonNode;
3334
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -45,6 +46,7 @@
4546
import com.linecorp.armeria.common.thrift.ThriftSerializationFormats;
4647
import com.linecorp.armeria.internal.server.thrift.ThriftDocServicePlugin.Entry;
4748
import com.linecorp.armeria.internal.server.thrift.ThriftDocServicePlugin.EntryBuilder;
49+
import com.linecorp.armeria.internal.testing.DocServiceExtension;
4850
import com.linecorp.armeria.internal.testing.TestUtil;
4951
import com.linecorp.armeria.server.Route;
5052
import com.linecorp.armeria.server.ServerBuilder;
@@ -63,6 +65,7 @@
6365
import testing.thrift.main.OnewayHelloService;
6466
import testing.thrift.main.SleepService;
6567

68+
@ExtendWith(DocServiceExtension.class)
6669
public class ThriftDocServiceTest {
6770

6871
private static final HelloService.AsyncIface HELLO_SERVICE_HANDLER =

0 commit comments

Comments
 (0)