2017-03-01 23:16:22 +01:00
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2017-07-13 22:01:19 +02:00
|
|
|
"regexp"
|
2017-03-01 23:16:22 +01:00
|
|
|
"testing"
|
2017-03-13 21:09:25 +01:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/terraform"
|
|
|
|
"github.com/mitchellh/cli"
|
|
|
|
"github.com/mitchellh/colorstring"
|
2017-03-01 23:16:22 +01:00
|
|
|
)
|
|
|
|
|
2017-03-13 21:09:25 +01:00
|
|
|
func TestUiHookPreApply_periodicTimer(t *testing.T) {
|
2017-08-14 17:19:40 +02:00
|
|
|
ui := cli.NewMockUi()
|
2017-03-13 21:09:25 +01:00
|
|
|
h := &UiHook{
|
|
|
|
Colorize: &colorstring.Colorize{
|
|
|
|
Colors: colorstring.DefaultColors,
|
|
|
|
Disable: true,
|
|
|
|
Reset: true,
|
|
|
|
},
|
|
|
|
Ui: ui,
|
|
|
|
PeriodicUiTimer: 1 * time.Second,
|
|
|
|
}
|
|
|
|
h.init()
|
|
|
|
h.resources = map[string]uiResourceState{
|
|
|
|
"data.aws_availability_zones.available": uiResourceState{
|
|
|
|
Op: uiResourceDestroy,
|
|
|
|
Start: time.Now(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
n := &terraform.InstanceInfo{
|
|
|
|
Id: "data.aws_availability_zones.available",
|
|
|
|
ModulePath: []string{"root"},
|
|
|
|
Type: "aws_availability_zones",
|
|
|
|
}
|
|
|
|
|
|
|
|
s := &terraform.InstanceState{
|
|
|
|
ID: "2017-03-05 10:56:59.298784526 +0000 UTC",
|
|
|
|
Attributes: map[string]string{
|
|
|
|
"id": "2017-03-05 10:56:59.298784526 +0000 UTC",
|
|
|
|
"names.#": "4",
|
|
|
|
"names.0": "us-east-1a",
|
|
|
|
"names.1": "us-east-1b",
|
|
|
|
"names.2": "us-east-1c",
|
|
|
|
"names.3": "us-east-1d",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
d := &terraform.InstanceDiff{
|
|
|
|
Destroy: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
action, err := h.PreApply(n, s, d)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if action != terraform.HookActionContinue {
|
|
|
|
t.Fatalf("Expected hook to continue, given: %#v", action)
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(3100 * time.Millisecond)
|
|
|
|
|
2017-03-17 16:04:27 +01:00
|
|
|
// stop the background writer
|
|
|
|
uiState := h.resources[n.HumanId()]
|
|
|
|
close(uiState.DoneCh)
|
|
|
|
<-uiState.done
|
|
|
|
|
2017-04-04 16:41:54 +02:00
|
|
|
expectedOutput := `data.aws_availability_zones.available: Destroying... (ID: 2017-03-05 10:56:59.298784526 +0000 UTC)
|
|
|
|
data.aws_availability_zones.available: Still destroying... (ID: 2017-03-05 10:56:59.298784526 +0000 UTC, 1s elapsed)
|
|
|
|
data.aws_availability_zones.available: Still destroying... (ID: 2017-03-05 10:56:59.298784526 +0000 UTC, 2s elapsed)
|
|
|
|
data.aws_availability_zones.available: Still destroying... (ID: 2017-03-05 10:56:59.298784526 +0000 UTC, 3s elapsed)
|
2017-03-13 21:09:25 +01:00
|
|
|
`
|
|
|
|
output := ui.OutputWriter.String()
|
|
|
|
if output != expectedOutput {
|
|
|
|
t.Fatalf("Output didn't match.\nExpected: %q\nGiven: %q", expectedOutput, output)
|
|
|
|
}
|
|
|
|
|
|
|
|
expectedErrOutput := ""
|
|
|
|
errOutput := ui.ErrorWriter.String()
|
|
|
|
if errOutput != expectedErrOutput {
|
|
|
|
t.Fatalf("Error output didn't match.\nExpected: %q\nGiven: %q", expectedErrOutput, errOutput)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUiHookPreApply_destroy(t *testing.T) {
|
2017-08-14 17:19:40 +02:00
|
|
|
ui := cli.NewMockUi()
|
2017-03-13 21:09:25 +01:00
|
|
|
h := &UiHook{
|
|
|
|
Colorize: &colorstring.Colorize{
|
|
|
|
Colors: colorstring.DefaultColors,
|
|
|
|
Disable: true,
|
|
|
|
Reset: true,
|
|
|
|
},
|
|
|
|
Ui: ui,
|
|
|
|
}
|
|
|
|
h.init()
|
|
|
|
h.resources = map[string]uiResourceState{
|
|
|
|
"data.aws_availability_zones.available": uiResourceState{
|
|
|
|
Op: uiResourceDestroy,
|
|
|
|
Start: time.Now(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
n := &terraform.InstanceInfo{
|
|
|
|
Id: "data.aws_availability_zones.available",
|
|
|
|
ModulePath: []string{"root"},
|
|
|
|
Type: "aws_availability_zones",
|
|
|
|
}
|
|
|
|
|
|
|
|
s := &terraform.InstanceState{
|
|
|
|
ID: "2017-03-05 10:56:59.298784526 +0000 UTC",
|
|
|
|
Attributes: map[string]string{
|
|
|
|
"id": "2017-03-05 10:56:59.298784526 +0000 UTC",
|
|
|
|
"names.#": "4",
|
|
|
|
"names.0": "us-east-1a",
|
|
|
|
"names.1": "us-east-1b",
|
|
|
|
"names.2": "us-east-1c",
|
|
|
|
"names.3": "us-east-1d",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
d := &terraform.InstanceDiff{
|
|
|
|
Destroy: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
action, err := h.PreApply(n, s, d)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if action != terraform.HookActionContinue {
|
|
|
|
t.Fatalf("Expected hook to continue, given: %#v", action)
|
|
|
|
}
|
|
|
|
|
2017-04-04 16:41:54 +02:00
|
|
|
expectedOutput := "data.aws_availability_zones.available: Destroying... (ID: 2017-03-05 10:56:59.298784526 +0000 UTC)\n"
|
2017-03-13 21:09:25 +01:00
|
|
|
output := ui.OutputWriter.String()
|
|
|
|
if output != expectedOutput {
|
|
|
|
t.Fatalf("Output didn't match.\nExpected: %q\nGiven: %q", expectedOutput, output)
|
|
|
|
}
|
|
|
|
|
|
|
|
expectedErrOutput := ""
|
|
|
|
errOutput := ui.ErrorWriter.String()
|
|
|
|
if errOutput != expectedErrOutput {
|
|
|
|
t.Fatalf("Error output didn't match.\nExpected: %q\nGiven: %q", expectedErrOutput, errOutput)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUiHookPostApply_emptyState(t *testing.T) {
|
2017-08-14 17:19:40 +02:00
|
|
|
ui := cli.NewMockUi()
|
2017-03-13 21:09:25 +01:00
|
|
|
h := &UiHook{
|
|
|
|
Colorize: &colorstring.Colorize{
|
|
|
|
Colors: colorstring.DefaultColors,
|
|
|
|
Disable: true,
|
|
|
|
Reset: true,
|
|
|
|
},
|
|
|
|
Ui: ui,
|
|
|
|
}
|
|
|
|
h.init()
|
|
|
|
h.resources = map[string]uiResourceState{
|
|
|
|
"data.google_compute_zones.available": uiResourceState{
|
|
|
|
Op: uiResourceDestroy,
|
|
|
|
Start: time.Now(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
n := &terraform.InstanceInfo{
|
|
|
|
Id: "data.google_compute_zones.available",
|
|
|
|
ModulePath: []string{"root"},
|
|
|
|
Type: "google_compute_zones",
|
|
|
|
}
|
|
|
|
action, err := h.PostApply(n, nil, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if action != terraform.HookActionContinue {
|
|
|
|
t.Fatalf("Expected hook to continue, given: %#v", action)
|
|
|
|
}
|
|
|
|
|
2017-07-13 22:01:19 +02:00
|
|
|
expectedRegexp := "^data.google_compute_zones.available: Destruction complete after -?[a-z0-9.]+\n$"
|
2017-03-13 21:09:25 +01:00
|
|
|
output := ui.OutputWriter.String()
|
2017-07-13 22:01:19 +02:00
|
|
|
if matched, _ := regexp.MatchString(expectedRegexp, output); !matched {
|
|
|
|
t.Fatalf("Output didn't match regexp.\nExpected: %q\nGiven: %q", expectedRegexp, output)
|
2017-03-13 21:09:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
expectedErrOutput := ""
|
|
|
|
errOutput := ui.ErrorWriter.String()
|
|
|
|
if errOutput != expectedErrOutput {
|
|
|
|
t.Fatalf("Error output didn't match.\nExpected: %q\nGiven: %q", expectedErrOutput, errOutput)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-01 23:16:22 +01:00
|
|
|
func TestTruncateId(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
Input string
|
|
|
|
Expected string
|
|
|
|
MaxLen int
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "H...d",
|
|
|
|
MaxLen: 3,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "H...d",
|
|
|
|
MaxLen: 5,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "He...d",
|
|
|
|
MaxLen: 6,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "He...ld",
|
|
|
|
MaxLen: 7,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "Hel...ld",
|
|
|
|
MaxLen: 8,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "Hel...rld",
|
|
|
|
MaxLen: 9,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "Hell...rld",
|
|
|
|
MaxLen: 10,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "Hello world",
|
|
|
|
MaxLen: 11,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: "Hello world",
|
|
|
|
Expected: "Hello world",
|
|
|
|
MaxLen: 12,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
|
|
testName := fmt.Sprintf("%d", i)
|
|
|
|
t.Run(testName, func(t *testing.T) {
|
|
|
|
out := truncateId(tc.Input, tc.MaxLen)
|
|
|
|
if out != tc.Expected {
|
|
|
|
t.Fatalf("Expected %q to be shortened to %d as %q (given: %q)",
|
|
|
|
tc.Input, tc.MaxLen, tc.Expected, out)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|