@@ -5,6 +5,7 @@ package resourceadapters_test
5
5
6
6
import (
7
7
"fmt"
8
+ "sync/atomic"
8
9
9
10
"github.com/juju/errors"
10
11
"github.com/juju/testing"
@@ -32,51 +33,52 @@ func (s *CharmStoreSuite) SetUpTest(c *gc.C) {
32
33
33
34
func (s * CharmStoreSuite ) TestGetResourceTerminates (c * gc.C ) {
34
35
msg := "trust"
35
- attempts := 0
36
+ attempts := int32 ( 0 )
36
37
s .resourceClient .getResourceF = func (req charmstore.ResourceRequest ) (data charmstore.ResourceData , err error ) {
37
- attempts ++
38
+ atomic . AddInt32 ( & attempts , 1 )
38
39
return charmstore.ResourceData {}, errors .New (msg )
39
40
}
40
41
csRes := resourceadapters .NewCSRetryClientForTest (s .resourceClient )
41
42
42
43
_ , err := csRes .GetResource (charmstore.ResourceRequest {})
43
44
c .Assert (err , gc .ErrorMatches , fmt .Sprintf ("failed after retrying: %v" , msg ))
44
45
// Ensure we logged attempts @ WARNING.
45
- c .Assert (c .GetTestLog (), jc .Contains , fmt .Sprintf ("WARNING juju.resource.resourceadapters ( attempt %v) retrying resource " , attempts ))
46
+ c .Assert (c .GetTestLog (), jc .Contains , fmt .Sprintf ("WARNING juju.resource.resourceadapters attempt %d/%d to download resource " , attempts , attempts ))
46
47
47
48
callsMade := []string {}
48
- for i := 0 ; i < attempts ; i ++ {
49
+ for i := int32 ( 0 ) ; i < attempts ; i ++ {
49
50
callsMade = append (callsMade , "GetResource" )
50
51
}
52
+ c .Assert (attempts , jc .GreaterThan , 1 )
51
53
s .resourceClient .stub .CheckCallNames (c , callsMade ... )
52
54
}
53
55
54
56
func (s * CharmStoreSuite ) TestGetResourceAbortedOnNotFound (c * gc.C ) {
55
57
msg := "trust"
56
- s .resourceClient .getResourceF = func (req charmstore.ResourceRequest ) (data charmstore.ResourceData , err error ) {
57
- return charmstore.ResourceData {}, errors .NotFoundf (msg )
58
- }
59
- s .assertAbortedGetResource (c ,
58
+ s .assertAbortedGetResourceOnError (c ,
60
59
resourceadapters .NewCSRetryClientForTest (s .resourceClient ),
60
+ errors .NotFoundf (msg ),
61
61
fmt .Sprintf ("%v not found" , msg ),
62
62
)
63
63
}
64
64
65
65
func (s * CharmStoreSuite ) TestGetResourceAbortedOnNotValid (c * gc.C ) {
66
66
msg := "trust"
67
- s .resourceClient .getResourceF = func (req charmstore.ResourceRequest ) (data charmstore.ResourceData , err error ) {
68
- return charmstore.ResourceData {}, errors .NotValidf (msg )
69
- }
70
- s .assertAbortedGetResource (c ,
67
+ s .assertAbortedGetResourceOnError (c ,
71
68
resourceadapters .NewCSRetryClientForTest (s .resourceClient ),
69
+ errors .NotValidf (msg ),
72
70
fmt .Sprintf ("%v not valid" , msg ),
73
71
)
74
72
}
75
73
76
- func (s * CharmStoreSuite ) assertAbortedGetResource (c * gc.C , csRes * resourceadapters.CSRetryClient , expectedError string ) {
74
+ func (s * CharmStoreSuite ) assertAbortedGetResourceOnError (c * gc.C , csRes * resourceadapters.CSRetryClient , expectedError error , expectedMessage string ) {
75
+ s .resourceClient .getResourceF = func (req charmstore.ResourceRequest ) (data charmstore.ResourceData , err error ) {
76
+ return charmstore.ResourceData {}, expectedError
77
+ }
77
78
_ , err := csRes .GetResource (charmstore.ResourceRequest {})
78
- c .Assert (err , gc .ErrorMatches , expectedError )
79
+ c .Assert (err , gc .ErrorMatches , expectedMessage )
79
80
c .Assert (c .GetTestLog (), gc .Not (jc .Contains ), "WARNING juju.resource.resourceadapters" )
81
+ // Since we have aborted re-tries, we should only call GetResources once.
80
82
s .resourceClient .stub .CheckCallNames (c , "GetResource" )
81
83
}
82
84
0 commit comments