6
6
"encoding/base64"
7
7
"io/fs"
8
8
"io/ioutil"
9
+ "net"
9
10
"net/http"
10
11
"os"
11
12
"strings"
@@ -121,6 +122,96 @@ func Test_updater_run(t *testing.T) {
121
122
assert .ErrorContains (t , "update coder - user cancelled" , err , "failed to confirm update" )
122
123
assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
123
124
})
125
+
126
+ run (t , "update coder - cannot stat" , func (t * testing.T , p * params ) {
127
+ u := fromParams (p )
128
+ err := u .Run (p .Ctx , false , fakeCoderURL )
129
+ assert .ErrorContains (t , "update coder - cannot stat" , err , "cannot stat current binary" )
130
+ })
131
+
132
+ run (t , "update coder - no permission" , func (t * testing.T , p * params ) {
133
+ fakeFile (t , p .Fakefs , fakeExePath , 0400 , fakeOldVersion )
134
+ u := fromParams (p )
135
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
136
+ err := u .Run (p .Ctx , false , fakeCoderURL )
137
+ assert .ErrorContains (t , "update coder - no permission" , err , "missing write permission" )
138
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
139
+ })
140
+
141
+ run (t , "update coder - invalid url" , func (t * testing.T , p * params ) {
142
+ fakeFile (t , p .Fakefs , fakeExePath , 0755 , fakeOldVersion )
143
+ p .VersionF = func () string { return fakeOldVersion }
144
+ u := fromParams (p )
145
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
146
+ err := u .Run (p .Ctx , false , "h$$p://invalid.url" )
147
+ assert .ErrorContains (t , "update coder - invalid url" , err , "invalid coder URL" )
148
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
149
+ })
150
+
151
+ run (t , "update coder - fetch api version failure" , func (t * testing.T , p * params ) {
152
+ fakeFile (t , p .Fakefs , fakeExePath , 0755 , fakeOldVersion )
153
+ p .HttpClient .M [fakeCoderURL + "/api" ] = newFakeGetterResponse ([]byte {}, 401 , variadicS (), net .ErrClosed )
154
+ p .VersionF = func () string { return fakeOldVersion }
155
+ u := fromParams (p )
156
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
157
+ err := u .Run (p .Ctx , false , fakeCoderURL )
158
+ assert .ErrorContains (t , "update coder - fetch api version failure" , err , "fetch api version" )
159
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
160
+ })
161
+
162
+ run (t , "update coder - failed to fetch URL" , func (t * testing.T , p * params ) {
163
+ fakeFile (t , p .Fakefs , fakeExePath , 0755 , fakeOldVersion )
164
+ p .HttpClient .M [fakeCoderURL + "/api" ] = newFakeGetterResponse ([]byte {}, 401 , variadicS ("coder-version: " + fakeNewVersion ), nil )
165
+ p .HttpClient .M [fakeReleaseURL ] = newFakeGetterResponse ([]byte {}, 0 , variadicS (), net .ErrClosed )
166
+ p .VersionF = func () string { return fakeOldVersion }
167
+ p .ConfirmF = fakeConfirmYes
168
+ u := fromParams (p )
169
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
170
+ err := u .Run (p .Ctx , false , fakeCoderURL )
171
+ assert .ErrorContains (t , "update coder - release URL 404" , err , "failed to fetch URL" )
172
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
173
+ })
174
+
175
+ run (t , "update coder - release URL 404" , func (t * testing.T , p * params ) {
176
+ fakeFile (t , p .Fakefs , fakeExePath , 0755 , fakeOldVersion )
177
+ p .HttpClient .M [fakeCoderURL + "/api" ] = newFakeGetterResponse ([]byte {}, 401 , variadicS ("coder-version: " + fakeNewVersion ), nil )
178
+ p .HttpClient .M [fakeReleaseURL ] = newFakeGetterResponse ([]byte {}, 404 , variadicS (), nil )
179
+ p .VersionF = func () string { return fakeOldVersion }
180
+ p .ConfirmF = fakeConfirmYes
181
+ u := fromParams (p )
182
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
183
+ err := u .Run (p .Ctx , false , fakeCoderURL )
184
+ assert .ErrorContains (t , "update coder - release URL 404" , err , "failed to fetch release" )
185
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
186
+ })
187
+
188
+ run (t , "update coder - invalid archive" , func (t * testing.T , p * params ) {
189
+ fakeFile (t , p .Fakefs , fakeExePath , 0755 , fakeOldVersion )
190
+ p .HttpClient .M [fakeCoderURL + "/api" ] = newFakeGetterResponse ([]byte {}, 401 , variadicS ("coder-version: " + fakeNewVersion ), nil )
191
+ p .HttpClient .M [fakeReleaseURL ] = newFakeGetterResponse ([]byte {}, 200 , variadicS (), nil )
192
+ p .VersionF = func () string { return fakeOldVersion }
193
+ p .ConfirmF = fakeConfirmYes
194
+ u := fromParams (p )
195
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
196
+ err := u .Run (p .Ctx , false , fakeCoderURL )
197
+ assert .ErrorContains (t , "update coder - invalid archive" , err , "failed to extract coder binary from archive" )
198
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
199
+ })
200
+
201
+ run (t , "update coder - read-only fs" , func (t * testing.T , p * params ) {
202
+ rwfs := p .Fakefs
203
+ p .Fakefs = afero .NewReadOnlyFs (rwfs )
204
+ fakeFile (t , rwfs , fakeExePath , 0755 , fakeOldVersion )
205
+ p .HttpClient .M [fakeCoderURL + "/api" ] = newFakeGetterResponse ([]byte {}, 401 , variadicS ("coder-version: " + fakeNewVersion ), nil )
206
+ p .HttpClient .M [fakeReleaseURL ] = newFakeGetterResponse (fakeValidTgzBytes , 200 , variadicS (), nil )
207
+ p .VersionF = func () string { return fakeOldVersion }
208
+ p .ConfirmF = fakeConfirmYes
209
+ u := fromParams (p )
210
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
211
+ err := u .Run (p .Ctx , false , fakeCoderURL )
212
+ assert .ErrorContains (t , "update coder - read-only fs" , err , "failed to create file" )
213
+ assertFileContent (t , p .Fakefs , fakeExePath , fakeOldVersion )
214
+ })
124
215
}
125
216
126
217
// fakeGetter mocks HTTP requests
@@ -132,6 +223,7 @@ type fakeGetter struct {
132
223
func newFakeGetter (t * testing.T ) * fakeGetter {
133
224
return & fakeGetter {
134
225
M : make (map [string ]* fakeGetterResponse ),
226
+ T : t ,
135
227
}
136
228
}
137
229
0 commit comments