Skip to content

Phase 9 + 10:Spring Boot starter + Testcontainers interop 骨架 + README 收尾 - #15

Draft
lixuanqun wants to merge 3 commits into
cursor/tls-transport-3c36from
cursor/spring-boot-starter-3c36
Draft

Phase 9 + 10:Spring Boot starter + Testcontainers interop 骨架 + README 收尾#15
lixuanqun wants to merge 3 commits into
cursor/tls-transport-3c36from
cursor/spring-boot-starter-3c36

Conversation

@lixuanqun

@lixuanqun lixuanqun commented May 11, 2026

Copy link
Copy Markdown
Owner

概述

把剩余三件事一次性完成:Spring Boot 自动配置、互操作测试骨架、README 同步。到此项目原计划的 0-10 阶段全部交付

🔗 stacked on PR #14 TLS+WS

1. sip-spring-boot-starter(第 11 模块)

配置

sip:
  transport:
    udp:  { enabled: true,  host: 0.0.0.0, port: 5060 }
    tcp:  { enabled: false, host: 0.0.0.0, port: 5060 }
    tls:  { enabled: false, host: 0.0.0.0, port: 5061,
            keystore-path: file:/etc/sip/keystore.p12,
            keystore-password: changeit }
    ws:   { enabled: false, host: 0.0.0.0, port: 80 }

自动 Beans

  • 4 个 transport @ConditionalOnProperty
  • TimerScheduler 单例 @ConditionalOnMissingBean
  • RegistrationClient / OptionsProbe 连接到第一个可用 transport
  • TLS keystore 支持 classpath: / file: / 文件系统路径
  • 默认 TrustManager 全拒(强制操作员显式提供 SSLContext bean)
  • @PreDestroy 钩子按反序关闭

工程

  • Spring Boot 3.4 BOM 引入父 POM,仅 starter 模块消费
  • starter 不带 module-info.java(Spring Boot 与 JPMS 不友好),仅此模块 -Xlint:-module
  • JDK 21 this-escape 警告由 setter final 修复

测试

  • ApplicationContextRunner 4 场景

