11import { execFileSync , spawnSync } from 'node:child_process' ;
2- import { removeByName , removeLabelledObjects , removeRunnerObjects , requireRealDocker , TEST_FILE_LABEL , TEST_RUN_LABEL } from './fixtures/docker-sweep.ts' ;
2+ import { CLIENT_LIMIT , removeByName , removeLabelledObjects , removeRunnerObjects , requireRealDocker , TEST_FILE_LABEL , TEST_RUN_LABEL } from './fixtures/docker-sweep.ts' ;
33import { fixtureGit } from './fixtures/git.ts' ;
44import { createHash , randomBytes , randomUUID } from 'node:crypto' ;
55import { chmodSync , existsSync , mkdtempSync , mkdirSync , readdirSync , readFileSync , realpathSync , renameSync , rmSync , statSync ,
@@ -490,8 +490,8 @@ describe('real Docker agent isolation', () => {
490490 docker ( 'rm' , '--force' , valid . name ) ; containers . delete ( valid . name ) ;
491491 } finally {
492492 // The container first: a volume it mounts cannot be removed.
493- spawnSync ( 'docker' , [ 'rm' , '--force' , valid . name ] , { stdio : 'ignore' } ) ;
494- spawnSync ( 'docker' , [ 'volume' , 'rm' , '--force' , rogue ] , { stdio : 'ignore' } ) ;
493+ spawnSync ( 'docker' , [ 'rm' , '--force' , valid . name ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) ;
494+ spawnSync ( 'docker' , [ 'volume' , 'rm' , '--force' , rogue ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) ;
495495 }
496496 } , 60_000 ) ;
497497
@@ -819,7 +819,7 @@ describe('real Docker agent isolation', () => {
819819 expect ( docker ( 'network' , 'inspect' , '--format' , '{{.Id}}' , network . slice ( 0 , 12 ) ) ) . toBe ( lookalike ) ;
820820 // And an inspect naming a missing container exits non-zero yet prints the others, the answer the shim below gives.
821821 const partial = spawnSync ( 'docker' , [ 'container' , 'inspect' , '--format' , '{{.Id}}' , holders [ 0 ] ! , `codeboost-gone-${ randomUUID ( ) } ` ] ,
822- { encoding : 'utf8' } ) ;
822+ { encoding : 'utf8' , ... CLIENT_LIMIT } ) ;
823823 expect ( partial . status ) . not . toBe ( 0 ) ;
824824 expect ( partial . stdout ) . toContain ( holders [ 0 ] ) ;
825825 expect ( partial . stderr ) . toMatch ( / ^ E r r o r r e s p o n s e f r o m d a e m o n : N o s u c h c o n t a i n e r : c o d e b o o s t - g o n e - / m) ;
@@ -846,7 +846,7 @@ describe('real Docker agent isolation', () => {
846846 const warn = vi . spyOn ( console , 'warn' ) . mockImplementation ( ( ) => undefined ) ;
847847 try {
848848 for ( const [ kind , name ] of byName ) removeByName ( kind , name , 'test' ) ;
849- expect ( byName . filter ( ( [ kind , name ] ) => spawnSync ( 'docker' , [ kind , 'inspect' , name ] , { stdio : 'ignore' } ) . status === 0 ) ) . toEqual ( [ ] ) ;
849+ expect ( byName . filter ( ( [ kind , name ] ) => spawnSync ( 'docker' , [ kind , 'inspect' , name ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) . status === 0 ) ) . toEqual ( [ ] ) ;
850850 for ( const [ kind , name ] of byName ) removeByName ( kind , name , 'test' ) ;
851851 expect ( warn ) . not . toHaveBeenCalled ( ) ;
852852 } finally { warn . mockRestore ( ) ; }
@@ -856,7 +856,7 @@ describe('real Docker agent isolation', () => {
856856 removeByName ( 'network' , lookalike . slice ( 0 , 12 ) , 'test' ) ;
857857 expect ( docker ( 'container' , 'inspect' , '--format' , '{{.Id}}' , bystanders [ 0 ] ! . slice ( 0 , 12 ) ) ) . toBe ( bystanders [ 0 ] ) ;
858858 removeByName ( 'container' , bystanders [ 0 ] ! . slice ( 0 , 12 ) , 'test' ) ;
859- const exists = ( kind : string , ref : string ) => spawnSync ( 'docker' , [ kind , 'inspect' , ref ] , { stdio : 'ignore' } ) . status === 0 ;
859+ const exists = ( kind : string , ref : string ) => spawnSync ( 'docker' , [ kind , 'inspect' , ref ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) . status === 0 ;
860860 for ( const holder of holders ) expect ( exists ( 'container' , holder ) ) . toBe ( false ) ;
861861 expect ( [ exists ( 'network' , network ) , exists ( 'network' , prefixNamed ) , exists ( 'volume' , volume ) ] ) . toEqual ( [ false , false , false ] ) ;
862862 expect ( exists ( 'container' , labelled ) ) . toBe ( false ) ;
@@ -893,7 +893,7 @@ describe('real Docker agent isolation', () => {
893893 // First, so afterAll does not refuse a keeper this test finds left: its file-label sweep removes that keeper, then
894894 // its runner sweep the volumes.
895895 taskFilesystems . splice ( taskFilesystems . indexOf ( left ) , 1 ) ;
896- expect ( spawnSync ( 'docker' , [ 'container' , 'inspect' , left . keeper ] , { stdio : 'ignore' } ) . status ) . not . toBe ( 0 ) ;
896+ expect ( spawnSync ( 'docker' , [ 'container' , 'inspect' , left . keeper ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) . status ) . not . toBe ( 0 ) ;
897897 // Its volumes carry the runner label, so ordinary cleanup can remove them now that no keeper holds them.
898898 removeTaskFilesystems ( left ) ;
899899 expect ( byAllocation ( allocationId ) ) . toEqual ( [ ] ) ;
@@ -2559,7 +2559,7 @@ describe('real Docker agent isolation', () => {
25592559 removeTaskFilesystems ( handle ) ;
25602560 expect ( isRecoveredTaskStorage ( handle ) ) . toBe ( false ) ;
25612561 for ( const [ kind , ref ] of [ [ 'container' , left . keeper ] , [ 'volume' , left . workVolume ] , [ 'volume' , left . metadataVolume ] ] as const )
2562- expect ( spawnSync ( 'docker' , [ kind , 'inspect' , ref ] , { stdio : 'ignore' } ) . status ) . not . toBe ( 0 ) ;
2562+ expect ( spawnSync ( 'docker' , [ kind , 'inspect' , ref ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) . status ) . not . toBe ( 0 ) ;
25632563 } , 180_000 ) ;
25642564
25652565 it ( 'never removes a task keeper replaced by another runner, but still removes the owned volumes' , ( ) => {
@@ -2580,7 +2580,7 @@ describe('real Docker agent isolation', () => {
25802580 expect ( spawnSync ( 'docker' , [ 'volume' , 'inspect' , filesystems . workVolume ] ) . status ) . not . toBe ( 0 ) ;
25812581 passed = true ;
25822582 } finally {
2583- spawnSync ( 'docker' , [ 'rm' , '--force' , filesystems . keeper ] , { stdio : 'ignore' } ) ;
2583+ spawnSync ( 'docker' , [ 'rm' , '--force' , filesystems . keeper ] , { stdio : 'ignore' , ... CLIENT_LIMIT } ) ;
25842584 // A failure above stays the one reported: what the removal leaves, the allocation sweep below removes, the keeper
25852585 // with another runner's label included (#189). After a pass, the storage must release once the foreign keeper is
25862586 // gone, so its failure fails the test. The sweep may take up to 5.5 minutes, which the test's budget allows for.
0 commit comments