1package file
2
3import (
4	"fmt"
5	"io/ioutil"
6	"os"
7	"path/filepath"
8	"testing"
9
10	hclog "github.com/hashicorp/go-hclog"
11	uuid "github.com/hashicorp/go-uuid"
12	"github.com/hashicorp/vault/command/agent/sink"
13	"github.com/hashicorp/vault/sdk/helper/logging"
14)
15
16const (
17	fileServerTestDir = "vault-agent-file-test"
18)
19
20func testFileSink(t *testing.T, log hclog.Logger) (*sink.SinkConfig, string) {
21	tmpDir, err := ioutil.TempDir("", fmt.Sprintf("%s.", fileServerTestDir))
22	if err != nil {
23		t.Fatal(err)
24	}
25
26	path := filepath.Join(tmpDir, "token")
27
28	config := &sink.SinkConfig{
29		Logger: log.Named("sink.file"),
30		Config: map[string]interface{}{
31			"path": path,
32		},
33	}
34
35	s, err := NewFileSink(config)
36	if err != nil {
37		t.Fatal(err)
38	}
39	config.Sink = s
40
41	return config, tmpDir
42}
43
44func TestFileSink(t *testing.T) {
45	log := logging.NewVaultLogger(hclog.Trace)
46
47	fs, tmpDir := testFileSink(t, log)
48	defer os.RemoveAll(tmpDir)
49
50	path := filepath.Join(tmpDir, "token")
51
52	uuidStr, _ := uuid.GenerateUUID()
53	if err := fs.WriteToken(uuidStr); err != nil {
54		t.Fatal(err)
55	}
56
57	file, err := os.Open(path)
58	if err != nil {
59		t.Fatal(err)
60	}
61
62	fi, err := file.Stat()
63	if err != nil {
64		t.Fatal(err)
65	}
66	if fi.Mode() != os.FileMode(0640) {
67		t.Fatalf("wrong file mode was detected at %s", path)
68	}
69	err = file.Close()
70	if err != nil {
71		t.Fatal(err)
72	}
73
74	fileBytes, err := ioutil.ReadFile(path)
75	if err != nil {
76		t.Fatal(err)
77	}
78
79	if string(fileBytes) != uuidStr {
80		t.Fatalf("expected %s, got %s", uuidStr, string(fileBytes))
81	}
82}
83
84func testFileSinkMode(t *testing.T, log hclog.Logger) (*sink.SinkConfig, string) {
85	tmpDir, err := ioutil.TempDir("", fmt.Sprintf("%s.", fileServerTestDir))
86	if err != nil {
87		t.Fatal(err)
88	}
89
90	path := filepath.Join(tmpDir, "token")
91
92	config := &sink.SinkConfig{
93		Logger: log.Named("sink.file"),
94		Config: map[string]interface{}{
95			"path": path,
96			"mode": 0644,
97		},
98	}
99
100	s, err := NewFileSink(config)
101	if err != nil {
102		t.Fatal(err)
103	}
104	config.Sink = s
105
106	return config, tmpDir
107}
108
109func TestFileSinkMode(t *testing.T) {
110	log := logging.NewVaultLogger(hclog.Trace)
111
112	fs, tmpDir := testFileSinkMode(t, log)
113	defer os.RemoveAll(tmpDir)
114
115	path := filepath.Join(tmpDir, "token")
116
117	uuidStr, _ := uuid.GenerateUUID()
118	if err := fs.WriteToken(uuidStr); err != nil {
119		t.Fatal(err)
120	}
121
122	file, err := os.Open(path)
123	if err != nil {
124		t.Fatal(err)
125	}
126	defer file.Close()
127
128	fi, err := file.Stat()
129	if err != nil {
130		t.Fatal(err)
131	}
132	if fi.Mode() != os.FileMode(0644) {
133		t.Fatalf("wrong file mode was detected at %s", path)
134	}
135
136	fileBytes, err := ioutil.ReadFile(path)
137	if err != nil {
138		t.Fatal(err)
139	}
140
141	if string(fileBytes) != uuidStr {
142		t.Fatalf("expected %s, got %s", uuidStr, string(fileBytes))
143	}
144}
145