File: object_test.go

package info (click to toggle)
golang-github-smallstep-crypto 0.63.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 3,800 kB
  • sloc: sh: 66; makefile: 50
file content (236 lines) | stat: -rw-r--r-- 5,456 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package kms

import (
	"bytes"
	"crypto"
	"crypto/ed25519"
	"crypto/rand"
	"encoding/pem"
	"io"
	"io/fs"
	"reflect"
	"sync"
	"testing"
	"time"

	"go.step.sm/crypto/pemutil"
)

func generateKey(t *testing.T) (crypto.PublicKey, *bytes.Buffer) {
	t.Helper()

	pub, _, err := ed25519.GenerateKey(rand.Reader)
	if err != nil {
		t.Fatal(err)
	}
	block, err := pemutil.Serialize(pub)
	if err != nil {
		t.Fatal(err)
	}
	return pub, bytes.NewBuffer(pem.EncodeToMemory(block))
}

func Test_object_FileMode(t *testing.T) {
	pub, pemData := generateKey(t)
	type fields struct {
		Path    string
		Object  interface{}
		pemData *bytes.Buffer
	}
	tests := []struct {
		name        string
		fields      fields
		wantName    string
		wantSize    int64
		wantMode    fs.FileMode
		wantModTime time.Time
		wantIsDir   bool
		wantSys     interface{}
	}{
		{"ok", fields{"path", pub, pemData}, "path", int64(pemData.Len()), 0400, time.Time{}, false, pub},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			o := &object{
				Path:    tt.fields.Path,
				Object:  tt.fields.Object,
				pemData: tt.fields.pemData,
			}
			if got := o.Name(); got != tt.wantName {
				t.Errorf("object.Name() = %v, want %v", got, tt.wantName)
			}
			if got := o.Size(); got != tt.wantSize {
				t.Errorf("object.Size() = %v, want %v", got, tt.wantSize)
			}
			if got := o.Mode(); got != tt.wantMode {
				t.Errorf("object.Mode() = %v, want %v", got, tt.wantMode)
			}
			if got := o.ModTime(); got != tt.wantModTime {
				t.Errorf("object.ModTime() = %v, want %v", got, tt.wantModTime)
			}
			if got := o.IsDir(); got != tt.wantIsDir {
				t.Errorf("object.IsDir() = %v, want %v", got, tt.wantIsDir)
			}
			if got := o.Sys(); !reflect.DeepEqual(got, tt.wantSys) {
				t.Errorf("object.Sys() = %v, want %v", got, tt.wantSys)
			}
		})
	}
}

func Test_object_load(t *testing.T) {
	pub, pemData := generateKey(t)
	type fields struct {
		Path   string
		Object interface{}
	}
	tests := []struct {
		name        string
		fields      fields
		wantPemData *bytes.Buffer
		wantErr     bool
	}{
		{"ok", fields{"path", pub}, pemData, false},
		{"fail", fields{"path", "not a key"}, nil, true},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			o := &object{
				Path:   tt.fields.Path,
				Object: tt.fields.Object,
			}
			if err := o.load(); (err != nil) != tt.wantErr {
				t.Errorf("object.load() error = %v, wantErr %v", err, tt.wantErr)
			}
			if !reflect.DeepEqual(o.pemData, tt.wantPemData) {
				t.Errorf("object.load() pemData = %s, wantPemData %s", o.pemData, tt.wantPemData)
			}
		})
	}
}

func Test_object_Stat(t *testing.T) {
	pub, pemData := generateKey(t)
	type fields struct {
		Path   string
		Object interface{}
	}
	tests := []struct {
		name    string
		fields  fields
		want    fs.FileInfo
		wantErr bool
	}{
		{"ok", fields{"path", pub}, &object{
			Path:    "path",
			Object:  pub,
			pemData: pemData,
		}, false},
		{"fail", fields{"path", "not a key"}, nil, true},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			o := &object{
				Path:   tt.fields.Path,
				Object: tt.fields.Object,
			}
			got, err := o.Stat()
			if (err != nil) != tt.wantErr {
				t.Errorf("object.Stat() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			// Normalize
			if got != nil {
				got.(*object).once = sync.Once{}
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("object.Stat() = %v, want %v", got, tt.want)
			}
		})
	}
}

func Test_object_Read(t *testing.T) {
	pub, pemData := generateKey(t)
	type fields struct {
		Path   string
		Object interface{}
	}
	type args struct {
		b []byte
	}
	tests := []struct {
		name      string
		fields    fields
		args      args
		wantN     int
		wantBytes []byte
		wantErr   bool
	}{
		{"ok", fields{"path", pub}, args{make([]byte, pemData.Len())}, pemData.Len(), pemData.Bytes(), false},
		{"empty", fields{"path", pub}, args{[]byte{}}, 0, []byte{}, false},
		{"fail", fields{"path", "not a key"}, args{[]byte{}}, 0, []byte{}, true},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			o := &object{
				Path:   tt.fields.Path,
				Object: tt.fields.Object,
			}
			got, err := o.Read(tt.args.b)
			if (err != nil) != tt.wantErr {
				t.Errorf("object.Read() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if got != tt.wantN {
				t.Errorf("object.Read() = %v, wanN %v", got, tt.wantN)
			}
			if !bytes.Equal(tt.args.b, tt.wantBytes) {
				t.Errorf("object.Read() = %v, wantBytes %v", tt.args.b, tt.wantBytes)
			}
		})
	}
}

func Test_object_Close(t *testing.T) {
	pub, _ := generateKey(t)
	o := &object{
		Path:   "path",
		Object: pub,
	}
	if err := o.load(); err != nil {
		t.Fatal(err)
	}

	tests := []struct {
		name    string
		o       *object
		want    *object
		wantErr bool
	}{
		{"ok", o, &object{
			Path:    "path",
			Object:  nil,
			pemData: nil,
			err:     io.EOF,
		}, false},
		{"eof", o, &object{
			Path:    "path",
			Object:  nil,
			pemData: nil,
			err:     io.EOF,
		}, true},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if err := tt.o.Close(); (err != nil) != tt.wantErr {
				t.Errorf("object.Close() error = %v, wantErr %v", err, tt.wantErr)
			}
			// Normalize
			tt.o.once = sync.Once{}
			if !reflect.DeepEqual(tt.o, tt.want) { //nolint:govet // variable names match crypto formulae docs
				t.Errorf("object.Close() = %v, want %v", tt.o, tt.want)
			}
		})
	}
}