| 435 | } |
| 436 | |
| 437 | func TestParseWithExpose(t *testing.T) { |
| 438 | t.Run("invalid", func(t *testing.T) { |
| 439 | tests := map[string]string{ |
| 440 | ":": `invalid range format for --expose: invalid start port ':': invalid syntax`, |
| 441 | "8080:9090": `invalid range format for --expose: invalid start port '8080:9090': invalid syntax`, |
| 442 | "/tcp": `invalid range format for --expose: invalid start port '': value is empty`, |
| 443 | "/udp": `invalid range format for --expose: invalid start port '': value is empty`, |
| 444 | "NaN/tcp": `invalid range format for --expose: invalid start port 'NaN': invalid syntax`, |
| 445 | "NaN-NaN/tcp": `invalid range format for --expose: invalid start port 'NaN': invalid syntax`, |
| 446 | "8080-NaN/tcp": `invalid range format for --expose: invalid end port 'NaN': invalid syntax`, |
| 447 | "1234567890-8080/tcp": `invalid range format for --expose: invalid start port '1234567890': value out of range`, |
| 448 | } |
| 449 | for expose, expectedError := range tests { |
| 450 | t.Run(expose, func(t *testing.T) { |
| 451 | _, _, _, err := parseRun([]string{fmt.Sprintf("--expose=%v", expose), "img", "cmd"}) |
| 452 | assert.Error(t, err, expectedError) |
| 453 | }) |
| 454 | } |
| 455 | }) |
| 456 | t.Run("valid", func(t *testing.T) { |
| 457 | tests := map[string][]networktypes.Port{ |
| 458 | "8080/tcp": {networktypes.MustParsePort("8080/tcp")}, |
| 459 | "8080/udp": {networktypes.MustParsePort("8080/udp")}, |
| 460 | "8080/ncp": {networktypes.MustParsePort("8080/ncp")}, |
| 461 | "8080-8080/udp": {networktypes.MustParsePort("8080/udp")}, |
| 462 | "8080-8082/tcp": {networktypes.MustParsePort("8080/tcp"), networktypes.MustParsePort("8081/tcp"), networktypes.MustParsePort("8082/tcp")}, |
| 463 | } |
| 464 | for expose, exposedPorts := range tests { |
| 465 | t.Run(expose, func(t *testing.T) { |
| 466 | config, _, _, err := parseRun([]string{fmt.Sprintf("--expose=%v", expose), "img", "cmd"}) |
| 467 | assert.NilError(t, err) |
| 468 | for _, port := range exposedPorts { |
| 469 | _, ok := config.ExposedPorts[port] |
| 470 | assert.Check(t, ok, "missing port %q in exposed ports: %#+v", port, config.ExposedPorts[port]) |
| 471 | } |
| 472 | }) |
| 473 | } |
| 474 | }) |
| 475 | |
| 476 | t.Run("merge with published", func(t *testing.T) { |
| 477 | // Merge with actual published port |
| 478 | config, _, _, err := parseRun([]string{"--publish=80", "--expose=80-81/tcp", "img", "cmd"}) |
| 479 | assert.NilError(t, err) |
| 480 | assert.Check(t, is.Len(config.ExposedPorts, 2)) |
| 481 | ports := []networktypes.Port{networktypes.MustParsePort("80/tcp"), networktypes.MustParsePort("81/tcp")} |
| 482 | for _, port := range ports { |
| 483 | _, ok := config.ExposedPorts[port] |
| 484 | assert.Check(t, ok, "missing port %q in exposed ports: %#+v", port, config.ExposedPorts[port]) |
| 485 | } |
| 486 | }) |
| 487 | } |
| 488 | |
| 489 | func TestParseDevice(t *testing.T) { |
| 490 | skip.If(t, runtime.GOOS != "linux") // Windows and macOS validate server-side |