GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( b5116a...3bd38f )
by
unknown
05:35
created

entials   F

Complexity

Conditions 17

Size

Total Lines 166
Code Lines 108

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 17
eloc 108
nop 1
dl 0
loc 166
rs 1.2599
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like providers.TestECSRAMRoleCredentialsProvider_getCredentials often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
package providers
2
3
import (
4
	"errors"
5
	"testing"
6
	"time"
7
8
	httputil "github.com/aliyun/credentials-go/credentials/internal/http"
9
	"github.com/stretchr/testify/assert"
10
)
11
12
func TestNewECSRAMRoleCredentialsProvider(t *testing.T) {
13
	p, err := NewECSRAMRoleCredentialsProviderBuilder().Build()
14
	assert.Nil(t, err)
15
	assert.Equal(t, "", p.roleName)
16
	assert.Equal(t, 21600, p.metadataTokenDurationSeconds)
17
18
	_, err = NewECSRAMRoleCredentialsProviderBuilder().WithMetadataTokenDurationSeconds(1000000000).Build()
19
	assert.EqualError(t, err, "the metadata token duration seconds must be 1-21600")
20
21
	p, err = NewECSRAMRoleCredentialsProviderBuilder().WithRoleName("role").WithMetadataTokenDurationSeconds(3600).Build()
22
	assert.Nil(t, err)
23
	assert.Equal(t, "role", p.roleName)
24
	assert.Equal(t, 3600, p.metadataTokenDurationSeconds)
25
26
	assert.True(t, p.needUpdateCredential())
27
}
28
29
func TestECSRAMRoleCredentialsProvider_getRoleName(t *testing.T) {
30
	originHttpDo := httpDo
31
	defer func() { httpDo = originHttpDo }()
32
33
	p, err := NewECSRAMRoleCredentialsProviderBuilder().Build()
34
	assert.Nil(t, err)
35
36
	// case 1: server error
37
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
38
		err = errors.New("mock server error")
39
		return
40
	}
41
42
	_, err = p.getRoleName()
43
	assert.NotNil(t, err)
44
	assert.Equal(t, "get role name failed: mock server error", err.Error())
45
46
	// case 2: 4xx error
47
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
48
		res = &httputil.Response{
49
			StatusCode: 400,
50
			Body:       []byte("4xx error"),
51
		}
52
		return
53
	}
54
55
	_, err = p.getRoleName()
56
	assert.NotNil(t, err)
57
	assert.Equal(t, "get role name failed: GET http://100.100.100.200/latest/meta-data/ram/security-credentials/ 400", err.Error())
58
59
	// case 3: ok
60
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
61
		res = &httputil.Response{
62
			StatusCode: 200,
63
			Body:       []byte("rolename"),
64
		}
65
		return
66
	}
67
	roleName, err := p.getRoleName()
68
	assert.Nil(t, err)
69
	assert.Equal(t, "rolename", roleName)
70
}
71
72
func TestECSRAMRoleCredentialsProvider_getRoleNameWithMetadataV2(t *testing.T) {
73
	originHttpDo := httpDo
74
	defer func() { httpDo = originHttpDo }()
75
76
	p, err := NewECSRAMRoleCredentialsProviderBuilder().WithEnableIMDSv2(true).Build()
77
	assert.Nil(t, err)
78
79
	// case 1: get metadata token failed
80
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
81
		err = errors.New("mock server error")
82
		return
83
	}
84
85
	_, err = p.getRoleName()
86
	assert.NotNil(t, err)
87
	assert.Equal(t, "get metadata token failed: mock server error", err.Error())
88
89
	// case 2: return token
90
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
91
		if req.Path == "/latest/api/token" {
92
			res = &httputil.Response{
93
				StatusCode: 200,
94
				Body:       []byte("tokenxxxxx"),
95
			}
96
		} else {
97
			assert.Equal(t, "tokenxxxxx", req.Headers["x-aliyun-ecs-metadata-token"])
98
99
			res = &httputil.Response{
100
				StatusCode: 200,
101
				Body:       []byte("rolename"),
102
			}
103
		}
104
		return
105
	}
106
107
	roleName, err := p.getRoleName()
108
	assert.Nil(t, err)
109
	assert.Equal(t, "rolename", roleName)
110
}
111
112
func TestECSRAMRoleCredentialsProvider_getCredentials(t *testing.T) {
113
	originHttpDo := httpDo
114
	defer func() { httpDo = originHttpDo }()
115
116
	p, err := NewECSRAMRoleCredentialsProviderBuilder().Build()
117
	assert.Nil(t, err)
118
119
	// case 1: server error
120
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
121
		err = errors.New("mock server error")
122
		return
123
	}
124
	_, err = p.getCredentials()
125
	assert.NotNil(t, err)
126
	assert.Equal(t, "get role name failed: mock server error", err.Error())
127
128
	// case 2: get role name ok, get credentials failed with server error
