github.com/emate/packer@v0.8.1-0.20150625195101-fe0fde195dc6/builder/googlecompute/config_test.go (about)

     1  package googlecompute
     2  
     3  import (
     4  	"io/ioutil"
     5  	"testing"
     6  )
     7  
     8  func testConfig(t *testing.T) map[string]interface{} {
     9  	return map[string]interface{}{
    10  		"account_file": testAccountFile(t),
    11  		"project_id":   "hashicorp",
    12  		"source_image": "foo",
    13  		"zone":         "us-east-1a",
    14  	}
    15  }
    16  
    17  func testConfigStruct(t *testing.T) *Config {
    18  	c, warns, errs := NewConfig(testConfig(t))
    19  	if len(warns) > 0 {
    20  		t.Fatalf("bad: %#v", len(warns))
    21  	}
    22  	if errs != nil {
    23  		t.Fatalf("bad: %#v", errs)
    24  	}
    25  
    26  	return c
    27  }
    28  
    29  func testConfigErr(t *testing.T, warns []string, err error, extra string) {
    30  	if len(warns) > 0 {
    31  		t.Fatalf("bad: %#v", warns)
    32  	}
    33  	if err == nil {
    34  		t.Fatalf("should error: %s", extra)
    35  	}
    36  }
    37  
    38  func testConfigOk(t *testing.T, warns []string, err error) {
    39  	if len(warns) > 0 {
    40  		t.Fatalf("bad: %#v", warns)
    41  	}
    42  	if err != nil {
    43  		t.Fatalf("bad: %s", err)
    44  	}
    45  }
    46  
    47  func TestConfigPrepare(t *testing.T) {
    48  	cases := []struct {
    49  		Key   string
    50  		Value interface{}
    51  		Err   bool
    52  	}{
    53  		{
    54  			"unknown_key",
    55  			"bad",
    56  			true,
    57  		},
    58  
    59  		{
    60  			"private_key_file",
    61  			"/tmp/i/should/not/exist",
    62  			true,
    63  		},
    64  
    65  		{
    66  			"project_id",
    67  			nil,
    68  			true,
    69  		},
    70  		{
    71  			"project_id",
    72  			"foo",
    73  			false,
    74  		},
    75  
    76  		{
    77  			"source_image",
    78  			nil,
    79  			true,
    80  		},
    81  		{
    82  			"source_image",
    83  			"foo",
    84  			false,
    85  		},
    86  
    87  		{
    88  			"zone",
    89  			nil,
    90  			true,
    91  		},
    92  		{
    93  			"zone",
    94  			"foo",
    95  			false,
    96  		},
    97  
    98  		{
    99  			"ssh_timeout",
   100  			"SO BAD",
   101  			true,
   102  		},
   103  		{
   104  			"ssh_timeout",
   105  			"5s",
   106  			false,
   107  		},
   108  
   109  		{
   110  			"state_timeout",
   111  			"SO BAD",
   112  			true,
   113  		},
   114  		{
   115  			"state_timeout",
   116  			"5s",
   117  			false,
   118  		},
   119  		{
   120  			"use_internal_ip",
   121  			nil,
   122  			false,
   123  		},
   124  		{
   125  			"use_internal_ip",
   126  			false,
   127  			false,
   128  		},
   129  		{
   130  			"use_internal_ip",
   131  			"SO VERY BAD",
   132  			true,
   133  		},
   134  	}
   135  
   136  	for _, tc := range cases {
   137  		raw := testConfig(t)
   138  
   139  		if tc.Value == nil {
   140  			delete(raw, tc.Key)
   141  		} else {
   142  			raw[tc.Key] = tc.Value
   143  		}
   144  
   145  		_, warns, errs := NewConfig(raw)
   146  
   147  		if tc.Err {
   148  			testConfigErr(t, warns, errs, tc.Key)
   149  		} else {
   150  			testConfigOk(t, warns, errs)
   151  		}
   152  	}
   153  }
   154  
   155  func testAccountFile(t *testing.T) string {
   156  	tf, err := ioutil.TempFile("", "packer")
   157  	if err != nil {
   158  		t.Fatalf("err: %s", err)
   159  	}
   160  	defer tf.Close()
   161  
   162  	if _, err := tf.Write([]byte(testAccountContent)); err != nil {
   163  		t.Fatalf("err: %s", err)
   164  	}
   165  
   166  	return tf.Name()
   167  }
   168  
   169  // This is just some dummy data that doesn't actually work (it was revoked
   170  // a long time ago).
   171  const testAccountContent = `{}`