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  `