1// Copyright 2016 The etcd Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package yaml
16
17import (
18	"io/ioutil"
19	"log"
20	"os"
21	"reflect"
22	"testing"
23
24	"github.com/ghodss/yaml"
25)
26
27var (
28	certPath       = "../../integration/fixtures/server.crt"
29	privateKeyPath = "../../integration/fixtures/server.key.insecure"
30	caPath         = "../../integration/fixtures/ca.crt"
31)
32
33func TestConfigFromFile(t *testing.T) {
34	tests := []struct {
35		ym *yamlConfig
36
37		werr bool
38	}{
39		{
40			&yamlConfig{},
41			false,
42		},
43		{
44			&yamlConfig{
45				InsecureTransport: true,
46			},
47			false,
48		},
49		{
50			&yamlConfig{
51				Keyfile:               privateKeyPath,
52				Certfile:              certPath,
53				TrustedCAfile:         caPath,
54				InsecureSkipTLSVerify: true,
55			},
56			false,
57		},
58		{
59			&yamlConfig{
60				Keyfile:  "bad",
61				Certfile: "bad",
62			},
63			true,
64		},
65		{
66			&yamlConfig{
67				Keyfile:       privateKeyPath,
68				Certfile:      certPath,
69				TrustedCAfile: "bad",
70			},
71			true,
72		},
73	}
74
75	for i, tt := range tests {
76		tmpfile, err := ioutil.TempFile("", "clientcfg")
77		if err != nil {
78			log.Fatal(err)
79		}
80
81		b, err := yaml.Marshal(tt.ym)
82		if err != nil {
83			t.Fatal(err)
84		}
85
86		_, err = tmpfile.Write(b)
87		if err != nil {
88			t.Fatal(err)
89		}
90		err = tmpfile.Close()
91		if err != nil {
92			t.Fatal(err)
93		}
94
95		cfg, cerr := NewConfig(tmpfile.Name())
96		if cerr != nil && !tt.werr {
97			t.Errorf("#%d: err = %v, want %v", i, cerr, tt.werr)
98			continue
99		}
100		if cerr != nil {
101			continue
102		}
103
104		if !reflect.DeepEqual(cfg.Endpoints, tt.ym.Endpoints) {
105			t.Errorf("#%d: endpoint = %v, want %v", i, cfg.Endpoints, tt.ym.Endpoints)
106		}
107
108		if tt.ym.InsecureTransport != (cfg.TLS == nil) {
109			t.Errorf("#%d: insecureTransport = %v, want %v", i, cfg.TLS == nil, tt.ym.InsecureTransport)
110		}
111
112		if !tt.ym.InsecureTransport {
113			if tt.ym.Certfile != "" && len(cfg.TLS.Certificates) == 0 {
114				t.Errorf("#%d: failed to load in cert", i)
115			}
116			if tt.ym.TrustedCAfile != "" && cfg.TLS.RootCAs == nil {
117				t.Errorf("#%d: failed to load in ca cert", i)
118			}
119			if cfg.TLS.InsecureSkipVerify != tt.ym.InsecureSkipTLSVerify {
120				t.Errorf("#%d: skipTLSVeify = %v, want %v", i, cfg.TLS.InsecureSkipVerify, tt.ym.InsecureSkipTLSVerify)
121			}
122		}
123
124		os.Remove(tmpfile.Name())
125	}
126}
127