@@ -18,6 +18,7 @@ limitations under the License.
1818
1919import (
2020 "context"
21+ "crypto/rand"
2122 "crypto/x509"
2223 "net/http"
2324 "net/http/httptest"
@@ -304,10 +305,27 @@ func TestRegister_LaterSessionRetiresTheEarlierAndMustReconfirm(t *testing.T) {
304305 }
305306}
306307
308+ // A new session probes for the current registration. With nothing
309+ // registered that is an empty preview, not a refusal, and it spends no
310+ // rate-limit budget, so restarting first run costs the token holder nothing.
311+ // Confirming a CA that isn't registered is still refused.
307312func TestRegister_NothingRegisteredToPreview (t * testing.T ) {
308313 h := newHarness (t )
309314 secret := h .startSession ()
310- _ , err := h .register (secret , & fleetv1.BootstrapServiceRegisterOperatorCARequest {})
315+ for i := 0 ; i < 10 ; i ++ {
316+ resp , err := h .register (secret , & fleetv1.BootstrapServiceRegisterOperatorCARequest {})
317+ if err != nil {
318+ t .Fatalf ("preview %d with nothing registered: %v" , i + 1 , err )
319+ }
320+ if resp .GetOperatorCa () != nil || resp .GetConfirmed () {
321+ t .Fatalf ("preview with nothing registered = %+v, want empty" , resp )
322+ }
323+ }
324+ bad , _ := NewToken (rand .Reader )
325+ _ , err := h .client ().StartBootstrapSession (h .ctx , connect .NewRequest (& fleetv1.StartBootstrapSessionRequest {Token : bad }))
326+ wantCode (t , err , apperr .CodeTokenInvalid , "" ) // not 1602: the previews spent nothing
327+
328+ _ , err = h .register (secret , & fleetv1.BootstrapServiceRegisterOperatorCARequest {ConfirmSha256 : strings .Repeat ("ab" , 32 )})
311329 wantCode (t , err , apperr .CodeOperatorCARejected , "NOT_CONFIRMED" )
312330 if connect .CodeOf (err ) != connect .CodeFailedPrecondition {
313331 t .Errorf ("Connect code %v, want FailedPrecondition" , connect .CodeOf (err ))
0 commit comments