1
1
package entitlements_test
2
2
3
3
import (
4
+ "context"
4
5
"testing"
5
6
"time"
6
7
7
8
"github.com/stretchr/testify/require"
8
9
9
10
"github.com/coder/coder/v2/coderd/entitlements"
10
11
"github.com/coder/coder/v2/codersdk"
12
+ "github.com/coder/coder/v2/testutil"
11
13
)
12
14
13
- func TestUpdate (t * testing.T ) {
15
+ func TestModify (t * testing.T ) {
14
16
t .Parallel ()
15
17
16
18
set := entitlements .New ()
17
19
require .False (t , set .Enabled (codersdk .FeatureMultipleOrganizations ))
18
20
19
- set .Update (func (entitlements * codersdk.Entitlements ) {
21
+ set .Modify (func (entitlements * codersdk.Entitlements ) {
20
22
entitlements .Features [codersdk .FeatureMultipleOrganizations ] = codersdk.Feature {
21
23
Enabled : true ,
22
24
Entitlement : codersdk .EntitlementEntitled ,
@@ -30,15 +32,15 @@ func TestAllowRefresh(t *testing.T) {
30
32
31
33
now := time .Now ()
32
34
set := entitlements .New ()
33
- set .Update (func (entitlements * codersdk.Entitlements ) {
35
+ set .Modify (func (entitlements * codersdk.Entitlements ) {
34
36
entitlements .RefreshedAt = now
35
37
})
36
38
37
39
ok , wait := set .AllowRefresh (now )
38
40
require .False (t , ok )
39
41
require .InDelta (t , time .Minute .Seconds (), wait .Seconds (), 5 )
40
42
41
- set .Update (func (entitlements * codersdk.Entitlements ) {
43
+ set .Modify (func (entitlements * codersdk.Entitlements ) {
42
44
entitlements .RefreshedAt = now .Add (time .Minute * - 2 )
43
45
})
44
46
@@ -47,17 +49,76 @@ func TestAllowRefresh(t *testing.T) {
47
49
require .Equal (t , time .Duration (0 ), wait )
48
50
}
49
51
50
- func TestReplace (t * testing.T ) {
52
+ func TestUpdate (t * testing.T ) {
51
53
t .Parallel ()
54
+ ctx := testutil .Context (t , testutil .WaitShort )
52
55
53
56
set := entitlements .New ()
54
57
require .False (t , set .Enabled (codersdk .FeatureMultipleOrganizations ))
55
- set .Replace (codersdk.Entitlements {
56
- Features : map [codersdk.FeatureName ]codersdk.Feature {
57
- codersdk .FeatureMultipleOrganizations : {
58
- Enabled : true ,
59
- },
60
- },
61
- })
58
+ fetchStarted := make (chan struct {})
59
+ firstDone := make (chan struct {})
60
+ errCh := make (chan error , 2 )
61
+ go func () {
62
+ err := set .Update (ctx , func (_ context.Context ) (codersdk.Entitlements , error ) {
63
+ close (fetchStarted )
64
+ select {
65
+ case <- firstDone :
66
+ // OK!
67
+ case <- ctx .Done ():
68
+ t .Error ("timeout" )
69
+ return codersdk.Entitlements {}, ctx .Err ()
70
+ }
71
+ return codersdk.Entitlements {
72
+ Features : map [codersdk.FeatureName ]codersdk.Feature {
73
+ codersdk .FeatureMultipleOrganizations : {
74
+ Enabled : true ,
75
+ },
76
+ },
77
+ }, nil
78
+ })
79
+ errCh <- err
80
+ }()
81
+ testutil .RequireRecvCtx (ctx , t , fetchStarted )
82
+ require .False (t , set .Enabled (codersdk .FeatureMultipleOrganizations ))
83
+ // start a second update while the first one is in progress
84
+ go func () {
85
+ err := set .Update (ctx , func (_ context.Context ) (codersdk.Entitlements , error ) {
86
+ return codersdk.Entitlements {
87
+ Features : map [codersdk.FeatureName ]codersdk.Feature {
88
+ codersdk .FeatureMultipleOrganizations : {
89
+ Enabled : true ,
90
+ },
91
+ codersdk .FeatureAppearance : {
92
+ Enabled : true ,
93
+ },
94
+ },
95
+ }, nil
96
+ })
97
+ errCh <- err
98
+ }()
99
+ close (firstDone )
100
+ err := testutil .RequireRecvCtx (ctx , t , errCh )
101
+ require .NoError (t , err )
102
+ err = testutil .RequireRecvCtx (ctx , t , errCh )
103
+ require .NoError (t , err )
62
104
require .True (t , set .Enabled (codersdk .FeatureMultipleOrganizations ))
105
+ require .True (t , set .Enabled (codersdk .FeatureAppearance ))
106
+ }
107
+
108
+ func TestUpdate_LicenseRequiresTelemetry (t * testing.T ) {
109
+ t .Parallel ()
110
+ ctx := testutil .Context (t , testutil .WaitShort )
111
+ set := entitlements .New ()
112
+ set .Modify (func (entitlements * codersdk.Entitlements ) {
113
+ entitlements .Errors = []string {"some error" }
114
+ entitlements .Features [codersdk .FeatureAppearance ] = codersdk.Feature {
115
+ Enabled : true ,
116
+ }
117
+ })
118
+ err := set .Update (ctx , func (_ context.Context ) (codersdk.Entitlements , error ) {
119
+ return codersdk.Entitlements {}, entitlements .ErrLicenseRequiresTelemetry
120
+ })
121
+ require .NoError (t , err )
122
+ require .True (t , set .Enabled (codersdk .FeatureAppearance ))
123
+ require .Equal (t , []string {entitlements .ErrLicenseRequiresTelemetry .Error ()}, set .Errors ())
63
124
}
0 commit comments