2015-04-21 15:02:03 +00:00
|
|
|
package audit
|
|
|
|
|
|
|
|
import (
|
2015-04-22 05:41:53 +00:00
|
|
|
"fmt"
|
2015-04-21 15:02:03 +00:00
|
|
|
"reflect"
|
|
|
|
"testing"
|
2015-04-27 22:54:14 +00:00
|
|
|
"time"
|
2015-04-22 05:41:53 +00:00
|
|
|
|
|
|
|
"github.com/hashicorp/vault/logical"
|
2015-04-27 22:54:14 +00:00
|
|
|
"github.com/mitchellh/copystructure"
|
2015-04-21 15:02:03 +00:00
|
|
|
)
|
|
|
|
|
2015-04-27 22:54:14 +00:00
|
|
|
func TestCopy_auth(t *testing.T) {
|
|
|
|
// Make a non-pointer one so that it can't be modified directly
|
|
|
|
expected := logical.Auth{
|
|
|
|
LeaseOptions: logical.LeaseOptions{
|
|
|
|
Lease: 1 * time.Hour,
|
|
|
|
LeaseIssue: time.Now().UTC(),
|
|
|
|
},
|
|
|
|
|
|
|
|
ClientToken: "foo",
|
|
|
|
}
|
|
|
|
auth := expected
|
|
|
|
|
|
|
|
// Copy it
|
|
|
|
dup, err := copystructure.Copy(&auth)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check equality
|
|
|
|
auth2 := dup.(*logical.Auth)
|
|
|
|
if !reflect.DeepEqual(*auth2, expected) {
|
|
|
|
t.Fatalf("bad:\n\n%#v\n\n%#v", *auth2, expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCopy_request(t *testing.T) {
|
|
|
|
// Make a non-pointer one so that it can't be modified directly
|
|
|
|
expected := logical.Request{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
arg := expected
|
|
|
|
|
|
|
|
// Copy it
|
|
|
|
dup, err := copystructure.Copy(&arg)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check equality
|
|
|
|
arg2 := dup.(*logical.Request)
|
|
|
|
if !reflect.DeepEqual(*arg2, expected) {
|
|
|
|
t.Fatalf("bad:\n\n%#v\n\n%#v", *arg2, expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCopy_response(t *testing.T) {
|
|
|
|
// Make a non-pointer one so that it can't be modified directly
|
|
|
|
expected := logical.Response{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
arg := expected
|
|
|
|
|
|
|
|
// Copy it
|
|
|
|
dup, err := copystructure.Copy(&arg)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check equality
|
|
|
|
arg2 := dup.(*logical.Response)
|
|
|
|
if !reflect.DeepEqual(*arg2, expected) {
|
|
|
|
t.Fatalf("bad:\n\n%#v\n\n%#v", *arg2, expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-22 05:41:53 +00:00
|
|
|
func TestHash(t *testing.T) {
|
2015-06-19 10:31:19 +00:00
|
|
|
now := time.Now().UTC()
|
|
|
|
|
2015-04-22 05:41:53 +00:00
|
|
|
cases := []struct {
|
|
|
|
Input interface{}
|
|
|
|
Output interface{}
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
&logical.Auth{ClientToken: "foo"},
|
|
|
|
&logical.Auth{ClientToken: "sha1:0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
&logical.Request{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
&logical.Request{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"foo": "sha1:62cdb7020ff920e5aa642c3d4066950dd1f01f4d",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
&logical.Response{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
&logical.Response{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"foo": "sha1:62cdb7020ff920e5aa642c3d4066950dd1f01f4d",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2015-04-22 05:42:37 +00:00
|
|
|
{
|
|
|
|
"foo",
|
|
|
|
"foo",
|
|
|
|
},
|
2015-06-19 10:31:19 +00:00
|
|
|
{
|
|
|
|
&logical.Auth{
|
|
|
|
LeaseOptions: logical.LeaseOptions{
|
|
|
|
Lease: 1 * time.Hour,
|
|
|
|
LeaseIssue: now,
|
|
|
|
},
|
|
|
|
|
|
|
|
ClientToken: "foo",
|
|
|
|
},
|
|
|
|
&logical.Auth{
|
|
|
|
LeaseOptions: logical.LeaseOptions{
|
|
|
|
Lease: 1 * time.Hour,
|
|
|
|
LeaseIssue: now,
|
|
|
|
},
|
|
|
|
|
|
|
|
ClientToken: "sha1:0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33",
|
|
|
|
},
|
|
|
|
},
|
2015-04-22 05:41:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range cases {
|
|
|
|
input := fmt.Sprintf("%#v", tc.Input)
|
|
|
|
if err := Hash(tc.Input); err != nil {
|
|
|
|
t.Fatalf("err: %s\n\n%s", err, input)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(tc.Input, tc.Output) {
|
|
|
|
t.Fatalf("bad:\n\n%s\n\n%#v\n\n%#v", input, tc.Input, tc.Output)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-21 15:02:03 +00:00
|
|
|
func TestHashWalker(t *testing.T) {
|
|
|
|
replaceText := "foo"
|
|
|
|
|
|
|
|
cases := []struct {
|
|
|
|
Input interface{}
|
|
|
|
Output interface{}
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
map[string]interface{}{
|
|
|
|
"hello": "foo",
|
|
|
|
},
|
|
|
|
map[string]interface{}{
|
|
|
|
"hello": replaceText,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
map[string]interface{}{
|
|
|
|
"hello": []interface{}{"world"},
|
|
|
|
},
|
|
|
|
map[string]interface{}{
|
|
|
|
"hello": []interface{}{replaceText},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range cases {
|
|
|
|
output, err := HashStructure(tc.Input, func(string) (string, error) {
|
|
|
|
return replaceText, nil
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s\n\n%#v", err, tc.Input)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(output, tc.Output) {
|
|
|
|
t.Fatalf("bad:\n\n%#v\n\n%#v", tc.Input, output)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-04-21 15:14:26 +00:00
|
|
|
|
|
|
|
func TestHashSHA1(t *testing.T) {
|
|
|
|
fn := HashSHA1("")
|
|
|
|
result, err := fn("foo")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if result != "sha1:0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" {
|
|
|
|
t.Fatalf("bad: %#v", result)
|
|
|
|
}
|
|
|
|
}
|