@@ -3,6 +3,7 @@ import iam = require('@aws-cdk/aws-iam');
3
3
import kms = require( '@aws-cdk/aws-kms' ) ;
4
4
import cdk = require( '@aws-cdk/cdk' ) ;
5
5
import { Test } from 'nodeunit' ;
6
+ import { EOL } from 'os' ;
6
7
import s3 = require( '../lib' ) ;
7
8
8
9
// to make it easy to copy & paste from output:
@@ -72,6 +73,142 @@ export = {
72
73
test . done ( ) ;
73
74
} ,
74
75
76
+ 'valid bucket names' ( test : Test ) {
77
+ const stack = new cdk . Stack ( ) ;
78
+
79
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket1' , {
80
+ bucketName : 'abc.xyz-34ab'
81
+ } ) ) ;
82
+
83
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket2' , {
84
+ bucketName : '124.pp--33'
85
+ } ) ) ;
86
+
87
+ test . done ( ) ;
88
+ } ,
89
+
90
+ 'bucket validation skips tokenized values' ( test : Test ) {
91
+ const stack = new cdk . Stack ( ) ;
92
+
93
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket' , {
94
+ bucketName : new cdk . Token ( ( ) => '_BUCKET' ) . toString ( )
95
+ } ) ) ;
96
+
97
+ test . done ( ) ;
98
+ } ,
99
+
100
+ 'fails with message on invalid bucket names' ( test : Test ) {
101
+ const stack = new cdk . Stack ( ) ;
102
+ const bucket = `-buckEt.-${ new Array ( 65 ) . join ( '$' ) } ` ;
103
+ const expectedErrors = [
104
+ `Invalid S3 bucket name (value: ${ bucket } )` ,
105
+ 'Bucket name must be at least 3 and no more than 63 characters' ,
106
+ 'Bucket name must only contain lowercase characters and the symbols, period (.) and dash (-) (offset: 5)' ,
107
+ 'Bucket name must start and end with a lowercase character or number (offset: 0)' ,
108
+ `Bucket name must start and end with a lowercase character or number (offset: ${ bucket . length - 1 } )` ,
109
+ 'Bucket name must not have dash next to period, or period next to dash, or consecutive periods (offset: 7)' ,
110
+ ] . join ( EOL ) ;
111
+
112
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket' , {
113
+ bucketName : bucket
114
+ // tslint:disable-next-line:only-arrow-functions
115
+ } ) , function ( err : Error ) {
116
+ return expectedErrors === err . message ;
117
+ } ) ;
118
+
119
+ test . done ( ) ;
120
+ } ,
121
+
122
+ 'fails if bucket name has less than 3 or more than 63 characters' ( test : Test ) {
123
+ const stack = new cdk . Stack ( ) ;
124
+
125
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket1' , {
126
+ bucketName : 'a'
127
+ } ) , / a t l e a s t 3 / ) ;
128
+
129
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket2' , {
130
+ bucketName : new Array ( 65 ) . join ( 'x' )
131
+ } ) , / n o m o r e t h a n 6 3 / ) ;
132
+
133
+ test . done ( ) ;
134
+ } ,
135
+
136
+ 'fails if bucket name has invalid characters' ( test : Test ) {
137
+ const stack = new cdk . Stack ( ) ;
138
+
139
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket1' , {
140
+ bucketName : 'b@cket'
141
+ } ) , / o f f s e t : 1 / ) ;
142
+
143
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket2' , {
144
+ bucketName : 'bucKet'
145
+ } ) , / o f f s e t : 3 / ) ;
146
+
147
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket3' , {
148
+ bucketName : 'bučket'
149
+ } ) , / o f f s e t : 2 / ) ;
150
+
151
+ test . done ( ) ;
152
+ } ,
153
+
154
+ 'fails if bucket name does not start or end with lowercase character or number' ( test : Test ) {
155
+ const stack = new cdk . Stack ( ) ;
156
+
157
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket1' , {
158
+ bucketName : '-ucket'
159
+ } ) , / o f f s e t : 0 / ) ;
160
+
161
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket2' , {
162
+ bucketName : 'bucke.'
163
+ } ) , / o f f s e t : 5 / ) ;
164
+
165
+ test . done ( ) ;
166
+ } ,
167
+
168
+ 'fails only if bucket name has the consecutive symbols (..), (.-), (-.)' ( test : Test ) {
169
+ const stack = new cdk . Stack ( ) ;
170
+
171
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket1' , {
172
+ bucketName : 'buc..ket'
173
+ } ) , / o f f s e t : 3 / ) ;
174
+
175
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket2' , {
176
+ bucketName : 'buck.-et'
177
+ } ) , / o f f s e t : 4 / ) ;
178
+
179
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket3' , {
180
+ bucketName : 'b-.ucket'
181
+ } ) , / o f f s e t : 1 / ) ;
182
+
183
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket4' , {
184
+ bucketName : 'bu--cket'
185
+ } ) ) ;
186
+
187
+ test . done ( ) ;
188
+ } ,
189
+
190
+ 'fails only if bucket name resembles IP address' ( test : Test ) {
191
+ const stack = new cdk . Stack ( ) ;
192
+
193
+ test . throws ( ( ) => new s3 . Bucket ( stack , 'MyBucket1' , {
194
+ bucketName : '1.2.3.4'
195
+ } ) , / m u s t n o t r e s e m b l e a n I P a d d r e s s / ) ;
196
+
197
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket2' , {
198
+ bucketName : '1.2.3'
199
+ } ) ) ;
200
+
201
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket3' , {
202
+ bucketName : '1.2.3.a'
203
+ } ) ) ;
204
+
205
+ test . doesNotThrow ( ( ) => new s3 . Bucket ( stack , 'MyBucket4' , {
206
+ bucketName : '1000.2.3.4'
207
+ } ) ) ;
208
+
209
+ test . done ( ) ;
210
+ } ,
211
+
75
212
'fails if encryption key is used with managed encryption' ( test : Test ) {
76
213
const stack = new cdk . Stack ( ) ;
77
214
const myKey = new kms . EncryptionKey ( stack , 'MyKey' ) ;
0 commit comments