@@ -179,6 +179,88 @@ func TestEngineCloseDoesNotCleanInjectedNetwork(t *testing.T) {
179179 }
180180}
181181
182+ func TestEngineNetworkOwnershipFollowsLastOption (t * testing.T ) {
183+ t .Parallel ()
184+
185+ tests := []struct {
186+ name string
187+ managedLast bool
188+ }{
189+ {name : "network options last" , managedLast : true },
190+ {name : "injected network last" , managedLast : false },
191+ }
192+
193+ for _ , tt := range tests {
194+ t .Run (tt .name , func (t * testing.T ) {
195+ t .Parallel ()
196+
197+ managedClient := & recordingHTTPClient {}
198+ injectedClient := & recordingHTTPClient {}
199+ injectedNetwork := mustNewTestNetwork (t , ferretnet .WithHTTPClient (injectedClient ))
200+
201+ var setters []Option
202+ if tt .managedLast {
203+ setters = []Option {
204+ WithNetwork (injectedNetwork ),
205+ WithNetworkOptions (ferretnet .WithHTTPClient (managedClient )),
206+ }
207+ } else {
208+ setters = []Option {
209+ WithNetworkOptions (ferretnet .WithHTTPClient (managedClient )),
210+ WithNetwork (injectedNetwork ),
211+ }
212+ }
213+
214+ eng := mustNewEngine (t , setters ... )
215+ if tt .managedLast {
216+ if got := eng .host .network .HTTP (); got != managedClient {
217+ t .Fatalf ("expected network options client, got %T" , got )
218+ }
219+ } else if eng .host .network != injectedNetwork {
220+ t .Fatalf ("expected injected network, got %T" , eng .host .network )
221+ }
222+
223+ if err := eng .Close (); err != nil {
224+ t .Fatalf ("close engine: %v" , err )
225+ }
226+
227+ wantManagedCloses := 0
228+ if tt .managedLast {
229+ wantManagedCloses = 1
230+ }
231+
232+ if got := managedClient .idleCloseCount (); got != wantManagedCloses {
233+ t .Fatalf ("expected %d managed network cleanup calls, got %d" , wantManagedCloses , got )
234+ }
235+
236+ if got := injectedClient .idleCloseCount (); got != 0 {
237+ t .Fatalf ("expected injected network to remain caller-owned, got %d cleanup calls" , got )
238+ }
239+ })
240+ }
241+ }
242+
243+ func TestNewCleansNetworkCreatedFromOptionsOnInitFailure (t * testing.T ) {
244+ t .Parallel ()
245+
246+ initErr := errors .New ("init failed" )
247+ client := & recordingHTTPClient {}
248+
249+ _ , err := New (
250+ WithNetworkOptions (ferretnet .WithHTTPClient (client )),
251+ WithEngineInitHook (func () error {
252+ return initErr
253+ }),
254+ )
255+ if ! errors .Is (err , initErr ) {
256+ t .Fatalf ("expected init error, got %v" , err )
257+ }
258+
259+ if got := client .idleCloseCount (); got != 1 {
260+ t .Fatalf ("expected construction-failure cleanup, got %d calls" , got )
261+ }
262+ }
263+
182264func TestNewCleansOwnedNetworkOnRegistrationFailure (t * testing.T ) {
183265 t .Parallel ()
184266
0 commit comments