2. sip-interop-tests(第 12 模块,profile interop

mvn verify              # 默认 11 modules,跳过 interop
mvn verify -Pinterop    # 启用,需要 Docker

KamailioContainer

  • 固定 kamailio/kamailio-ci:5.7-alpine
  • 内嵌最小 Kamailio 配置 via Transferable(registrar + Digest auth)
  • isDockerAvailable() 静态探测,无 Docker 时测试 优雅 skip

测试

  • registersWithDigestAuth — REGISTER → 401 → Digest auth → 200 全流程
  • optionsProbeReturns200 — OPTIONS → 200

3. README 同步

  • 模块表更新到 12 模块
  • 路线图 Phase 8/9/10 全部 ✅
  • 测试规模表按模块列出,~225 tests
  • 新增 "Spring Boot 自动配置(推荐)" 快速上手段

验证

mvn -B verify           → 11 modules SUCCESS, ~225 tests
mvn -B verify -Pinterop → 12 modules SUCCESS(interop 测试在无 Docker 时 skip)

PR 链完整图

main
 └── #2  骨架 + ADR-0001
      └── #3  fixture 基础设施
           └── #4  SipParser
                └── #5  SipEncoder
                     └── #6  SipUriParser
                          └── #7  typed headers
                               └── #8  UDP + TCP transport
                                    └── #9  事务层 4 FSM
                                         └── #10 Dialog + REGISTER + Digest
                                              └── #11 GB28181
                                                   └── #12 ADR-0002 + README
                                                        └── #13 RFC 4475 +9 fixture + <hex>
                                                             └── #14 TLS + WebSocket
                                                                  └── #15 ← 本 PR

合并顺序:#2#3 → … → #15

Open in Web Open in Cursor 

cursoragent and others added 3 commits May 11, 2026 22:08
新模块(第 11 个):sip-spring-boot-starter
- 引入 Spring Boot 3.4 BOM 到父 POM 的 dependencyManagement(不强制其他模块)
- starter 模块本身不带 module-info(Spring Boot classpath 扫描与 JPMS 不友好),
  通过 -Xlint:-module 局部抑制对应警告

SipProperties (@ConfigurationProperties 'sip.*')
- sip.transport.udp.{enabled,host,port}   默认 enabled=true, port=5060
- sip.transport.tcp.{enabled,host,port}   默认 disabled, port=5060
- sip.transport.tls.{enabled,host,port,keystore-path,keystore-password,keystore-type}
  默认 disabled, port=5061, type=PKCS12
- sip.transport.ws.{enabled,host,port}    默认 disabled, port=80

setter 用 final 关键字消除 JDK 21 'this-escape' 警告。

SipAutoConfiguration (@autoConfiguration)
- 按需起 transport bean(NioUdpTransport/NioTcpTransport/NioTlsTransport/
  NioWebSocketTransport),自动 start() 并注册 close 钩子
- TimerScheduler 单例 bean(@ConditionalOnMissingBean)
- RegistrationClient / OptionsProbe bean,连接到第一个可用 Transport
- TLS:从 classpath: / file: / 文件系统 路径加载 PKCS12 keystore
- 默认 TrustManager 故意拒绝所有服务端证书 — 强制操作员显式提供 SSLContext
  bean 来开通 TLS 出站(防止误用默认信任)
- @PreDestroy 钩子按反序关闭所有 transport + TimerScheduler

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
对接 Spring Boot 3 的自动配置发现。

测试(SpringBootTest 用 ApplicationContextRunner)
- defaultsBindUdpTransportAndTimerScheduler
- canDisableUdpAndEnableTcp
- exposesRegistrationClientAndOptionsProbeWhenATransportExists
- tlsTransportRequiresKeystorePath(验证缺路径时启动失败)

mvn verify:11 模块 SUCCESS。总测试数从 ~210 增到 ~225。

Co-authored-by: li xuanqun <793005378@qq.com>
新模块 sip-interop-tests(第 12 个),仅 'interop' Maven profile 启用:
  mvn verify              ← 默认 11 模块,跳过 interop
  mvn verify -Pinterop    ← 启用 interop(需要 Docker)

KamailioContainer
- 继承 GenericContainer,固定 image kamailio/kamailio-ci:5.7-alpine
- 内嵌最小 Kamailio 配置(registrar + plain Digest auth)via Transferable
- 等待 'registrar ready' log 后认定就绪
- isDockerAvailable() 静态方法供测试 @BeforeAll 探测

KamailioRegisterInteropTest(2 个测试,Docker 缺位时 Assumptions.assumeTrue
自动跳过)
- registersWithDigestAuth:REGISTER → 401 → Digest auth → 200 全流程
- optionsProbeReturns200:OPTIONS probe → 200

工程化
- 父 POM 引入 Testcontainers BOM 1.20.4 + interop profile
- sip-interop-tests/README.md 说明如何添加更多 peer(Asterisk / OpenSIPS)
- 默认 verify 行为不变 — Cloud-agent CI 无 Docker 也 BUILD SUCCESS

mvn verify -Pinterop 在无 Docker 环境也通过(tests 跳过而非失败)。

Co-authored-by: li xuanqun <793005378@qq.com>
- 模块结构补 sip-spring-boot-starter / sip-interop-tests
- 路线图 Phase 8/9/10 全部标记完成
- 测试规模更新:11 模块 ~225 tests(不含 interop),按模块列出测试数
- 新增 'Spring Boot 自动配置(推荐)' 快速上手段
- 测试章节说明 -Pinterop profile 用法

整体 12 个 Maven 模块,全部 RFC 3261 §18 + RFC 7118 传输方案覆盖。

Co-authored-by: li xuanqun <793005378@qq.com>
@cursor cursor Bot changed the title Phase 10:sip-spring-boot-starter — 可选 Spring Boot 自动配置层 Phase 9 + 10:Spring Boot starter + Testcontainers interop 骨架 + README 收尾 May 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants