github.com/itscaro/cli@v0.0.0-20190705081621-c9db0fe93829/cli/command/trust/revoke_test.go (about) 1 package trust 2 3 import ( 4 "io/ioutil" 5 "os" 6 "testing" 7 8 "github.com/docker/cli/cli/trust" 9 "github.com/docker/cli/internal/test" 10 "github.com/docker/cli/internal/test/notary" 11 "github.com/theupdateframework/notary/client" 12 "github.com/theupdateframework/notary/passphrase" 13 "github.com/theupdateframework/notary/trustpinning" 14 "gotest.tools/assert" 15 is "gotest.tools/assert/cmp" 16 ) 17 18 func TestTrustRevokeCommandErrors(t *testing.T) { 19 testCases := []struct { 20 name string 21 args []string 22 expectedError string 23 }{ 24 { 25 name: "not-enough-args", 26 expectedError: "requires exactly 1 argument", 27 }, 28 { 29 name: "too-many-args", 30 args: []string{"remote1", "remote2"}, 31 expectedError: "requires exactly 1 argument", 32 }, 33 { 34 name: "sha-reference", 35 args: []string{"870d292919d01a0af7e7f056271dc78792c05f55f49b9b9012b6d89725bd9abd"}, 36 expectedError: "invalid repository name", 37 }, 38 { 39 name: "invalid-img-reference", 40 args: []string{"ALPINE"}, 41 expectedError: "invalid reference format", 42 }, 43 { 44 name: "digest-reference", 45 args: []string{"ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2"}, 46 expectedError: "cannot use a digest reference for IMAGE:TAG", 47 }, 48 } 49 for _, tc := range testCases { 50 cmd := newRevokeCommand( 51 test.NewFakeCli(&fakeClient{})) 52 cmd.SetArgs(tc.args) 53 cmd.SetOutput(ioutil.Discard) 54 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 55 } 56 } 57 58 func TestTrustRevokeCommand(t *testing.T) { 59 testCases := []struct { 60 doc string 61 notaryRepository func(trust.ImageRefAndAuth, []string) (client.Repository, error) 62 args []string 63 expectedErr string 64 expectedMessage string 65 }{ 66 { 67 doc: "OfflineErrors_Confirm", 68 notaryRepository: notary.GetOfflineNotaryRepository, 69 args: []string{"reg-name.io/image"}, 70 expectedMessage: "Please confirm you would like to delete all signature data for reg-name.io/image? [y/N] \nAborting action.", 71 }, 72 { 73 doc: "OfflineErrors_Offline", 74 notaryRepository: notary.GetOfflineNotaryRepository, 75 args: []string{"reg-name.io/image", "-y"}, 76 expectedErr: "could not remove signature for reg-name.io/image: client is offline", 77 }, 78 { 79 doc: "OfflineErrors_WithTag_Offline", 80 notaryRepository: notary.GetOfflineNotaryRepository, 81 args: []string{"reg-name.io/image:tag"}, 82 expectedErr: "could not remove signature for reg-name.io/image:tag: client is offline", 83 }, 84 { 85 doc: "UninitializedErrors_Confirm", 86 notaryRepository: notary.GetUninitializedNotaryRepository, 87 args: []string{"reg-name.io/image"}, 88 expectedMessage: "Please confirm you would like to delete all signature data for reg-name.io/image? [y/N] \nAborting action.", 89 }, 90 { 91 doc: "UninitializedErrors_NoTrustData", 92 notaryRepository: notary.GetUninitializedNotaryRepository, 93 args: []string{"reg-name.io/image", "-y"}, 94 expectedErr: "could not remove signature for reg-name.io/image: does not have trust data for", 95 }, 96 { 97 doc: "UninitializedErrors_WithTag_NoTrustData", 98 notaryRepository: notary.GetUninitializedNotaryRepository, 99 args: []string{"reg-name.io/image:tag"}, 100 expectedErr: "could not remove signature for reg-name.io/image:tag: does not have trust data for", 101 }, 102 { 103 doc: "EmptyNotaryRepo_Confirm", 104 notaryRepository: notary.GetEmptyTargetsNotaryRepository, 105 args: []string{"reg-name.io/image"}, 106 expectedMessage: "Please confirm you would like to delete all signature data for reg-name.io/image? [y/N] \nAborting action.", 107 }, 108 { 109 doc: "EmptyNotaryRepo_NoSignedTags", 110 notaryRepository: notary.GetEmptyTargetsNotaryRepository, 111 args: []string{"reg-name.io/image", "-y"}, 112 expectedErr: "could not remove signature for reg-name.io/image: no signed tags to remove", 113 }, 114 { 115 doc: "EmptyNotaryRepo_NoValidTrustData", 116 notaryRepository: notary.GetEmptyTargetsNotaryRepository, 117 args: []string{"reg-name.io/image:tag"}, 118 expectedErr: "could not remove signature for reg-name.io/image:tag: No valid trust data for tag", 119 }, 120 { 121 doc: "AllSigConfirmation", 122 notaryRepository: notary.GetEmptyTargetsNotaryRepository, 123 args: []string{"alpine"}, 124 expectedMessage: "Please confirm you would like to delete all signature data for alpine? [y/N] \nAborting action.", 125 }, 126 } 127 128 for _, tc := range testCases { 129 t.Run(tc.doc, func(t *testing.T) { 130 cli := test.NewFakeCli(&fakeClient{}) 131 cli.SetNotaryClient(tc.notaryRepository) 132 cmd := newRevokeCommand(cli) 133 cmd.SetArgs(tc.args) 134 cmd.SetOutput(ioutil.Discard) 135 if tc.expectedErr != "" { 136 assert.ErrorContains(t, cmd.Execute(), tc.expectedErr) 137 return 138 } 139 assert.NilError(t, cmd.Execute()) 140 assert.Check(t, is.Contains(cli.OutBuffer().String(), tc.expectedMessage)) 141 }) 142 } 143 144 } 145 146 func TestGetSignableRolesForTargetAndRemoveError(t *testing.T) { 147 tmpDir, err := ioutil.TempDir("", "notary-test-") 148 assert.NilError(t, err) 149 defer os.RemoveAll(tmpDir) 150 151 notaryRepo, err := client.NewFileCachedRepository(tmpDir, "gun", "https://localhost", nil, passphrase.ConstantRetriever("password"), trustpinning.TrustPinConfig{}) 152 assert.NilError(t, err) 153 target := client.Target{} 154 err = getSignableRolesForTargetAndRemove(target, notaryRepo) 155 assert.Error(t, err, "client is offline") 156 }