129
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
130
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
131
			res = &httputil.Response{
132
				StatusCode: 200,
133
				Body:       []byte("rolename"),
134
			}
135
			return
136
		}
137
		err = errors.New("mock server error")
138
		return
139
	}
140
141
	_, err = p.getCredentials()
142
	assert.NotNil(t, err)
143
	assert.Equal(t, "refresh Ecs sts token err: mock server error", err.Error())
144
145
	// case 3: 4xx error
146
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
147
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
148
			res = &httputil.Response{
149
				StatusCode: 200,
150
				Body:       []byte("rolename"),
151
			}
152
			return
153
		}
154
155
		res = &httputil.Response{
156
			StatusCode: 400,
157
			Body:       []byte("4xx error"),
158
		}
159
		return
160
	}
161
162
	_, err = p.getCredentials()
163
	assert.NotNil(t, err)
164
	assert.Equal(t, "refresh Ecs sts token err, httpStatus: 400, message = 4xx error", err.Error())
165
166
	// case 4: invalid json
167
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
168
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
169
			res = &httputil.Response{
170
				StatusCode: 200,
171
				Body:       []byte("rolename"),
172
			}
173
			return
174
		}
175
176
		res = &httputil.Response{
177
			StatusCode: 200,
178
			Body:       []byte("invalid json"),
179
		}
180
		return
181
	}
182
183
	_, err = p.getCredentials()
184
	assert.NotNil(t, err)
185
	assert.Equal(t, "refresh Ecs sts token err, json.Unmarshal fail: invalid character 'i' looking for beginning of value", err.Error())
186
187
	// case 5: empty response json
188
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
189
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
190
			res = &httputil.Response{
191
				StatusCode: 200,
192
				Body:       []byte("rolename"),
193
			}
194
			return
195
		}
196
197
		res = &httputil.Response{
198
			StatusCode: 200,
199
			Body:       []byte("null"),
200
		}
201
		return
202
	}
203
204
	_, err = p.getCredentials()
205
	assert.NotNil(t, err)
206
	assert.Equal(t, "refresh Ecs sts token err, fail to get credentials", err.Error())
207
208
	// case 6: empty session ak response json
209
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
210
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
211
			res = &httputil.Response{
212
				StatusCode: 200,
213
				Body:       []byte("rolename"),
214
			}
215
			return
216
		}
217
218
		res = &httputil.Response{
219
			StatusCode: 200,
220
			Body:       []byte("{}"),
221
		}
222
		return
223
	}
224
	_, err = p.getCredentials()
225
	assert.NotNil(t, err)
226
	assert.Equal(t, "refresh Ecs sts token err, fail to get credentials", err.Error())
227
228
	// case 7: non-success response
229
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
230
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
231
			res = &httputil.Response{
232
				StatusCode: 200,
233
				Body:       []byte("rolename"),
234
			}
235
			return
236
		}
237
238
		res = &httputil.Response{
239
			StatusCode: 200,
240
			Body:       []byte(`{"AccessKeyId":"saki","AccessKeySecret":"saks","Expiration":"2021-10-20T04:27:09Z","SecurityToken":"token","Code":"Failed"}`),
241
		}
242
		return
243
	}
244
	_, err = p.getCredentials()
245
	assert.NotNil(t, err)
246
	assert.Equal(t, "refresh Ecs sts token err, Code is not Success", err.Error())
247
248
	// case 8: mock ok value
249
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
250
		if req.Path == "/latest/meta-data/ram/security-credentials/" {
251
			res = &httputil.Response{
252
				StatusCode: 200,
253
				Body:       []byte("rolename"),
254
			}
255
			return
256
		}
257
258
		res = &httputil.Response{
259
			StatusCode: 200,
260
			Body:       []byte(`{"AccessKeyId":"saki","AccessKeySecret":"saks","Expiration":"2021-10-20T04:27:09Z","SecurityToken":"token","Code":"Success"}`),
261
		}
262
		return
263
	}
264
	creds, err := p.getCredentials()
265
	assert.Nil(t, err)
266
	assert.Equal(t, "saki", creds.AccessKeyId)
267
	assert.Equal(t, "saks", creds.AccessKeySecret)
268
	assert.Equal(t, "token", creds.SecurityToken)
269
	assert.Equal(t, "2021-10-20T04:27:09Z", creds.Expiration)
270
271
	// needUpdateCredential
272
	assert.True(t, p.needUpdateCredential())
273
	p.expirationTimestamp = time.Now().Unix()
274
	assert.True(t, p.needUpdateCredential())
275
276
	p.expirationTimestamp = time.Now().Unix() + 300
277
	assert.False(t, p.needUpdateCredential())
278
}
279
280
func TestECSRAMRoleCredentialsProvider_getCredentialsWithMetadataV2(t *testing.T) {
281
	originHttpDo := httpDo
282
	defer func() { httpDo = originHttpDo }()
283
284
	p, err := NewECSRAMRoleCredentialsProviderBuilder().WithRoleName("rolename").WithEnableIMDSv2(true).Build()
285
	assert.Nil(t, err)
286
287
	// case 1: get metadata token failed
288
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
289
		err = errors.New("mock server error")
290
		return
291
	}
