@@ -3,9 +3,11 @@ import type { DeviceInfo } from '@agent-device/kernel/device';
33import { bindAndroidAdbHostStub } from './adb-host.fixtures.ts' ;
44import {
55 createLocalAndroidAdbProvider ,
6+ createDeviceAdbExecutor ,
67 resolveAndroidAdbExecutor ,
78 resolveAndroidAdbProvider ,
89 resolveAndroidTextInjector ,
10+ resolveAndroidTouchProvider ,
911 resolveScopedAndroidAdbBackgroundTransport ,
1012 withAndroidAdbProvider ,
1113} from './adb-provider-scope.ts' ;
@@ -95,7 +97,7 @@ test('the installed override routes only normalized device-scoped adb calls to t
9597 expect ( providerCalls ) . toEqual ( [ [ 'shell' , 'ls' ] ] ) ;
9698} ) ;
9799
98- test ( 'a managed port scope routes host adb and matching serial calls to its private server ' , async ( ) => {
100+ test ( 'a managed port scope rejects foreign serials before host adb execution ' , async ( ) => {
99101 const hostCalls : Array < { args : string [ ] ; serverPort ?: number } > = [ ] ;
100102 bindAndroidAdbHostStub ( {
101103 execHostAdb : async ( args , options ) => {
@@ -109,16 +111,19 @@ test('a managed port scope routes host adb and matching serial calls to its priv
109111 { serial : DEVICE . id , serverPort : 15_037 } ,
110112 async ( ) => {
111113 await runAndroidHostAdb ( [ 'devices' ] ) ;
114+ await runAndroidHostAdb ( [ 'shell' , 'id' ] , { env : { ANDROID_SERIAL : OTHER . id } } ) ;
112115 await runAndroidHostAdb ( [ '-s' , DEVICE . id , 'shell' , 'getprop' ] ) ;
113- await runAndroidHostAdb ( [ '-s' , OTHER . id , 'shell' , 'getprop' ] ) ;
116+ await expect ( runAndroidHostAdb ( [ '-s' , OTHER . id , 'shell' , 'getprop' ] ) ) . rejects . toMatchObject ( {
117+ details : { reason : 'managed-device-transport-mismatch' } ,
118+ } ) ;
114119 } ,
115120 ) ;
116121 await runAndroidHostAdb ( [ 'devices' ] ) ;
117122
118123 expect ( hostCalls ) . toEqual ( [
119- { args : [ 'devices' ] , serverPort : 15_037 } ,
124+ { args : [ '-s' , DEVICE . id , 'devices' ] , serverPort : 15_037 } ,
125+ { args : [ '-s' , DEVICE . id , 'shell' , 'id' ] , serverPort : 15_037 } ,
120126 { args : [ '-s' , DEVICE . id , 'shell' , 'getprop' ] , serverPort : 15_037 } ,
121- { args : [ '-s' , OTHER . id , 'shell' , 'getprop' ] } ,
122127 { args : [ 'devices' ] } ,
123128 ] ) ;
124129} ) ;
@@ -155,7 +160,9 @@ test('a managed port scope classifies absolute adb commands and preserves the de
155160 [ '-s' , DEVICE . id , 'shell' , 'ls' ] ,
156161 { } ,
157162 ) ;
158- expect ( captured ?.( 'adb' , [ '-s' , OTHER . id , 'shell' , 'ls' ] , { } ) ) . toBeUndefined ( ) ;
163+ expect ( ( ) => captured ?.( 'adb' , [ '-s' , OTHER . id , 'shell' , 'ls' ] , { } ) ) . toThrowError (
164+ expect . objectContaining ( { details : { reason : 'managed-device-transport-mismatch' } } ) ,
165+ ) ;
159166 expect ( captured ?.( 'emulator' , [ '-list-avds' ] , { } ) ) . toBeUndefined ( ) ;
160167 expect ( global ) . toBeDefined ( ) ;
161168 expect ( matching ) . toBeDefined ( ) ;
@@ -164,10 +171,69 @@ test('a managed port scope classifies absolute adb commands and preserves the de
164171 } ,
165172 ) ;
166173
167- expect ( hostCalls ) . toEqual ( [ [ 'devices' , '-l' ] ] ) ;
174+ expect ( hostCalls ) . toEqual ( [ [ '-s' , DEVICE . id , ' devices', '-l' ] ] ) ;
168175 expect ( providerCalls ) . toEqual ( [ [ 'shell' , 'ls' ] ] ) ;
169176} ) ;
170177
178+ test ( 'managed port scopes refuse foreign device resolvers before returning a local transport' , async ( ) => {
179+ bindAndroidAdbHostStub ( ) ;
180+ await withAndroidAdbProvider (
181+ { exec : async ( ) => ok ( ) } ,
182+ { serial : DEVICE . id , serverPort : 15_037 } ,
183+ async ( ) => {
184+ for ( const resolve of [
185+ resolveAndroidAdbExecutor ,
186+ resolveAndroidAdbProvider ,
187+ resolveScopedAndroidAdbBackgroundTransport ,
188+ resolveAndroidTextInjector ,
189+ resolveAndroidTouchProvider ,
190+ ] ) {
191+ expect ( ( ) => resolve ( OTHER ) ) . toThrowError (
192+ expect . objectContaining ( { details : { reason : 'managed-device-transport-mismatch' } } ) ,
193+ ) ;
194+ }
195+ } ,
196+ ) ;
197+ } ) ;
198+
199+ test ( 'private-port execution contains local transports constructed before entering the scope' , async ( ) => {
200+ const calls : Array < { serial : string ; serverPort ?: number } > = [ ] ;
201+ bindAndroidAdbHostStub ( {
202+ execSerialAdb : async ( serial , _args , options ) => {
203+ calls . push ( { serial, serverPort : options ?. serverPort } ) ;
204+ return ok ( ) ;
205+ } ,
206+ spawnSerialAdb : ( serial , _args , options ) => {
207+ calls . push ( { serial, serverPort : options ?. serverPort } ) ;
208+ return undefined as never ;
209+ } ,
210+ } ) ;
211+ const matching = createLocalAndroidAdbProvider ( DEVICE ) ;
212+ const foreign = createLocalAndroidAdbProvider ( OTHER ) ;
213+ const wrongPort = createDeviceAdbExecutor ( DEVICE , { serverPort : 15_038 } ) ;
214+ await withAndroidAdbProvider (
215+ { exec : async ( ) => ok ( ) } ,
216+ { serial : DEVICE . id , serverPort : 15_037 } ,
217+ async ( ) => {
218+ await matching . exec ( [ 'shell' , 'id' ] ) ;
219+ matching . spawn ?.( [ 'logcat' ] ) ;
220+ await expect ( foreign . exec ( [ 'shell' , 'id' ] ) ) . rejects . toMatchObject ( {
221+ details : { reason : 'managed-device-transport-mismatch' } ,
222+ } ) ;
223+ expect ( ( ) => foreign . spawn ?.( [ 'logcat' ] ) ) . toThrowError (
224+ expect . objectContaining ( { details : { reason : 'managed-device-transport-mismatch' } } ) ,
225+ ) ;
226+ await expect ( wrongPort ( [ 'shell' , 'id' ] ) ) . rejects . toMatchObject ( {
227+ details : { reason : 'managed-device-transport-mismatch' } ,
228+ } ) ;
229+ } ,
230+ ) ;
231+ expect ( calls ) . toEqual ( [
232+ { serial : DEVICE . id , serverPort : 15_037 } ,
233+ { serial : DEVICE . id , serverPort : 15_037 } ,
234+ ] ) ;
235+ } ) ;
236+
171237test ( 'a managed port scope keeps shell -s arguments on the private transport' , async ( ) => {
172238 const hostCalls : Array < { args : string [ ] ; serverPort ?: number } > = [ ] ;
173239 let captured :
@@ -196,8 +262,8 @@ test('a managed port scope keeps shell -s arguments on the private transport', a
196262 ) ;
197263
198264 expect ( hostCalls ) . toEqual ( [
199- { args : [ 'shell' , 'echo' , '-s' , OTHER . id ] , serverPort : 15_037 } ,
200- { args : [ 'shell' , 'echo' , '-s' , OTHER . id ] , serverPort : 15_037 } ,
265+ { args : [ '-s' , DEVICE . id , ' shell', 'echo' , '-s' , OTHER . id ] , serverPort : 15_037 } ,
266+ { args : [ '-s' , DEVICE . id , ' shell', 'echo' , '-s' , OTHER . id ] , serverPort : 15_037 } ,
201267 ] ) ;
202268} ) ;
203269
0 commit comments