@@ -109,46 +109,59 @@ func TestIntegration_CreateTTL(t *testing.T) {
109
109
}
110
110
defer zk .Close ()
111
111
112
- path := "/gozk-test"
113
-
114
- if err := zk .Delete (path , - 1 ); err != nil && err != ErrNoNode {
115
- t .Fatalf ("Delete returned error: %+v" , err )
116
- }
117
- if _ , err := zk .CreateTTL ("" , []byte {1 , 2 , 3 , 4 }, FlagTTL | FlagEphemeral , WorldACL (PermAll ), 60 * time .Second ); err != ErrInvalidPath {
118
- t .Fatalf ("Create path check failed" )
119
- }
120
- if _ , err := zk .CreateTTL (path , []byte {1 , 2 , 3 , 4 }, 0 , WorldACL (PermAll ), 60 * time .Second ); err != ErrInvalidFlags {
121
- t .Fatalf ("Create flags check failed" )
122
- }
123
- if p , err := zk .CreateTTL (path , []byte {1 , 2 , 3 , 4 }, FlagTTL | FlagEphemeral , WorldACL (PermAll ), 60 * time .Second ); err != nil {
124
- t .Fatalf ("Create returned error: %+v" , err )
125
- } else if p != path {
126
- t .Fatalf ("Create returned different path '%s' != '%s'" , p , path )
127
- }
128
- if data , stat , err := zk .Get (path ); err != nil {
129
- t .Fatalf ("Get returned error: %+v" , err )
130
- } else if stat == nil {
131
- t .Fatal ("Get returned nil stat" )
132
- } else if len (data ) < 4 {
133
- t .Fatal ("Get returned wrong size data" )
134
- }
112
+ tests := []struct {
113
+ name string
114
+ createFlags int32
115
+ giveDuration time.Duration
116
+ wantErr string
117
+ }{
118
+ {
119
+ name : "valid create ttl" ,
120
+ createFlags : FlagTTL ,
121
+ giveDuration : time .Minute ,
122
+ },
123
+ {
124
+ name : "valid change detector" ,
125
+ createFlags : 5 ,
126
+ giveDuration : time .Minute ,
127
+ },
128
+ {
129
+ name : "invalid flag for create mode" ,
130
+ createFlags : 999 ,
131
+ giveDuration : time .Minute ,
132
+ wantErr : "invalid flag value: [999]" ,
133
+ },
134
+ }
135
+
136
+ const testPath = "/ttl_znode_tests"
137
+ // create sub node to create per test in avoiding using the root path.
138
+ _ , err = zk .Create (testPath , nil /* data */ , FlagPersistent , WorldACL (PermAll ))
139
+ requireNoError (t , err )
140
+
141
+ for idx , tt := range tests {
142
+ t .Run (tt .name , func (t * testing.T ) {
143
+ path := filepath .Join (testPath , fmt .Sprint (idx ))
144
+ _ , err := zk .CreateTTL (path , []byte {12 }, tt .createFlags , WorldACL (PermAll ), tt .giveDuration )
145
+ if tt .wantErr == "" {
146
+ requireNoError (t , err , fmt .Sprintf ("error not expected: path; %q; flags %v" , path , tt .createFlags ))
147
+ return
148
+ }
135
149
136
- if err := zk .Delete (path , - 1 ); err != nil && err != ErrNoNode {
137
- t .Fatalf ("Delete returned error: %+v" , err )
138
- }
139
- if p , err := zk .CreateTTL (path , []byte {1 , 2 , 3 , 4 }, FlagTTL | FlagSequence , WorldACL (PermAll ), 60 * time .Second ); err != nil {
140
- t .Fatalf ("Create returned error: %+v" , err )
141
- } else if ! strings .HasPrefix (p , path ) {
142
- t .Fatalf ("Create returned invalid path '%s' are not '%s' with sequence" , p , path )
143
- } else if data , stat , err := zk .Get (p ); err != nil {
144
- t .Fatalf ("Get returned error: %+v" , err )
145
- } else if stat == nil {
146
- t .Fatal ("Get returned nil stat" )
147
- } else if len (data ) < 4 {
148
- t .Fatal ("Get returned wrong size data" )
150
+ // want an error
151
+ if err == nil {
152
+ t .Fatalf ("did not get expected error: %q" , tt .wantErr )
153
+ }
154
+ if ! strings .Contains (err .Error (), tt .wantErr ) {
155
+ t .Fatalf ("wanted error not found: %v; got: %v" , tt .wantErr , err .Error ())
156
+ }
157
+ })
149
158
}
150
159
}
151
160
161
+ // NOTE: Currently there is not a way to get the znode after creating and
162
+ // asserting it is once mode or another. This means these tests are only testing the
163
+ // path of creation, but is not asserting that the resulting znode is the
164
+ // mode we set with flags.
152
165
func TestIntegration_CreateContainer (t * testing.T ) {
153
166
ts , err := StartTestCluster (t , 1 , nil , logWriter {t : t , p : "[ZKERR] " })
154
167
if err != nil {
@@ -161,28 +174,74 @@ func TestIntegration_CreateContainer(t *testing.T) {
161
174
}
162
175
defer zk .Close ()
163
176
164
- path := "/gozk-test"
177
+ tests := []struct {
178
+ name string
179
+ createFlags int32
180
+ wantErr string
181
+ }{
182
+ {
183
+ name : "valid create container" ,
184
+ createFlags : FlagContainer ,
185
+ },
186
+ {
187
+ name : "valid create container hard coded flag int" ,
188
+ createFlags : 4 ,
189
+ // container flag, ensure matches ZK Create Mode (change detector test)
190
+ },
191
+ {
192
+ name : "invalid create mode" ,
193
+ createFlags : 999 ,
194
+ wantErr : "invalid flag value: [999]" ,
195
+ },
196
+ {
197
+ name : "invalid containers cannot be persistant" ,
198
+ createFlags : FlagPersistent ,
199
+ wantErr : ErrInvalidFlags .Error (),
200
+ },
201
+ {
202
+ name : "invalid containers cannot be ephemeral" ,
203
+ createFlags : FlagEphemeral ,
204
+ wantErr : ErrInvalidFlags .Error (),
205
+ },
206
+ {
207
+ name : "invalid containers cannot be sequential" ,
208
+ createFlags : FlagSequence ,
209
+ wantErr : ErrInvalidFlags .Error (),
210
+ },
211
+ {
212
+ name : "invalid container and sequential" ,
213
+ createFlags : FlagContainer | FlagSequence ,
214
+ wantErr : ErrInvalidFlags .Error (),
215
+ },
216
+ {
217
+ name : "invliad TTLs cannot be used with Container znodes" ,
218
+ createFlags : FlagTTL ,
219
+ wantErr : ErrInvalidFlags .Error (),
220
+ },
221
+ }
222
+
223
+ const testPath = "/container_test_znode"
224
+ // create sub node to create per test in avoiding using the root path.
225
+ _ , err = zk .Create (testPath , nil /* data */ , FlagPersistent , WorldACL (PermAll ))
226
+ requireNoError (t , err )
227
+
228
+ for idx , tt := range tests {
229
+ t .Run (tt .name , func (t * testing.T ) {
230
+ path := filepath .Join (testPath , fmt .Sprint (idx ))
231
+ _ , err := zk .CreateContainer (path , []byte {12 }, tt .createFlags , WorldACL (PermAll ))
232
+ if tt .wantErr == "" {
233
+ requireNoError (t , err , fmt .Sprintf ("error not expected: path; %q; flags %v" , path , tt .createFlags ))
234
+ return
235
+ }
165
236
166
- if err := zk .Delete (path , - 1 ); err != nil && err != ErrNoNode {
167
- t .Fatalf ("Delete returned error: %+v" , err )
168
- }
169
- if _ , err := zk .CreateContainer ("" , []byte {1 , 2 , 3 , 4 }, FlagTTL , WorldACL (PermAll )); err != ErrInvalidPath {
170
- t .Fatalf ("Create path check failed" )
171
- }
172
- if _ , err := zk .CreateContainer (path , []byte {1 , 2 , 3 , 4 }, 0 , WorldACL (PermAll )); err != ErrInvalidFlags {
173
- t .Fatalf ("Create flags check failed" )
174
- }
175
- if p , err := zk .CreateContainer (path , []byte {1 , 2 , 3 , 4 }, FlagTTL , WorldACL (PermAll )); err != nil {
176
- t .Fatalf ("Create returned error: %+v" , err )
177
- } else if p != path {
178
- t .Fatalf ("Create returned different path '%s' != '%s'" , p , path )
179
- }
180
- if data , stat , err := zk .Get (path ); err != nil {
181
- t .Fatalf ("Get returned error: %+v" , err )
182
- } else if stat == nil {
183
- t .Fatal ("Get returned nil stat" )
184
- } else if len (data ) < 4 {
185
- t .Fatal ("Get returned wrong size data" )
237
+ // want an error
238
+ if err == nil {
239
+ t .Fatalf ("did not get expected error: %q" , tt .wantErr )
240
+ }
241
+ if ! strings .Contains (err .Error (), tt .wantErr ) {
242
+ t .Fatalf ("wanted error not found: %v; got: %v" , tt .wantErr , err .Error ())
243
+ }
244
+ })
186
245
}
187
246
}
188
247
0 commit comments