diff --git a/a_test.go b/a_test.go new file mode 100644 index 0000000..1b712a0 --- /dev/null +++ b/a_test.go @@ -0,0 +1,15 @@ +package sshvault + +import ( + "reflect" + "runtime" + "testing" +) + +/* Test Helpers */ +func expect(t *testing.T, a interface{}, b interface{}) { + _, fn, line, _ := runtime.Caller(1) + if a != b { + t.Errorf("Expected: %v (type %v) Got: %v (type %v) in %s:%d", a, reflect.TypeOf(a), b, reflect.TypeOf(b), fn, line) + } +} diff --git a/cache.go b/cache.go index 57f10a3..d8e2d4a 100644 --- a/cache.go +++ b/cache.go @@ -25,7 +25,7 @@ func Cache() *cache { } // Get return ssh-key -func (c *cache) Get(u string, k int) (string, error) { +func (c *cache) Get(s Schlosser, u string, k int) (string, error) { var ( uKey string hash string @@ -37,7 +37,7 @@ func (c *cache) Get(u string, k int) (string, error) { uKey = fmt.Sprintf("%s/%s.key-%d", c.dir, hash, k) } if !c.IsFile(uKey) { - keys, err := GetKey(u) + keys, err := s.GetKey(u) if err != nil { return "", err } diff --git a/getkey.go b/getkey.go index 35d96a1..da4de2f 100644 --- a/getkey.go +++ b/getkey.go @@ -12,8 +12,16 @@ import ( // GITHUB https://github.com/.keys const GITHUB = "https://github.com" +// Schlosser interface +type Schlosser interface { + GetKey(string) ([]string, error) +} + +// Locksmith implements Schlosser +type Locksmith struct{} + // GetKey fetches ssh-key from url -func GetKey(u string) ([]string, error) { +func (l Locksmith) GetKey(u string) ([]string, error) { url := u if !isURL.MatchString(u) { url = fmt.Sprintf("%s/%s.keys", GITHUB, u) diff --git a/getkey_test.go b/getkey_test.go new file mode 100644 index 0000000..68dc41f --- /dev/null +++ b/getkey_test.go @@ -0,0 +1,58 @@ +package sshvault + +import ( + "fmt" + "net/http" + "net/http/httptest" + "testing" +) + +func TestGetKeyFound(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + expect(t, "ssh-vault", r.Header.Get("User-agent")) + fmt.Fprintln(w, "ssh-rsa ABC") + })) + defer ts.Close() + + l := Locksmith{} + s, err := l.GetKey(ts.URL) + if err != nil { + t.Error(err) + } + expect(t, 1, len(s)) +} + +func TestGetKeyNotFound(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + expect(t, "ssh-vault", r.Header.Get("User-agent")) + })) + defer ts.Close() + + l := Locksmith{} + s, err := l.GetKey(ts.URL) + if err == nil { + t.Errorf("Expecting error") + } + expect(t, 0, len(s)) +} + +func TestGetKeyMultipleKeys(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + expect(t, "ssh-vault", r.Header.Get("User-agent")) + fmt.Fprintf(w, "%s\n%s\n%s\n%s\n%s\n\n\n", + "ssh-rsa ABC", + "no key", + "ssh-rsa ABC", + "ssh-foo ABC", + "ssh-rsa end", + ) + })) + defer ts.Close() + + l := Locksmith{} + s, err := l.GetKey(ts.URL) + if err != nil { + t.Error(err) + } + expect(t, 3, len(s)) +} diff --git a/vault.go b/vault.go index a47c95b..43a0352 100644 --- a/vault.go +++ b/vault.go @@ -31,6 +31,7 @@ func New(k, u, o, v string) (*vault, error) { keyPath string = k ) cache := Cache() + s := Locksmith{} if u != "" { // use -k N where N is the index to use when multiple keys // are available @@ -41,7 +42,7 @@ func New(k, u, o, v string) (*vault, error) { if ki <= 1 { ki = 1 } - keyPath, err = cache.Get(u, ki) + keyPath, err = cache.Get(s, u, ki) if err != nil { return nil, err }