@@ -22,16 +22,26 @@ type parseLimitCase struct {
2222func TestParseLimit (t * testing.T ) {
2323 t .Parallel ()
2424
25+ var errorHint = ` doesn't fit format type=#unit or type=# or type=#/#
26+ Examples: web=2G worker=500M db=1G/2G`
27+
2528 cases := []parseLimitCase {
2629 {"web=2G" , "web" , "2G" , false , "" },
27- {"=1" , "" , "" , true , `=1 doesn't fit format type=#unit or type=#
28- Examples: web=2G worker=500M web=300` },
29- {"web=" , "" , "" , true , `web= doesn't fit format type=#unit or type=#
30- Examples: web=2G worker=500M web=300` },
31- {"1=" , "" , "" , true , `1= doesn't fit format type=#unit or type=#
32- Examples: web=2G worker=500M web=300` },
33- {"web=G" , "" , "" , true , `web=G doesn't fit format type=#unit or type=#
34- Examples: web=2G worker=500M web=300` },
30+ {"web=2" , "web" , "2" , false , "" },
31+ {"web=100m" , "web" , "100m" , false , "" },
32+ {"web=0.1" , "web" , "0.1" , false , "" },
33+ {"web=.123" , "web" , ".123" , false , "" },
34+ {"web=2G/4G" , "web" , "2G/4G" , false , "" },
35+ {"web=2/4" , "web" , "2/4" , false , "" },
36+ {"web=200m/400m" , "web" , "200m/400m" , false , "" },
37+ {"web=0.2/0.4" , "web" , "0.2/0.4" , false , "" },
38+ {"web=.2/.4" , "web" , ".2/.4" , false , "" },
39+ {"=1" , "" , "" , true , "=1" + errorHint },
40+ {"web=" , "" , "" , true , "web=" + errorHint },
41+ {"1=" , "" , "" , true , "1=" + errorHint },
42+ {"web=G" , "" , "" , true , "web=G" + errorHint },
43+ {"web=/" , "" , "" , true , "web=/" + errorHint },
44+ {"web=/1" , "" , "" , true , "web=/1" + errorHint },
3545 }
3646
3747 for _ , check := range cases {
@@ -58,8 +68,8 @@ func TestLimitTags(t *testing.T) {
5868
5969 cases := []parseLimitsCase {
6070 {[]string {"web=1G" , "worker=2" }, map [string ]interface {}{"web" : "1G" , "worker" : "2" }, false , "" },
61- {[]string {"foo=" , "web=1G" }, nil , true , `foo= doesn't fit format type=#unit or type=#
62- Examples: web=2G worker=500M web=300 ` },
71+ {[]string {"foo=" , "web=1G" }, nil , true , `foo= doesn't fit format type=#unit or type=# or type=#/#
72+ Examples: web=2G worker=500M db=1G/2G ` },
6373 }
6474
6575 for _ , check := range cases {
@@ -88,11 +98,13 @@ func TestLimitsList(t *testing.T) {
8898 "app": "enterprise",
8999 "values": {},
90100 "memory": {
91- "web": "2G"
101+ "web": "2G",
102+ "db": "1000M/1500M"
92103 },
93104 "cpu": {
94105 "web": "2",
95- "worker": "1"
106+ "worker": "1",
107+ "db": "500m/2000m"
96108 },
97109 "tags": {},
98110 "registry": {},
@@ -110,9 +122,11 @@ func TestLimitsList(t *testing.T) {
110122 assert .Equal (t , b .String (), `=== enterprise Limits
111123
112124--- Memory
125+ db 1000M/1500M
113126web 2G
114127
115128--- CPU
129+ db 500m/2000m
116130web 2
117131worker 1
118132` , "output" )
@@ -236,6 +250,102 @@ web 1G
236250
237251--- CPU
238252Unlimited
253+ ` , "output" )
254+
255+ // with requests/limit parameter
256+ server .Mux .HandleFunc ("/v2/apps/jim/config/" , func (w http.ResponseWriter , r * http.Request ) {
257+ testutil .SetHeaders (w )
258+ if r .Method == "POST" {
259+ testutil .AssertBody (t , api.Config {
260+ Memory : map [string ]interface {}{
261+ "web" : "2000M" ,
262+ "worker" : "0/3G" ,
263+ "db" : "4G/5G" ,
264+ },
265+ }, r )
266+ }
267+
268+ fmt .Fprintf (w , `{
269+ "owner": "foo",
270+ "app": "jim",
271+ "values": {},
272+ "memory": {
273+ "web": "2000M",
274+ "worker": "0/3G",
275+ "db": "4G/5G"
276+ },
277+ "cpu": {},
278+ "tags": {},
279+ "registry": {},
280+ "created": "2014-01-01T00:00:00UTC",
281+ "updated": "2014-01-01T00:00:00UTC",
282+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
283+ }` )
284+ })
285+ b .Reset ()
286+
287+ err = cmdr .LimitsSet ("jim" , []string {"web=2000M" , "worker=0/3G" , "db=4G/5G" }, "memory" )
288+ assert .NoErr (t , err )
289+
290+ assert .Equal (t , testutil .StripProgress (b .String ()), `Applying limits... done
291+
292+ === jim Limits
293+
294+ --- Memory
295+ db 4G/5G
296+ web 2000M
297+ worker 0/3G
298+
299+ --- CPU
300+ Unlimited
301+ ` , "output" )
302+
303+ // with requests/limit parameter
304+ server .Mux .HandleFunc ("/v2/apps/phew/config/" , func (w http.ResponseWriter , r * http.Request ) {
305+ testutil .SetHeaders (w )
306+ if r .Method == "POST" {
307+ testutil .AssertBody (t , api.Config {
308+ CPU : map [string ]interface {}{
309+ "web" : "2" ,
310+ "worker" : "0/300m" ,
311+ "db" : "4/5.6" ,
312+ },
313+ }, r )
314+ }
315+
316+ fmt .Fprintf (w , `{
317+ "owner": "foo",
318+ "app": "jim",
319+ "values": {},
320+ "cpu": {
321+ "web": "2",
322+ "worker": "0/300m",
323+ "db": "4/5.6"
324+ },
325+ "cpu": {},
326+ "tags": {},
327+ "registry": {},
328+ "created": "2014-01-01T00:00:00UTC",
329+ "updated": "2014-01-01T00:00:00UTC",
330+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
331+ }` )
332+ })
333+ b .Reset ()
334+
335+ err = cmdr .LimitsSet ("phew" , []string {"web=2" , "worker=0/300m" , "db=4/5.6" }, "cpu" )
336+ assert .NoErr (t , err )
337+
338+ assert .Equal (t , testutil .StripProgress (b .String ()), `Applying limits... done
339+
340+ === phew Limits
341+
342+ --- Memory
343+ Unlimited
344+
345+ --- CPU
346+ db 4/5.6
347+ web 2
348+ worker 0/300m
239349` , "output" )
240350}
241351
0 commit comments