Repository navigation
Expand file tree
/
Copy pathpom.xml
More file actions
376 lines (363 loc) · 18.3 KB
/
Copy pathpom.xml
File metadata and controls
376 lines (363 loc) · 18.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.esrrhs</groupId>
<artifactId>javalua</artifactId>
<packaging>jar</packaging>
<version>1.0.0</version>
<name>javalua</name>
<description>Lua 5.3.4 implemented in pure Java, with the JVM handling garbage collection.</description>
<url>https://github.com/esrrhs/javalua</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--
Java 21 是下限:协程跑在虚拟线程上(见 README「关键设计决策」第 4 条)。
虚拟线程让 yield 可以发生在任意深度的调用栈上,而不必把 lvm.c 的主循环
改写成显式状态机。代价就是放弃了 Java 8 兼容。
-->
<maven.compiler.release>21</maven.compiler.release>
<!--
JUnit 6 起 Platform / Jupiter / Vintage 共用同一版本号。
项目下限已是 Java 21,满足 JUnit 6 的 Java 17 基线。
-->
<junit.version>6.1.3</junit.version>
<jazzer.version>0.30.0</jazzer.version>
<!--
阶段性门禁值:每完成一个阶段往上抬一档,只抬不降。
0.94 是<b>单跑一条 io 路径</b>(native 那一遍)实测的量;CI 两遍
合并后按 0.90 卡(见 .github/workflows/maven.yml 最后一步)。5.3.4 重对准
关掉 GC/dump 等后实测约 0.90;本地镜像 tools/local_conformance.sh
用同一组值卡单遍与合并两个口径)。
-->
<jacoco.line.minimum>0.80</jacoco.line.minimum>
<!--
覆盖率<b>校验</b>单独可跳(报告照常生成)。
CI 把整个套件跑两遍:一遍 native、一遍 -Djavalua.nonative 的纯 Java
io 兜底路径。任何<b>单</b>一遍都不该执行另一遍的那批分支,拿它去卡
合并后的门槛只会逼人删掉兜底代码;所以那两步各传
-Djacoco.check.skip=true,合并的 jacoco.exec 最后单独 check 一次
(见 .github/workflows/maven.yml 的 coverage-merged 步骤)。
本地跑单遍请用默认值——默认门槛就是按单遍能过定的。
-->
<jacoco.skip>false</jacoco.skip>
<!--
默认跟着 jacoco.skip 走:check 这个执行自己配了 <skip>,一旦配了
就不再认插件的 jacoco.skip,于是 -Djacoco.skip=true 会出现「agent 和
报告都跳了、校验照跑、还因为没数据而判红」。把默认值串起来,两个开关
各管各的:-Djacoco.skip=true 全跳,-Djacoco.check.skip=true 只跳校验。
-->
<jacoco.check.skip>${jacoco.skip}</jacoco.check.skip>
</properties>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<name>esrrhs</name>
<email>esrrhs@163.com</email>
<url>https://github.com/esrrhs/javalua</url>
</developer>
</developers>
<scm>
<connection>scm:git:git@github.com:esrrhs/javalua.git</connection>
<developerConnection>scm:git:git@github.com:esrrhs/javalua.git</developerConnection>
<url>git@github.com:esrrhs/javalua.git</url>
</scm>
<dependencyManagement>
<dependencies>
<!--
用 junit-bom 对齐 Platform / Jupiter / Vintage 到同一 6.x。
jazzer-junit 0.30.0 仍传递依赖 junit-jupiter 5.9.0 与
junit-platform 1.9.0;若不整栈升到 6,只抬 Platform(Dependabot
#9/#11/#12)会再次触发 "TestEngine with ID 'junit-jupiter'
failed to discover tests"。BOM import 强制覆盖 jazzer 的传递版本。
源码侧 FuzzTest 是手写差分 fuzz(普通 @Test),未用 @FuzzTest;
保留 jazzer 依赖以便日后启用,待其正式声明 JUnit 6 支持后再跟进。
-->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>${junit.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!--
覆盖率引导的模糊测试引擎(基于 libFuzzer,OSS-Fuzz 对 JVM 项目的官方方案)。
当前测试源未使用 @FuzzTest;依赖保留以便日后启用。
jazzer-junit 0.30.0 的 POM 仍声明 JUnit 5.9 / Platform 1.9,由上方
junit-bom 强制对齐到 JUnit 6;上游尚未发布正式声明 JUnit 6 的版本。
两种运行模式:
- 默认(不设 JAZZER_FUZZ):只回放 inputs 目录中已保存的输入,当作回归测试,
行为与普通单元测试一致,不启动 fuzzing 引擎
- JAZZER_FUZZ=1:启动 libFuzzer 持续变异探索,命中新覆盖或崩溃的输入
会落盘到 inputs 目录,供后续回归模式重放
-->
<dependency>
<groupId>com.code-intelligence</groupId>
<artifactId>jazzer-junit</artifactId>
<version>${jazzer.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.code-intelligence</groupId>
<artifactId>jazzer-api</artifactId>
<version>${jazzer.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.16.0</version>
<configuration>
<release>${maven.compiler.release}</release>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<!-- JUnit 6 文档推荐 >= 3.0;跟官方 starter 对齐到 3.6.1 -->
<version>3.6.1</version>
<configuration>
<!--
给每一条用例设一个 3 分钟的全局超时。
见过一次才知道多必要:一致性闸门曾经<b>卡死 18 分钟</b>
(后来证明是基础设施偶发,重跑就好),而 GitHub 只能等到
job 超时(默认 6 小时)才给结论 —— 期间<b>日志一行都取不到</b>
(gh 要等 job 结束才有日志),于是既不知道是哪条、也不知道
卡在哪。设了超时之后它会变成一条 FAILURE,带着线程栈指名
是哪条用例。3 分钟对本仓库够了:最慢的 FuzzTest 本机 20 秒。
不过超时要真的管用,还得指定<b>它怎么抢</b>。JUnit 5.10 的
键名是 junit.jupiter.execution.timeout.thread.mode.default,
之前一个都没设,于是按 INFERRED 推断出 SAME_THREAD:测试体
内联跑在测试线程上、到点只给这条线程发一次 interrupt(),
谁卡在不可中断的管道读上就永远收不到。2026-10-21 那次「纯
Java io」步骤挂到 6 小时上限、一行日志都没留下,就是这条
机制:具体卡点没能证实(job 日志取不到),但这个逃逸口是真的。
这里<b>显式写 SAME_THREAD</b>(与实际生效的值一致,只是不再
靠推断),并把纯 Java io 路径上那处不可中断的管道读改成可
中断的(IoLib#PopenReader)—— 超时这才真的落成一条带线程栈的
FAILURE。SEPARATE_THREAD 不是更好的选择:它是另起一条非 daemon
线程跑测试体,超时虽然报得出来,卡死的线程却留在那里,只能等
surefire 杀 fork。测试驱动里读参考实现输出的那几处仍是普通
阻塞读,不在这次改动范围内。
-->
<systemPropertyVariables>
<junit.jupiter.execution.timeout.default>180s</junit.jupiter.execution.timeout.default>
<junit.jupiter.execution.timeout.thread.mode.default>SAME_THREAD</junit.jupiter.execution.timeout.thread.mode.default>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.16</version>
<!--
覆盖率门禁在新实现落地初期会长期不满足:Lua 5.3.4 完整实现有
几万行,而可用的测试用例要等解释器能跑起来之后才写得出来。
所以门禁值(见 jacoco.line.minimum)随阶段推进逐步抬升,
而不是一开始就定到当期够不着的高度让它永远红着——永远红的门禁等于
没有门禁,反而会掩盖真正的覆盖率下降。
-->
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>check-coverage</id>
<phase>test</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<skip>${jacoco.check.skip}</skip>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<!-- 随实施阶段推进逐步抬高;见上方注释 -->
<minimum>${jacoco.line.minimum}</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<!--
没有参考实现时别让覆盖率门禁把构建打红。
一致性测试(Diff / ConformanceTest / FuzzTest ...)占了行覆盖的
绝大部分;参考二进制缺席时它们全部 assumeTrue 跳过,覆盖率会掉到
0.1 左右,门禁必然红——但红的原因不是代码变差了,而是没得比。
永远红的门禁等于没有门禁,所以这种情况下只跳过 check,
report 照常生成,覆盖率数字仍然看得见。
CI 的 conformance job 一定设了 LUA53_BIN,所以那边门禁照旧生效。
-->
<id>no-reference-lua</id>
<activation>
<property>
<name>!env.LUA53_BIN</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>check-coverage</id>
<phase>test</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>quality</id>
<build>
<plugins>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.10.5.0</version>
<configuration>
<!--
只把 HIGH 优先级当成闸门:本仓库有一批<b>刻意为之</b>的
中等项(LuaValue 的 public 字段照抄 C 的 struct、
生成器产物的风格问题),把它们也卡住只会让人往
excludeFilterFile 里堆豁免,反而把真信号淹掉。
HIGH 这一档历史上只有两类:默认字符集解 C 侧字节流
(会毁掉非 ASCII 字节,正是本实现最不能犯的错)和
多余判空——都能修,修完就该拦住回归。
低优先级仍然拦不住 CI,需要完整清单时本地跑
./mvnw -Pquality -DskipTests -Dspotbugs.threshold=Low。
-->
<threshold>High</threshold>
<failOnError>true</failOnError>
<excludeFilterFile>${project.basedir}/spotbugs-exclude.xml</excludeFilterFile>
</configuration>
<executions>
<execution>
<id>spotbugs</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.12.0</version>
<configuration>
<doclint>none</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.8</version>
<configuration>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.12.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<autoPublish>true</autoPublish>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>