292
293
	_, err = p.getCredentials()
294
	assert.NotNil(t, err)
295
	assert.Equal(t, "get metadata token failed: mock server error", err.Error())
296
297
	// case 2: return token
298
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
299
		if req.Path == "/latest/api/token" {
300
			res = &httputil.Response{
301
				StatusCode: 200,
302
				Body:       []byte("tokenxxxxx"),
303
			}
304
		} else if req.Path == "/latest/meta-data/ram/security-credentials/rolename" {
305
			assert.Equal(t, "tokenxxxxx", req.Headers["x-aliyun-ecs-metadata-token"])
306
			res = &httputil.Response{
307
				StatusCode: 200,
308
				Body:       []byte(`{"AccessKeyId":"saki","AccessKeySecret":"saks","Expiration":"2021-10-20T04:27:09Z","SecurityToken":"token","Code":"Success"}`),
309
			}
310
		}
311
		return
312
	}
313
314
	creds, err := p.getCredentials()
315
	assert.Nil(t, err)
316
	assert.Equal(t, "saki", creds.AccessKeyId)
317
	assert.Equal(t, "saks", creds.AccessKeySecret)
318
	assert.Equal(t, "token", creds.SecurityToken)
319
	assert.Equal(t, "2021-10-20T04:27:09Z", creds.Expiration)
320
321
	// needUpdateCredential
322
	assert.True(t, p.needUpdateCredential())
323
	p.expirationTimestamp = time.Now().Unix()
324
	assert.True(t, p.needUpdateCredential())
325
326
	p.expirationTimestamp = time.Now().Unix() + 300
327
	assert.False(t, p.needUpdateCredential())
328
}
329
330
func TestECSRAMRoleCredentialsProviderGetCredentials(t *testing.T) {
331
	originHttpDo := httpDo
332
	defer func() { httpDo = originHttpDo }()
333
334
	p, err := NewECSRAMRoleCredentialsProviderBuilder().WithRoleName("rolename").Build()
335
	assert.Nil(t, err)
336
	// case 1: get credentials failed
337
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
338
		err = errors.New("mock server error")
339
		return
340
	}
341
	_, err = p.GetCredentials()
342
	assert.NotNil(t, err)
343
	assert.Equal(t, "refresh Ecs sts token err: mock server error", err.Error())
344
345
	// case 2: get invalid expiration
346
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
347
		res = &httputil.Response{
348
			StatusCode: 200,
349
			Body:       []byte(`{"AccessKeyId":"saki","AccessKeySecret":"saks","Expiration":"invalidexpiration","SecurityToken":"token","Code":"Success"}`),
350
		}
351
		return
352
	}
353
	_, err = p.GetCredentials()
354
	assert.NotNil(t, err)
355
	assert.Equal(t, "parsing time \"invalidexpiration\" as \"2006-01-02T15:04:05Z\": cannot parse \"invalidexpiration\" as \"2006\"", err.Error())
356
357
	// case 3: happy result
358
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
359
		res = &httputil.Response{
360
			StatusCode: 200,
361
			Body:       []byte(`{"AccessKeyId":"akid","AccessKeySecret":"aksecret","Expiration":"2021-10-20T04:27:09Z","SecurityToken":"token","Code":"Success"}`),
362
		}
363
		return
364
	}
365
	cc, err := p.GetCredentials()
366
	assert.Nil(t, err)
367
	assert.Equal(t, "akid", cc.AccessKeyId)
368
	assert.Equal(t, "aksecret", cc.AccessKeySecret)
369
	assert.Equal(t, "token", cc.SecurityToken)
370
	assert.True(t, p.needUpdateCredential())
371
}
372
373
func TestECSRAMRoleCredentialsProvider_getMetadataToken(t *testing.T) {
374
	originHttpDo := httpDo
375
	defer func() { httpDo = originHttpDo }()
376
377
	p, err := NewECSRAMRoleCredentialsProviderBuilder().Build()
378
	assert.Nil(t, err)
379
380
	// case 1: server error
381
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
382
		err = errors.New("mock server error")
383
		return
384
	}
385
386
	_, err = p.getMetadataToken()
387
	assert.NotNil(t, err)
388
	assert.Equal(t, "get metadata token failed: mock server error", err.Error())
389
	// case 2: return token
390
	httpDo = func(req *httputil.Request) (res *httputil.Response, err error) {
391
		res = &httputil.Response{
392
			StatusCode: 200,
393
			Body:       []byte("tokenxxxxx"),
394
		}
395
		return
396
	}
397
	metadataToken, err := p.getMetadataToken()
398
	assert.Nil(t, err)
399
	assert.Equal(t, "tokenxxxxx", metadataToken)
400
}
401