Skip to content

Commit bd5d420

Browse files
kridaiclaude
andauthored
test: vendor the Prism mock server used by make test-docker (#788)
make test-docker downloaded and ran a script from sendgrid/sendgrid-oai@HEAD, which is no longer publicly readable, so 231 of 255 SendGridTest tests could not run. The setup now lives in mock-server/ with everything pinned: - Prism v2.0.17 binary verified by sha256; spec vendored from sendgrid-oai commit eb7a825b (the commit the old script pinned) - nginx and debian base images pinned by digest - Dockerfile moved from the removed openjdk images to maven:3.9-eclipse-temurin - --exit-code-from helper-runner so a failing test fails the make target Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 2f8ed05 commit bd5d420

9 files changed

Lines changed: 30919 additions & 16 deletions

File tree

‎Dockerfile‎

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
ARG version=latest
2-
FROM openjdk:$version
1+
ARG version=8
2+
FROM maven:3.9-eclipse-temurin-${version}
33

4-
# version <= 11
54
RUN apt-get update \
6-
&& apt-get install -y make maven || true
7-
COPY prism/prism/nginx/cert.crt /usr/local/share/ca-certificates/cert.crt
8-
RUN update-ca-certificates || true
5+
&& apt-get install -y --no-install-recommends make \
6+
&& rm -rf /var/lib/apt/lists/*
97

10-
# version > 11
11-
RUN yum update -y \
12-
&& yum install -y make wget || true
13-
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo \
14-
&& yum install -y maven || true
15-
RUN keytool -import -trustcacerts -cacerts -storepass changeit -noprompt \
16-
-alias api.sendgrid.com -file /usr/local/share/ca-certificates/cert.crt || true
8+
# Trust the mock server's api.sendgrid.com certificate (see mock-server/).
9+
COPY mock-server/nginx/cert.crt /tmp/api.sendgrid.com.crt
10+
RUN keytool -importcert -noprompt -storepass changeit -alias api.sendgrid.com \
11+
-file /tmp/api.sendgrid.com.crt -keystore "$(find "$JAVA_HOME" -name cacerts | head -1)"
1712

1813
WORKDIR /app
1914
COPY . .

‎Makefile‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ test:
1515

1616
test-integ: test
1717

18-
version ?= latest
18+
version ?= 8
19+
COMPOSE := $(shell docker compose version >/dev/null 2>&1 && echo "docker compose" || echo "docker-compose")
1920
test-docker:
20-
curl -s https://raw.githubusercontent.com/sendgrid/sendgrid-oai/HEAD/prism/prism-java.sh -o prism.sh
21-
version=$(version) bash ./prism.sh
21+
version=$(version) $(COMPOSE) -f mock-server/docker-compose.yml up --build --force-recreate \
22+
--abort-on-container-exit --exit-code-from helper-runner --remove-orphans; \
23+
status=$$?; version=$(version) $(COMPOSE) -f mock-server/docker-compose.yml down --remove-orphans; exit $$status
2224

2325
update-deps:
2426
mvn versions:use-latest-releases versions:commit -DallowMajorUpdates=false

‎mock-server/Dockerfile.prism‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Prism mock of the SendGrid v3 API, used by `make test-docker`.
2+
# Everything is pinned: the base image by digest, the Prism binary by sha256,
3+
# and the spec is vendored (see README.md in this directory).
4+
FROM debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587
5+
6+
ARG PRISM_VERSION=v2.0.17
7+
ARG PRISM_SHA256=80f37c2aedab2035a20e6025ac552908bce9e5d64a9338a48434e604e5590731
8+
9+
RUN apt-get update \
10+
&& apt-get install -y --no-install-recommends curl ca-certificates \
11+
&& curl -fsSL "https://github.com/stoplightio/prism/releases/download/${PRISM_VERSION}/prism_linux_amd64" -o /usr/local/bin/prism \
12+
&& echo "${PRISM_SHA256} /usr/local/bin/prism" | sha256sum -c - \
13+
&& chmod +x /usr/local/bin/prism \
14+
&& apt-get purge -y curl && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*
15+
16+
COPY oai_stoplight.json /oai_stoplight.json
17+
18+
EXPOSE 4010
19+
CMD ["prism", "--port", "4010", "mock", "--spec", "/oai_stoplight.json"]

‎mock-server/README.md‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Mock SendGrid API for tests
2+
3+
`make test-docker` runs the test suite against a local mock of `api.sendgrid.com`:
4+
5+
- **prism**: [Prism](https://github.com/stoplightio/prism) v2.0.17 mocking `oai_stoplight.json`.
6+
The binary's sha256 is checked in `Dockerfile.prism`.
7+
- **nginx**: answers TLS as `api.sendgrid.com` with the self-signed test certificate in
8+
`nginx/` and proxies to prism. The certificate and key exist only for this mock.
9+
- **helper-runner**: the repo's root `Dockerfile`, which trusts that certificate and runs
10+
`make test-integ`.
11+
12+
`oai_stoplight.json` is vendored from `sendgrid/sendgrid-oai` at commit
13+
`eb7a825bf06dfec7da2622735c5334c0d35da9fa`, the same commit the previous
14+
remote `prism-java.sh` script pinned. These files used to be downloaded at test time
15+
from that repository, which is no longer publicly readable.

‎mock-server/docker-compose.yml‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Runs the test suite against a local mock of api.sendgrid.com:
2+
# helper-runner -> nginx (TLS as api.sendgrid.com) -> prism (mock of the v3 spec)
3+
services:
4+
helper-runner:
5+
build:
6+
context: ..
7+
args:
8+
- version=${version:-8}
9+
command: make test-integ
10+
depends_on:
11+
nginx:
12+
condition: service_healthy
13+
nginx:
14+
image: nginx:1.27-alpine@sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10
15+
networks:
16+
default:
17+
aliases:
18+
- api.sendgrid.com
19+
volumes:
20+
- ./nginx:/etc/nginx:ro
21+
depends_on:
22+
- prism
23+
healthcheck:
24+
# 2xx-4xx means nginx is up and prism answered; 502 means prism isn't ready yet.
25+
test: ["CMD-SHELL", "wget -S -O /dev/null http://127.0.0.1/ 2>&1 | grep -qE '^ HTTP/1\\.[01] [1-4][0-9][0-9]'"]
26+
interval: 2s
27+
timeout: 2s
28+
retries: 30
29+
prism:
30+
platform: linux/amd64
31+
build:
32+
context: .
33+
dockerfile: Dockerfile.prism

‎mock-server/nginx/cert.crt‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDyDCCArACCQDoRrX2g0xuUDANBgkqhkiG9w0BAQsFADCBpDELMAkGA1UEBhMC
3+
VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x
4+
DzANBgNVBAoMBlR3aWxpbzERMA8GA1UECwwIU2VuZEdyaWQxGTAXBgNVBAMMEGFw
5+
aS5zZW5kZ3JpZC5jb20xKTAnBgkqhkiG9w0BCQEWGnRlYW1faW50ZXJmYWNlc0B0
6+
d2lsaW8uY29tMCAXDTIyMDEwNzAwMzAxOFoYDzIxMjExMjE0MDAzMDE4WjCBpDEL
7+
MAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBG
8+
cmFuY2lzY28xDzANBgNVBAoMBlR3aWxpbzERMA8GA1UECwwIU2VuZEdyaWQxGTAX
9+
BgNVBAMMEGFwaS5zZW5kZ3JpZC5jb20xKTAnBgkqhkiG9w0BCQEWGnRlYW1faW50
10+
ZXJmYWNlc0B0d2lsaW8uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
11+
AQEAmS9xQ4D19jQ2YyuFzN7zk9xRWeOil7bzkOkgFCCqlhPCzuYlMqgD1F7ImcNo
12+
XbFw13s8k/18xWqxBynFgtmniuFm/f4g8iAfeBn35i1g3Bf0bpG9gWn6h/dX3YXb
13+
g0nl0e+bMQG4uD0gccySA/Vt6Y6Tshgu6pVo+yMiWEqQRa0tgqr2WZ8NU0bOrpQz
14+
U9bOrvKxrWvdmIxIYOmptywTXW3vLi63LpE2iy5dPWFO4JCRBc02XZ84B5EhbfVt
15+
ojNbFdtW6urt/VkrWbt18bFcoeM3w6/Hba8MF+z8ONS8QjD9CRXleNKDMVLmvEmW
16+
L0RxO4H1P3O7ar/vPafEDobPGQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQA/MNAr
17+
C+9iCLLn9S2QWXfarI1EAb4AFkGWYtqcvhmLJMqWqzsjEWWpWsSBk/i/kPNzTvNs
18+
XRj8ZPS61lhJw3rRmP/2LW9M4u6mIBHfiBgtWaMhhAjaFA0ALAsJa/8WmAgUfb5V
19+
dR73oc1GJtDTKJgZ3cFaKAaimDIxJNHSjpYADCEkdKoVv1b/JxD8JEzI9NmrU5xd
20+
7T7pG6RVT4xO5flCJM+nO851jUaKVmcKD7lhQe9Z8P0bH+ecFyQDILbOFd8ojBHV
21+
6hSLw4vZCM5bR7iOFBUYzxaKcXl6FJTKaYXD/UrfFXA95YZieGPKYxoF6AkB0I1C
22+
9RcmCQkkJZnCRCJX
23+
-----END CERTIFICATE-----

‎mock-server/nginx/cert.key‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCZL3FDgPX2NDZj
3+
K4XM3vOT3FFZ46KXtvOQ6SAUIKqWE8LO5iUyqAPUXsiZw2hdsXDXezyT/XzFarEH
4+
KcWC2aeK4Wb9/iDyIB94GffmLWDcF/Rukb2BafqH91fdhduDSeXR75sxAbi4PSBx
5+
zJID9W3pjpOyGC7qlWj7IyJYSpBFrS2CqvZZnw1TRs6ulDNT1s6u8rGta92YjEhg
6+
6am3LBNdbe8uLrcukTaLLl09YU7gkJEFzTZdnzgHkSFt9W2iM1sV21bq6u39WStZ
7+
u3XxsVyh4zfDr8dtrwwX7Pw41LxCMP0JFeV40oMxUua8SZYvRHE7gfU/c7tqv+89
8+
p8QOhs8ZAgMBAAECggEASPrwVD/Bbu3LJ44ZrdReaYhifZfU48D244gdj1lMzDlX
9+
62h8OlkPkgMiQRd2xoR+BTsiTkNLSWaeNpJxFfkKOEFQ5xtGqPQi6f49O71M0y7a
10+
dj8a8OgDwvlVNCXMwgzX4B/uaPewAJ6msXDL8/Tey5Hwzb11xK8wF83SVAwaFgdB
11+
2eY+crgF9biRiRsX+J6uqqHd4RM37IyQ133voTFBho48h3ORgo4WYu5tsHbwKvGC
12+
pNDtvuvuwkvp6JuI0A1hr3j+/5981n+4w+rnyORliJmxjTYUzhrJ3UXjlXd9gInj
13+
6tgKEnyq4j78MRp1VrFTPze3XOgMbhVflpLz22rWsQKBgQDJheFTI255UP+9c82B
14+
KovkEtWNMwZwxiwmxPzapuUsg+OyJ7rNACuT+kRNkbQovC19nVG6NvwWs7A32Jjt
15+
YHBmAepnh1a1p4NXkKEtwe/28nEnoKsv/Iaw7fIffr6gAdnlv8NV0K8WrnCuWUJ7
16+
qgKrHSqXdf2k/yxdCi8gQDzaPQKBgQDCmGwAS9LCOJWBfn7UkSc9aOf7z6ZDcWJw
17+
smzWJ5zMNEwv4F4D7OO+4JpLoaKyu5jfllXMIELPWfC8J/+RsyDyEe1CED9pxIbJ
18+
NBhfwJtwriolypXrkkCiRBRjG2Jg5NGdRRNjTbqtct83PxX5HcEjk09JFl2FNp7D
19+
+ma0dpxCDQKBgFLVPurnc29WRehfgycGj/2taC3jvU/5hQhii/RsCWMkyyDdh8Df
20+
wwnOIuknbMAZqTEqyv8ZvsCuF069Lw7TRyAGxYzMam28bxY9EqM2RiZhPPWm6vaM
21+
e+iZxZ4AgOZQHHp9OhM59d4C0bo4YkVmejZPhMRA8YMyh8+ucfR1sw2ZAoGADPLp
22+
lOd2wdfUEwbg17JFAzAc58O8k5ZS757f4SxHocsFGtZ6SxaTXRtDCS9bTTtwg8hU
23+
Mz4eU//vJgYfWomp8pHA0PmVzqr2MSNXT9/YOBpO0a72ZPOZe3K+TI4A8OOpEycK
24+
kDwW5P3U3q9C/g290Wk3CG0Fkhy9WdsqxG10Hm0CgYBhw64ATDSZ45KIJUF46HRa
25+
RAY6oO5z2w2BeEpFugkFaMoziQocudeTMvE+QWneYLs7Tdzip+qbNVXJi6jAfpQQ
26+
H3z2Bm34QvnuXuM1oWL2l7o10X35BHR0B6+IyL3Z/PHUusO51S+rNGPyKr63TXYI
27+
Ucx/inqVBb7oeKlSHYmA1w==
28+
-----END PRIVATE KEY-----

‎mock-server/nginx/nginx.conf‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
events {}
2+
http {
3+
proxy_buffering off;
4+
server {
5+
listen 80;
6+
listen 443 ssl;
7+
8+
ssl_certificate /etc/nginx/cert.crt;
9+
ssl_certificate_key /etc/nginx/cert.key;
10+
11+
location / {
12+
proxy_pass http://prism:4010;
13+
proxy_ignore_client_abort on;
14+
}
15+
}
16+
17+
client_max_body_size 0;
18+
}

0 commit comments

Comments
 (0)