@@ -20,6 +20,7 @@ describe('detectContainerRuntime', () => {
2020 mockCheckSubprocess . mockResolvedValue ( true ) ;
2121 mockRunSubprocessCapture . mockImplementation ( ( _bin : string , args : string [ ] ) => {
2222 if ( args [ 0 ] === '--version' ) return Promise . resolve ( { code : 0 , stdout : 'Docker version 24.0.0\n' , stderr : '' } ) ;
23+ if ( args [ 0 ] === 'build' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
2324 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
2425 } ) ;
2526
@@ -36,6 +37,7 @@ describe('detectContainerRuntime', () => {
3637 mockRunSubprocessCapture . mockImplementation ( ( bin : string , args : string [ ] ) => {
3738 if ( bin === 'podman' && args [ 0 ] === '--version' )
3839 return Promise . resolve ( { code : 0 , stdout : 'podman version 4.5.0\n' , stderr : '' } ) ;
40+ if ( bin === 'podman' && args [ 0 ] === 'build' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
3941 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
4042 } ) ;
4143
@@ -57,6 +59,7 @@ describe('detectContainerRuntime', () => {
5759 if ( bin === 'docker' && args [ 0 ] === '--version' ) return Promise . resolve ( { code : 1 , stdout : '' , stderr : 'error' } ) ;
5860 if ( bin === 'podman' && args [ 0 ] === '--version' )
5961 return Promise . resolve ( { code : 0 , stdout : 'podman version 4.5.0\n' , stderr : '' } ) ;
62+ if ( bin === 'podman' && args [ 0 ] === 'build' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
6063 // finch --version also fails
6164 if ( bin === 'finch' && args [ 0 ] === '--version' ) return Promise . resolve ( { code : 1 , stdout : '' , stderr : 'error' } ) ;
6265 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
@@ -71,6 +74,7 @@ describe('detectContainerRuntime', () => {
7174 mockRunSubprocessCapture . mockImplementation ( ( _bin : string , args : string [ ] ) => {
7275 if ( args [ 0 ] === '--version' )
7376 return Promise . resolve ( { code : 0 , stdout : 'Docker version 24.0.0\nExtra info line\n' , stderr : '' } ) ;
77+ if ( args [ 0 ] === 'build' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
7478 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
7579 } ) ;
7680
@@ -82,6 +86,7 @@ describe('detectContainerRuntime', () => {
8286 mockCheckSubprocess . mockResolvedValue ( true ) ;
8387 mockRunSubprocessCapture . mockImplementation ( ( _bin : string , args : string [ ] ) => {
8488 if ( args [ 0 ] === '--version' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
89+ if ( args [ 0 ] === 'build' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
8590 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
8691 } ) ;
8792
@@ -90,20 +95,30 @@ describe('detectContainerRuntime', () => {
9095 expect ( result . runtime ?. version ) . toBe ( '' ) ;
9196 } ) ;
9297
93- it ( 'does not call docker info to check daemon status ' , async ( ) => {
98+ it ( 'skips runtime when build --help check fails with non-zero exit ' , async ( ) => {
9499 mockCheckSubprocess . mockResolvedValue ( true ) ;
95100 mockRunSubprocessCapture . mockImplementation ( ( _bin : string , args : string [ ] ) => {
96- if ( args [ 0 ] === '--version' ) return Promise . resolve ( { code : 0 , stdout : 'Docker version 24.0.0\n' , stderr : '' } ) ;
101+ if ( args [ 0 ] === '--version' ) return Promise . resolve ( { code : 0 , stdout : '1.0.0\n' , stderr : '' } ) ;
102+ if ( args [ 0 ] === 'build' ) return Promise . resolve ( { code : 1 , stdout : '' , stderr : 'unknown command "build"' } ) ;
97103 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
98104 } ) ;
99105
100- await detectContainerRuntime ( ) ;
106+ const result = await detectContainerRuntime ( ) ;
107+ expect ( result . runtime ) . toBeNull ( ) ;
108+ } ) ;
109+
110+ it ( 'skips runtime when build --help exits 0 but stderr indicates unknown command (shim/wrapper)' , async ( ) => {
111+ mockCheckSubprocess . mockResolvedValue ( true ) ;
112+ mockRunSubprocessCapture . mockImplementation ( ( _bin : string , args : string [ ] ) => {
113+ // Shim exits 0 for everything but prints error to stderr
114+ if ( args [ 0 ] === '--version' ) return Promise . resolve ( { code : 0 , stdout : '1.0.0\n' , stderr : '' } ) ;
115+ if ( args [ 0 ] === 'build' )
116+ return Promise . resolve ( { code : 0 , stdout : '' , stderr : 'Error: unknown command "build" for "ada"' } ) ;
117+ return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
118+ } ) ;
101119
102- // Verify 'info' was never called — this is the key behavioral change
103- const infoCalls = mockRunSubprocessCapture . mock . calls . filter (
104- ( call : unknown [ ] ) => ( call [ 1 ] as string [ ] ) [ 0 ] === 'info'
105- ) ;
106- expect ( infoCalls ) . toHaveLength ( 0 ) ;
120+ const result = await detectContainerRuntime ( ) ;
121+ expect ( result . runtime ) . toBeNull ( ) ;
107122 } ) ;
108123} ) ;
109124
@@ -112,6 +127,7 @@ describe('requireContainerRuntime', () => {
112127 mockCheckSubprocess . mockResolvedValue ( true ) ;
113128 mockRunSubprocessCapture . mockImplementation ( ( _bin : string , args : string [ ] ) => {
114129 if ( args [ 0 ] === '--version' ) return Promise . resolve ( { code : 0 , stdout : 'Docker version 24.0.0\n' , stderr : '' } ) ;
130+ if ( args [ 0 ] === 'build' ) return Promise . resolve ( { code : 0 , stdout : '' , stderr : '' } ) ;
115131 return Promise . resolve ( { code : 1 , stdout : '' , stderr : '' } ) ;
116132 } ) ;
117133
0 commit comments