github.com/jsoriano/terraform@v0.6.7-0.20151026070445-8b70867fdd95/builtin/providers/azure/provider_test.go (about) 1 package azure 2 3 import ( 4 "io" 5 "io/ioutil" 6 "math/rand" 7 "os" 8 "strings" 9 "testing" 10 "time" 11 12 "github.com/hashicorp/terraform/config" 13 "github.com/hashicorp/terraform/helper/schema" 14 "github.com/hashicorp/terraform/terraform" 15 "github.com/mitchellh/go-homedir" 16 ) 17 18 var testAccProviders map[string]terraform.ResourceProvider 19 var testAccProvider *schema.Provider 20 21 const ( 22 testAccSecurityGroupName = "terraform-security-group" 23 testAccHostedServiceName = "terraform-testing-service" 24 ) 25 26 // testAccStorageServiceName is used as the name for the Storage Service 27 // created in all storage-related tests. 28 // It is much more convenient to provide a Storage Service which 29 // has been created beforehand as the creation of one takes a lot 30 // and would greatly impede the multitude of tests which rely on one. 31 // NOTE: the storage container should be located in `West US`. 32 var testAccStorageServiceName = os.Getenv("AZURE_STORAGE") 33 34 const testAccStorageContainerName = "terraform-testing-container" 35 36 func init() { 37 testAccProvider = Provider().(*schema.Provider) 38 testAccProviders = map[string]terraform.ResourceProvider{ 39 "azure": testAccProvider, 40 } 41 } 42 43 func TestProvider(t *testing.T) { 44 if err := Provider().(*schema.Provider).InternalValidate(); err != nil { 45 t.Fatalf("err: %s", err) 46 } 47 } 48 49 func TestProvider_impl(t *testing.T) { 50 var _ terraform.ResourceProvider = Provider() 51 } 52 53 func testAccPreCheck(t *testing.T) { 54 if v := os.Getenv("AZURE_SETTINGS_FILE"); v == "" { 55 subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID") 56 certificate := os.Getenv("AZURE_CERTIFICATE") 57 58 if subscriptionID == "" || certificate == "" { 59 t.Fatal("either AZURE_SETTINGS_FILE, or AZURE_SUBSCRIPTION_ID " + 60 "and AZURE_CERTIFICATE must be set for acceptance tests") 61 } 62 } 63 64 if v := os.Getenv("AZURE_STORAGE"); v == "" { 65 t.Fatal("AZURE_STORAGE must be set for acceptance tests") 66 } 67 } 68 69 func TestAzure_validateSettingsFile(t *testing.T) { 70 f, err := ioutil.TempFile("", "tf-test") 71 if err != nil { 72 t.Fatalf("Error creating temporary file in TestAzure_validateSettingsFile: %s", err) 73 } 74 defer os.Remove(f.Name()) 75 76 fx, err := ioutil.TempFile("", "tf-test-xml") 77 if err != nil { 78 t.Fatalf("Error creating temporary file with XML in TestAzure_validateSettingsFile: %s", err) 79 } 80 defer os.Remove(fx.Name()) 81 82 home, err := homedir.Dir() 83 if err != nil { 84 t.Fatalf("Error fetching homedir: %s", err) 85 } 86 fh, err := ioutil.TempFile(home, "tf-test-home") 87 if err != nil { 88 t.Fatalf("Error creating homedir-based temporary file: %s", err) 89 } 90 defer os.Remove(fh.Name()) 91 92 _, err = io.WriteString(fx, "<PublishData></PublishData>") 93 if err != nil { 94 t.Fatalf("Error writing XML File: %s", err) 95 } 96 fx.Close() 97 98 r := strings.NewReplacer(home, "~") 99 homePath := r.Replace(fh.Name()) 100 101 cases := []struct { 102 Input string // String of XML or a path to an XML file 103 W int // expected count of warnings 104 E int // expected count of errors 105 }{ 106 {"test", 1, 1}, 107 {f.Name(), 1, 0}, 108 {fx.Name(), 1, 0}, 109 {homePath, 1, 0}, 110 {"<PublishData></PublishData>", 0, 0}, 111 } 112 113 for _, tc := range cases { 114 w, e := validateSettingsFile(tc.Input, "") 115 116 if len(w) != tc.W { 117 t.Errorf("Error in TestAzureValidateSettingsFile: input: %s , warnings: %#v, errors: %#v", tc.Input, w, e) 118 } 119 if len(e) != tc.E { 120 t.Errorf("Error in TestAzureValidateSettingsFile: input: %s , warnings: %#v, errors: %#v", tc.Input, w, e) 121 } 122 } 123 } 124 125 func TestAzure_providerConfigure(t *testing.T) { 126 home, err := homedir.Dir() 127 if err != nil { 128 t.Fatalf("Error fetching homedir: %s", err) 129 } 130 fh, err := ioutil.TempFile(home, "tf-test-home") 131 if err != nil { 132 t.Fatalf("Error creating homedir-based temporary file: %s", err) 133 } 134 defer os.Remove(fh.Name()) 135 136 _, err = io.WriteString(fh, testAzurePublishSettingsStr) 137 if err != nil { 138 t.Fatalf("err: %s", err) 139 } 140 fh.Close() 141 142 r := strings.NewReplacer(home, "~") 143 homePath := r.Replace(fh.Name()) 144 145 cases := []struct { 146 SettingsFile string // String of XML or a path to an XML file 147 NilMeta bool // whether meta is expected to be nil 148 }{ 149 {testAzurePublishSettingsStr, false}, 150 {homePath, false}, 151 } 152 153 for _, tc := range cases { 154 rp := Provider() 155 raw := map[string]interface{}{ 156 "settings_file": tc.SettingsFile, 157 } 158 159 rawConfig, err := config.NewRawConfig(raw) 160 if err != nil { 161 t.Fatalf("err: %s", err) 162 } 163 164 err = rp.Configure(terraform.NewResourceConfig(rawConfig)) 165 meta := rp.(*schema.Provider).Meta() 166 if (meta == nil) != tc.NilMeta { 167 t.Fatalf("expected NilMeta: %t, got meta: %#v", tc.NilMeta, meta) 168 } 169 } 170 } 171 172 func TestAzure_isFile(t *testing.T) { 173 f, err := ioutil.TempFile("", "tf-test-file") 174 if err != nil { 175 t.Fatalf("Error creating temporary file with XML in TestAzure_isFile: %s", err) 176 } 177 cases := []struct { 178 Input string // String path to file 179 B bool // expected true/false 180 E bool // expect error 181 }{ 182 {"test", false, true}, 183 {f.Name(), true, false}, 184 } 185 186 for _, tc := range cases { 187 x, y := isFile(tc.Input) 188 if tc.B != x { 189 t.Errorf("Error in TestAzure_isFile: input: %s , returned: %#v, expected: %#v", tc.Input, x, tc.B) 190 } 191 192 if tc.E != (y != nil) { 193 t.Errorf("Error in TestAzure_isFile: input: %s , returned: %#v, expected: %#v", tc.Input, y, tc.E) 194 } 195 } 196 } 197 198 func genRandInt() int { 199 return rand.New(rand.NewSource(time.Now().UnixNano())).Int() % 100000 200 } 201 202 // testAzurePublishSettingsStr is a revoked publishsettings file 203 const testAzurePublishSettingsStr = ` 204 <?xml version="1.0" encoding="utf-8"?> 205 <PublishData> 206 <PublishProfile 207 SchemaVersion="2.0" 208 PublishMethod="AzureServiceManagementAPI"> 209 <Subscription 210 ServiceManagementUrl="https://management.core.windows.net" 211 Id="a65bf94f-26b3-4fb1-9d50-6e27c6096df1" 212 Name="terraform-testing" 213 ManagementCertificate="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" /> 214 </PublishProfile> 215 </PublishData> 216 `