github.com/GoogleCloudPlatform/compute-image-tools/cli_tools@v0.0.0-20240516224744-de2dabc4ed1b/gce_windows_upgrade/upgrader/upgrader_test.go (about) 1 // Copyright 2020 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package upgrader 16 17 import ( 18 "fmt" 19 "testing" 20 21 "github.com/GoogleCloudPlatform/compute-image-tools/cli_tools/common/utils/daisyutils" 22 23 "github.com/stretchr/testify/assert" 24 ) 25 26 func init() { 27 initTest() 28 } 29 30 type TestUpgrader struct { 31 *upgrader 32 } 33 34 func TestUpgraderRunFailedOnInit(t *testing.T) { 35 tu := initTestUpgrader(t) 36 tu.initFn = nil 37 tu.Oauth = "bad-oauth" 38 39 err := tu.run() 40 assert.EqualError(t, err, "Failed to create GCE client: error creating HTTP API client: cannot read credentials file: open bad-oauth: no such file or directory") 41 } 42 43 func TestUpgraderRunFailedOnValidateParams(t *testing.T) { 44 tu := initTestUpgrader(t) 45 tu.validateAndDeriveParamsFn = func() error { 46 return fmt.Errorf("failed") 47 } 48 49 err := tu.run() 50 assert.EqualError(t, err, "failed") 51 } 52 53 func TestUpgraderRunFailedOnPrintUpgradeGuide(t *testing.T) { 54 tu := initTestUpgrader(t) 55 tu.printIntroHelpTextFn = func() error { 56 return fmt.Errorf("failed") 57 } 58 59 err := tu.run() 60 assert.EqualError(t, err, "failed") 61 } 62 63 func TestUpgraderRunFailedOnPrepare(t *testing.T) { 64 tu := initTestUpgrader(t) 65 tu.prepareFn = func() (daisyutils.DaisyWorker, error) { 66 return nil, fmt.Errorf("failed") 67 } 68 tu.cleanupFn = func() (daisyutils.DaisyWorker, error) { 69 return nil, nil 70 } 71 72 err := tu.run() 73 assert.EqualError(t, err, "failed") 74 } 75 76 func TestUpgraderRunFailedOnUpgrade(t *testing.T) { 77 tu := initTestUpgrader(t) 78 tu.upgradeFn = func() (daisyutils.DaisyWorker, error) { 79 return nil, fmt.Errorf("failed") 80 } 81 tu.cleanupFn = func() (daisyutils.DaisyWorker, error) { 82 return nil, nil 83 } 84 85 err := tu.run() 86 assert.EqualError(t, err, "failed") 87 } 88 89 func TestUpgraderRunFailedOnReboot(t *testing.T) { 90 tu := initTestUpgrader(t) 91 tu.upgradeFn = func() (daisyutils.DaisyWorker, error) { 92 return nil, fmt.Errorf("Windows needs to be restarted") 93 } 94 tu.rebootFn = func() (daisyutils.DaisyWorker, error) { 95 return nil, fmt.Errorf("failed") 96 } 97 tu.cleanupFn = func() (daisyutils.DaisyWorker, error) { 98 return nil, nil 99 } 100 101 err := tu.run() 102 assert.EqualError(t, err, "failed") 103 } 104 105 func TestUpgraderRunFailedOnRetryUpgrade(t *testing.T) { 106 tu := initTestUpgrader(t) 107 tu.upgradeFn = func() (daisyutils.DaisyWorker, error) { 108 return nil, fmt.Errorf("Windows needs to be restarted") 109 } 110 tu.rebootFn = func() (daisyutils.DaisyWorker, error) { 111 return nil, nil 112 } 113 tu.retryUpgradeFn = func() (daisyutils.DaisyWorker, error) { 114 return nil, fmt.Errorf("failed") 115 } 116 tu.cleanupFn = func() (daisyutils.DaisyWorker, error) { 117 return nil, nil 118 } 119 120 err := tu.run() 121 assert.EqualError(t, err, "failed") 122 } 123 124 func TestUpgraderRunSuccessWithoutReboot(t *testing.T) { 125 tu := initTestUpgrader(t) 126 127 err := tu.run() 128 assert.NoError(t, err) 129 } 130 131 func TestUpgraderRunSuccessWithReboot(t *testing.T) { 132 tu := initTestUpgrader(t) 133 tu.upgradeFn = func() (daisyutils.DaisyWorker, error) { 134 return nil, fmt.Errorf("Windows needs to be restarted") 135 } 136 tu.rebootFn = func() (daisyutils.DaisyWorker, error) { 137 return nil, nil 138 } 139 tu.retryUpgradeFn = func() (daisyutils.DaisyWorker, error) { 140 return nil, nil 141 } 142 143 err := tu.run() 144 assert.NoError(t, err) 145 } 146 147 func TestUpgraderRunFailedWithAutoRollback(t *testing.T) { 148 tu := initTestUpgrader(t) 149 tu.prepareFn = func() (daisyutils.DaisyWorker, error) { 150 // Test workaround: let newOSDiskName to be the same as current disk name 151 // in order to trigger auto rollback. 152 tu.newOSDiskName = testDisk 153 return nil, fmt.Errorf("failed") 154 } 155 tu.AutoRollback = true 156 rollbackExecuted := false 157 tu.rollbackFn = func() (daisyutils.DaisyWorker, error) { 158 rollbackExecuted = true 159 return nil, nil 160 } 161 tu.cleanupFn = func() (daisyutils.DaisyWorker, error) { 162 t.Errorf("Unexpected cleanup.") 163 return nil, nil 164 } 165 166 err := tu.run() 167 assert.EqualError(t, err, "failed") 168 assert.True(t, rollbackExecuted, "Rollback not executed.") 169 } 170 171 func TestUpgraderRunFailedWithAutoRollbackFailed(t *testing.T) { 172 tu := initTestUpgrader(t) 173 tu.prepareFn = func() (daisyutils.DaisyWorker, error) { 174 // Test workaround: let newOSDiskName to be the same as current disk name 175 // in order to trigger auto rollback. 176 tu.newOSDiskName = testDisk 177 return nil, fmt.Errorf("failed1") 178 } 179 tu.AutoRollback = true 180 rollbackExecuted := false 181 tu.rollbackFn = func() (daisyutils.DaisyWorker, error) { 182 rollbackExecuted = true 183 return nil, fmt.Errorf("failed2") 184 } 185 186 err := tu.run() 187 assert.EqualError(t, err, "failed1") 188 assert.True(t, rollbackExecuted, "Rollback not executed.") 189 } 190 191 func TestUpgraderRunFailedWithAutoRollbackWithoutNewOSDiskAttached(t *testing.T) { 192 tu := initTestUpgrader(t) 193 tu.prepareFn = func() (daisyutils.DaisyWorker, error) { 194 return nil, fmt.Errorf("failed1") 195 } 196 tu.AutoRollback = true 197 cleanupExecuted := false 198 tu.cleanupFn = func() (daisyutils.DaisyWorker, error) { 199 cleanupExecuted = true 200 return nil, fmt.Errorf("failed2") 201 } 202 err := tu.run() 203 assert.EqualError(t, err, "failed1") 204 assert.True(t, cleanupExecuted, "Cleanup not executed.") 205 } 206 207 func initTestUpgrader(t *testing.T) *TestUpgrader { 208 tu := newTestUpgrader() 209 tu.initFn = func() error { 210 computeClient = newTestGCEClient() 211 return nil 212 } 213 tu.prepareFn = func() (worker daisyutils.DaisyWorker, e error) { 214 // Test workaround: let newOSDiskName to be the same as current disk name 215 // in order to pretend the enw OS disk has been attached. 216 tu.newOSDiskName = testDisk 217 return nil, nil 218 } 219 tu.upgradeFn = func() (worker daisyutils.DaisyWorker, e error) { 220 return nil, nil 221 } 222 tu.rebootFn = func() (worker daisyutils.DaisyWorker, e error) { 223 t.Errorf("Unexpected reboot.") 224 return nil, nil 225 } 226 tu.retryUpgradeFn = func() (worker daisyutils.DaisyWorker, e error) { 227 t.Errorf("Unexpected retryUpgrade.") 228 return nil, nil 229 } 230 tu.cleanupFn = func() (worker daisyutils.DaisyWorker, e error) { 231 t.Errorf("Unexpected cleanup.") 232 return nil, nil 233 } 234 tu.rollbackFn = func() (worker daisyutils.DaisyWorker, e error) { 235 t.Errorf("Unexpected rollback.") 236 return nil, nil 237 } 238 return tu 239 }