@@ -13,6 +13,11 @@ import {
1313 vi ,
1414} from "vitest" ;
1515import { CLOUDFLARE_ACCOUNT_ID } from "./helpers/account-id" ;
16+ import {
17+ generateLeafCertificate ,
18+ generateMtlsCertName ,
19+ generateRootCertificate ,
20+ } from "./helpers/cert" ;
1621import { WranglerE2ETestHelper } from "./helpers/e2e-wrangler-test" ;
1722import { fetchText } from "./helpers/fetch-text" ;
1823import { generateResourceName } from "./helpers/generate-resource-name" ;
@@ -22,8 +27,8 @@ import type { WranglerLongLivedCommand } from "./helpers/wrangler";
2227type TestCase < T = void > = {
2328 name : string ;
2429 scriptPath : string ;
25- setup ?: ( helper : WranglerE2ETestHelper ) => Promise < T > | T ;
26- generateWranglerConfig : ( setupResult : T ) => RawConfig ;
30+ setup ?: ( helper : WranglerE2ETestHelper , workerName : string ) => Promise < T > | T ;
31+ generateWranglerConfig : ( setupResult : T ) => Omit < RawConfig , "name" > ;
2732 expectedResponseMatch : string | RegExp ;
2833 // Flag for resources that can work without remote bindings opt-in
2934 worksWithoutRemoteBindings ?: boolean ;
@@ -73,7 +78,6 @@ const testCases: TestCase<Record<string, string>>[] = [
7378 return { worker : targetWorkerName } ;
7479 } ,
7580 generateWranglerConfig : ( { worker : targetWorkerName } ) => ( {
76- name : "mixed-mode-service-binding-test" ,
7781 main : "service-binding.js" ,
7882 compatibility_date : "2025-01-01" ,
7983 services : [
@@ -99,7 +103,6 @@ const testCases: TestCase<Record<string, string>>[] = [
99103 name : "AI" ,
100104 scriptPath : "ai.js" ,
101105 generateWranglerConfig : ( ) => ( {
102- name : "mixed-mode-ai-test" ,
103106 main : "ai.js" ,
104107 compatibility_date : "2025-01-01" ,
105108 ai : {
@@ -115,7 +118,6 @@ const testCases: TestCase<Record<string, string>>[] = [
115118 name : "Browser" ,
116119 scriptPath : "browser.js" ,
117120 generateWranglerConfig : ( ) => ( {
118- name : "mixed-mode-browser-test" ,
119121 main : "browser.js" ,
120122 compatibility_date : "2025-01-01" ,
121123 browser : {
@@ -130,7 +132,6 @@ const testCases: TestCase<Record<string, string>>[] = [
130132 name : "Images" ,
131133 scriptPath : "images.js" ,
132134 generateWranglerConfig : ( ) => ( {
133- name : "mixed-mode-images-test" ,
134135 main : "images.js" ,
135136 compatibility_date : "2025-01-01" ,
136137 images : {
@@ -154,7 +155,6 @@ const testCases: TestCase<Record<string, string>>[] = [
154155 return { name } ;
155156 } ,
156157 generateWranglerConfig : ( { name } ) => ( {
157- name : "mixed-mode-vectorize-test" ,
158158 main : "vectorize.js" ,
159159 compatibility_date : "2025-01-01" ,
160160 vectorize : [
@@ -190,7 +190,6 @@ const testCases: TestCase<Record<string, string>>[] = [
190190 return { namespace } ;
191191 } ,
192192 generateWranglerConfig : ( { namespace } ) => ( {
193- name : "mixed-mode-dispatch-namespace-test" ,
194193 main : "dispatch-namespace.js" ,
195194 compatibility_date : "2025-01-01" ,
196195 dispatch_namespaces : [
@@ -214,7 +213,6 @@ const testCases: TestCase<Record<string, string>>[] = [
214213 return { id : ns } ;
215214 } ,
216215 generateWranglerConfig : ( { id : namespaceId } ) => ( {
217- name : "mixed-mode-kv-test" ,
218216 main : "kv.js" ,
219217 compatibility_date : "2025-01-01" ,
220218 kv_namespaces : [
@@ -244,7 +242,6 @@ const testCases: TestCase<Record<string, string>>[] = [
244242 return { name } ;
245243 } ,
246244 generateWranglerConfig : ( { name : bucketName } ) => ( {
247- name : "mixed-mode-r2-test" ,
248245 main : "r2.js" ,
249246 compatibility_date : "2025-01-01" ,
250247 r2_buckets : [
@@ -274,7 +271,6 @@ const testCases: TestCase<Record<string, string>>[] = [
274271 return { id, name } ;
275272 } ,
276273 generateWranglerConfig : ( { id, name } ) => ( {
277- name : "mixed-mode-d1-test" ,
278274 main : "d1.js" ,
279275 compatibility_date : "2025-01-01" ,
280276 d1_databases : [
@@ -288,22 +284,94 @@ const testCases: TestCase<Record<string, string>>[] = [
288284 } ) ,
289285 expectedResponseMatch : "existing-value" ,
290286 } ,
287+ {
288+ name : "mTLS" ,
289+ scriptPath : "mtls.js" ,
290+ setup : async ( helper , workerName ) => {
291+ // Generate root and leaf certificates
292+ const { certificate : rootCert , privateKey : rootKey } =
293+ generateRootCertificate ( ) ;
294+ const { certificate : leafCert , privateKey : leafKey } =
295+ generateLeafCertificate ( rootCert , rootKey ) ;
296+
297+ // Generate filenames for concurrent e2e test environment
298+ const mtlsCertName = generateMtlsCertName ( ) ;
299+ // const caCertName = generateCaCertName();
300+
301+ // locally generated certs/key
302+ await helper . seed ( { "mtls_client_cert_file.pem" : leafCert } ) ;
303+ await helper . seed ( { "mtls_client_private_key_file.pem" : leafKey } ) ;
304+
305+ const output = await helper . run (
306+ `wrangler cert upload mtls-certificate --name ${ mtlsCertName } --cert mtls_client_cert_file.pem --key mtls_client_private_key_file.pem`
307+ ) ;
308+
309+ const match = output . stdout . match ( / I D : \s + (?< certId > .* ) $ / m) ;
310+ const certificateId = match ?. groups ?. certId ;
311+ assert ( certificateId ) ;
312+
313+ await helper . seed ( {
314+ "worker.js" : dedent /* javascript */ `
315+ export default {
316+ fetch(request) { return new Response("Hello"); }
317+ }
318+ ` ,
319+ } ) ;
320+
321+ const wranglerConfig : RawConfig = {
322+ name : workerName ,
323+ mtls_certificates : [
324+ {
325+ certificate_id : certificateId ,
326+ binding : "MTLS" ,
327+ } ,
328+ ] ,
329+ } ;
330+ await helper . seed ( {
331+ "pre-deployment-wrangler.json" : JSON . stringify ( wranglerConfig , null , 2 ) ,
332+ } ) ;
333+
334+ await helper . run (
335+ `wrangler deploy worker.js --name ${ workerName } -c pre-deployment-wrangler.json --compatibility-date 2025-01-01`
336+ ) ;
337+ onTestFinished ( async ( ) => {
338+ await helper . run ( `wrangler delete --name ${ workerName } ` ) ;
339+ } ) ;
340+
341+ return { certificateId } ;
342+ } ,
343+ generateWranglerConfig : ( { certificateId } ) => ( {
344+ main : "mtls.js" ,
345+ compatibility_date : "2025-01-01" ,
346+ mtls_certificates : [
347+ {
348+ binding : "MTLS" ,
349+ certificate_id : certificateId ,
350+ experimental_remote : true ,
351+ } ,
352+ ] ,
353+ } ) ,
354+ // Note: in this test we are making sure that TLS negotiation does work by checking that we get an SSL certificate error
355+ expectedResponseMatch : / T h e S S L c e r t i f i c a t e e r r o r / ,
356+ } ,
291357] ;
292358
293359describe . skipIf ( ! CLOUDFLARE_ACCOUNT_ID ) ( "Wrangler Mixed Mode E2E Tests" , ( ) => {
294360 describe . each ( testCases ) ( "$name" , ( testCase ) => {
295361 let helper : WranglerE2ETestHelper ;
362+ let workerName : string ;
296363
297364 beforeEach ( ( ) => {
298365 helper = new WranglerE2ETestHelper ( ) ;
366+ workerName = generateResourceName ( ) ;
299367 } ) ;
300368
301369 it ( "works with remote bindings enabled" , async ( ) => {
302370 await helper . seed (
303371 path . resolve ( __dirname , "./seed-files/remote-binding-workers" )
304372 ) ;
305373
306- await writeWranglerConfig ( testCase , helper ) ;
374+ await writeWranglerConfig ( testCase , helper , workerName ) ;
307375
308376 const worker = helper . runLongLived ( "wrangler dev --x-remote-bindings" ) ;
309377
@@ -322,7 +390,7 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
322390 path . resolve ( __dirname , "./seed-files/remote-binding-workers" )
323391 ) ;
324392
325- await writeWranglerConfig ( testCase , helper ) ;
393+ await writeWranglerConfig ( testCase , helper , workerName ) ;
326394
327395 const worker = helper . runLongLived ( "wrangler dev" ) ;
328396
@@ -339,11 +407,13 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
339407 ( ) => {
340408 let worker : WranglerLongLivedCommand ;
341409 let helper : WranglerE2ETestHelper ;
410+ let workerName : string ;
342411
343412 let url : string ;
344413
345414 beforeAll ( async ( ) => {
346415 helper = new WranglerE2ETestHelper ( ) ;
416+ workerName = generateResourceName ( ) ;
347417 await helper . seed (
348418 path . resolve ( __dirname , "./seed-files/remote-binding-workers" )
349419 ) ;
@@ -374,7 +444,7 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
374444 } ) ;
375445
376446 it . each ( testCases ) ( "$name with worker reload" , async ( testCase ) => {
377- await writeWranglerConfig ( testCase , helper ) ;
447+ await writeWranglerConfig ( testCase , helper , workerName ) ;
378448
379449 await worker . waitForReload ( ) ;
380450
@@ -449,12 +519,17 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)(
449519
450520async function writeWranglerConfig (
451521 testCase : TestCase < Record < string , string > > ,
452- helper : WranglerE2ETestHelper
522+ helper : WranglerE2ETestHelper ,
523+ workerName : string
453524) {
454- const setupResult = ( await testCase . setup ?.( helper ) ) ?? { } ;
525+ const setupResult = ( await testCase . setup ?.( helper , workerName ) ) ?? { } ;
455526
456527 const wranglerConfig = testCase . generateWranglerConfig ( setupResult ) ;
457528 await helper . seed ( {
458- "wrangler.json" : JSON . stringify ( wranglerConfig , null , 2 ) ,
529+ "wrangler.json" : JSON . stringify (
530+ { name : workerName , ...wranglerConfig } ,
531+ null ,
532+ 2
533+ ) ,
459534 } ) ;
460535}
0 commit comments