@@ -81,6 +81,143 @@ func TestExplainSuspendedMirror(t *testing.T) {
8181 })
8282}
8383
84+ // TestFinishMirrorCreate exercises the post-create branching: when the
85+ // upstream is empty we must skip the HEAD-poll loop (an empty repo never
86+ // advertises a HEAD), yet an *existing* empty placement must still go through
87+ // the token exchange so a suspended mirror surfaces its resume guidance
88+ // instead of a success-style "nothing to clone" note.
89+ func TestFinishMirrorCreate (t * testing.T ) {
90+ t .Parallel ()
91+
92+ const id = "01KS6KFJR2XS6PZ188MVYE07AN"
93+ const mirrorURL = "entire://eu-west-1.entire.io/gh/octocat/hello-world"
94+ // The error shape RepoScopedToken/waitForMirrorClone produce for a
95+ // suspended (non-servable) placement.
96+ suspended := fmt .Errorf ("repo-scoped token exchange: %w" , auth .ErrRepoTargetUnknown )
97+
98+ // seen records whether each injected operation ran, so we can assert the
99+ // empty path never polls and a fresh create never probes.
100+ type call struct { probed , waited bool }
101+
102+ t .Run ("fresh empty create skips both probe and poll" , func (t * testing.T ) {
103+ t .Parallel ()
104+ var seen call
105+ var out , errW bytes.Buffer
106+ created := & coreapi.CreatedMirror {Created : true , Empty : true , MirrorId : id , MirrorUrl : mirrorURL }
107+ err := finishMirrorCreate (& out , & errW , created , false ,
108+ func () error { seen .probed = true ; return nil },
109+ func () error { seen .waited = true ; return nil },
110+ )
111+ require .NoError (t , err )
112+ require .False (t , seen .probed , "a fresh create can't be suspended; must not probe" )
113+ require .False (t , seen .waited , "empty upstream has nothing to clone; must not poll" )
114+ require .Contains (t , out .String (), "nothing to clone" )
115+ require .Empty (t , errW .String ())
116+ })
117+
118+ t .Run ("existing empty healthy probes but does not poll" , func (t * testing.T ) {
119+ t .Parallel ()
120+ var seen call
121+ var out , errW bytes.Buffer
122+ created := & coreapi.CreatedMirror {Created : false , Empty : true , MirrorId : id , MirrorUrl : mirrorURL }
123+ err := finishMirrorCreate (& out , & errW , created , false ,
124+ func () error { seen .probed = true ; return nil },
125+ func () error { seen .waited = true ; return nil },
126+ )
127+ require .NoError (t , err )
128+ require .True (t , seen .probed , "existing empty placement must probe for suspension" )
129+ require .False (t , seen .waited , "empty upstream has nothing to clone; must not poll" )
130+ require .Contains (t , out .String (), "nothing to clone" )
131+ })
132+
133+ t .Run ("existing empty suspended surfaces resume guidance" , func (t * testing.T ) {
134+ t .Parallel ()
135+ var seen call
136+ var out , errW bytes.Buffer
137+ created := & coreapi.CreatedMirror {Created : false , Empty : true , MirrorId : id , MirrorUrl : mirrorURL }
138+ err := finishMirrorCreate (& out , & errW , created , false ,
139+ func () error { seen .probed = true ; return suspended },
140+ func () error { seen .waited = true ; return nil },
141+ )
142+ var silent * SilentError
143+ require .ErrorAs (t , err , & silent , "suspended mirror must return a SilentError" )
144+ require .True (t , seen .probed )
145+ require .False (t , seen .waited , "must not poll a suspended empty mirror" )
146+ require .Contains (t , errW .String (), "entire-core admin mirrors resume " + id )
147+ require .NotContains (t , out .String (), "nothing to clone" ,
148+ "a suspended mirror must not get the success-style empty note" )
149+ })
150+
151+ t .Run ("existing empty transient probe error is non-fatal" , func (t * testing.T ) {
152+ t .Parallel ()
153+ var out , errW bytes.Buffer
154+ created := & coreapi.CreatedMirror {Created : false , Empty : true , MirrorId : id , MirrorUrl : mirrorURL }
155+ err := finishMirrorCreate (& out , & errW , created , false ,
156+ func () error { return errors .New ("dial tcp: connection refused" ) },
157+ func () error { t .Fatal ("must not poll an empty mirror" ); return nil },
158+ )
159+ require .NoError (t , err , "a non-suspension probe error must not fail a create whose placement exists" )
160+ require .Contains (t , out .String (), "nothing to clone" )
161+ })
162+
163+ t .Run ("non-empty no-wait skips both probe and poll" , func (t * testing.T ) {
164+ t .Parallel ()
165+ var seen call
166+ var out , errW bytes.Buffer
167+ created := & coreapi.CreatedMirror {Created : true , Empty : false , MirrorId : id , MirrorUrl : mirrorURL }
168+ err := finishMirrorCreate (& out , & errW , created , true ,
169+ func () error { seen .probed = true ; return nil },
170+ func () error { seen .waited = true ; return nil },
171+ )
172+ require .NoError (t , err )
173+ require .False (t , seen .probed )
174+ require .False (t , seen .waited , "--no-wait must not poll" )
175+ require .Contains (t , out .String (), "still be in progress" )
176+ })
177+
178+ t .Run ("non-empty waits for clone then prints clone hint" , func (t * testing.T ) {
179+ t .Parallel ()
180+ var seen call
181+ var out , errW bytes.Buffer
182+ created := & coreapi.CreatedMirror {Created : true , Empty : false , MirrorId : id , MirrorUrl : mirrorURL }
183+ err := finishMirrorCreate (& out , & errW , created , false ,
184+ func () error { seen .probed = true ; return nil },
185+ func () error { seen .waited = true ; return nil },
186+ )
187+ require .NoError (t , err )
188+ require .False (t , seen .probed , "non-empty path detects suspension through waitClone, not a separate probe" )
189+ require .True (t , seen .waited )
190+ require .Contains (t , out .String (), "git clone " + mirrorURL )
191+ })
192+
193+ t .Run ("non-empty existing suspended surfaces resume guidance" , func (t * testing.T ) {
194+ t .Parallel ()
195+ var out , errW bytes.Buffer
196+ created := & coreapi.CreatedMirror {Created : false , Empty : false , MirrorId : id , MirrorUrl : mirrorURL }
197+ err := finishMirrorCreate (& out , & errW , created , false ,
198+ func () error { return nil },
199+ func () error { return suspended },
200+ )
201+ var silent * SilentError
202+ require .ErrorAs (t , err , & silent )
203+ require .Contains (t , errW .String (), "entire-core admin mirrors resume " + id )
204+ require .NotContains (t , out .String (), "git clone" )
205+ })
206+
207+ t .Run ("non-empty wait error other than suspension propagates" , func (t * testing.T ) {
208+ t .Parallel ()
209+ var out , errW bytes.Buffer
210+ created := & coreapi.CreatedMirror {Created : true , Empty : false , MirrorId : id , MirrorUrl : mirrorURL }
211+ wantErr := errors .New ("timed out waiting for initial clone" )
212+ err := finishMirrorCreate (& out , & errW , created , false ,
213+ func () error { return nil },
214+ func () error { return wantErr },
215+ )
216+ require .ErrorIs (t , err , wantErr )
217+ require .Empty (t , errW .String ())
218+ })
219+ }
220+
84221// TestParseGitHubURL is ported from entiredb's cmd/entire-repo/cli
85222// mirror_test.go, since parseGitHubURL was carried over verbatim.
86223func TestParseGitHubURL (t * testing.T ) {
0 commit comments