github.com/hugorut/terraform@v1.1.3/src/cloud/e2e/main_test.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "os" 9 "os/exec" 10 "strings" 11 "testing" 12 13 tfe "github.com/hashicorp/go-tfe" 14 tfversion "github.com/hugorut/terraform/version" 15 ) 16 17 var terraformBin string 18 var cliConfigFileEnv string 19 20 var tfeClient *tfe.Client 21 var tfeHostname string 22 var tfeToken string 23 var verboseMode bool 24 25 func TestMain(m *testing.M) { 26 teardown := setup() 27 code := m.Run() 28 teardown() 29 30 os.Exit(code) 31 } 32 33 func accTest() bool { 34 // TF_ACC is set when we want to run acceptance tests, meaning it relies on 35 // network access. 36 return os.Getenv("TF_ACC") != "" 37 } 38 39 func hasHostname() bool { 40 return os.Getenv("TFE_HOSTNAME") != "" 41 } 42 43 func hasToken() bool { 44 return os.Getenv("TFE_TOKEN") != "" 45 } 46 47 func hasRequiredEnvVars() bool { 48 return accTest() && hasHostname() && hasToken() 49 } 50 51 func skipIfMissingEnvVar(t *testing.T) { 52 if !hasRequiredEnvVars() { 53 t.Skip("Skipping test, required environment variables missing. Use `TF_ACC`, `TFE_HOSTNAME`, `TFE_TOKEN`") 54 } 55 } 56 57 func setup() func() { 58 tfOutput := flag.Bool("tfoutput", false, "This flag produces the terraform output from tests.") 59 flag.Parse() 60 verboseMode = *tfOutput 61 62 setTfeClient() 63 teardown := setupBinary() 64 65 return func() { 66 teardown() 67 } 68 } 69 70 func setTfeClient() { 71 tfeHostname = os.Getenv("TFE_HOSTNAME") 72 tfeToken = os.Getenv("TFE_TOKEN") 73 74 cfg := &tfe.Config{ 75 Address: fmt.Sprintf("https://%s", tfeHostname), 76 Token: tfeToken, 77 } 78 79 if tfeHostname != "" && tfeToken != "" { 80 // Create a new TFE client. 81 client, err := tfe.NewClient(cfg) 82 if err != nil { 83 fmt.Printf("Could not create new tfe client: %v\n", err) 84 os.Exit(1) 85 } 86 tfeClient = client 87 } 88 } 89 90 func setupBinary() func() { 91 log.Println("Setting up terraform binary") 92 tmpTerraformBinaryDir, err := ioutil.TempDir("", "terraform-test") 93 if err != nil { 94 fmt.Printf("Could not create temp directory: %v\n", err) 95 os.Exit(1) 96 } 97 log.Println(tmpTerraformBinaryDir) 98 currentDir, err := os.Getwd() 99 defer os.Chdir(currentDir) 100 if err != nil { 101 fmt.Printf("Could not change directories: %v\n", err) 102 os.Exit(1) 103 } 104 // Getting top level dir 105 dirPaths := strings.Split(currentDir, "/") 106 log.Println(currentDir) 107 topLevel := len(dirPaths) - 3 108 topDir := strings.Join(dirPaths[0:topLevel], "/") 109 110 if err := os.Chdir(topDir); err != nil { 111 fmt.Printf("Could not change directories: %v\n", err) 112 os.Exit(1) 113 } 114 115 cmd := exec.Command( 116 "go", 117 "build", 118 "-o", tmpTerraformBinaryDir, 119 "-ldflags", fmt.Sprintf("-X \"github.com/hugorut/terraform/version.Prerelease=%s\"", tfversion.Prerelease), 120 ) 121 err = cmd.Run() 122 if err != nil { 123 fmt.Printf("Could not run exec command: %v\n", err) 124 os.Exit(1) 125 } 126 127 credFile := fmt.Sprintf("%s/dev.tfrc", tmpTerraformBinaryDir) 128 writeCredRC(credFile) 129 130 terraformBin = fmt.Sprintf("%s/terraform", tmpTerraformBinaryDir) 131 cliConfigFileEnv = fmt.Sprintf("TF_CLI_CONFIG_FILE=%s", credFile) 132 133 return func() { 134 os.RemoveAll(tmpTerraformBinaryDir) 135 } 136 } 137 138 func writeCredRC(file string) { 139 creds := credentialBlock() 140 f, err := os.Create(file) 141 if err != nil { 142 fmt.Printf("Could not create file: %v\n", err) 143 os.Exit(1) 144 } 145 _, err = f.WriteString(creds) 146 if err != nil { 147 fmt.Printf("Could not write credentials: %v\n", err) 148 os.Exit(1) 149 } 150 f.Close() 151 } 152 153 func credentialBlock() string { 154 return fmt.Sprintf(` 155 credentials "%s" { 156 token = "%s" 157 }`, tfeHostname, tfeToken) 158 }