github.com/Schaudge/grailbase@v0.0.0-20240223061707-44c758a471c0/security/keycrypt/keycrypt_test.go (about)

     1  // Copyright 2018 GRAIL, Inc. All rights reserved.
     2  // Use of this source code is governed by the Apache-2.0
     3  // license that can be found in the LICENSE file.
     4  
     5  package keycrypt
     6  
     7  import "testing"
     8  
     9  type testSecret struct {
    10  	path  string
    11  	value []byte
    12  }
    13  
    14  func (t *testSecret) Get() ([]byte, error) {
    15  	if len(t.value) == 0 {
    16  		return nil, ErrNoSuchSecret
    17  	}
    18  	return t.value, nil
    19  }
    20  
    21  func (t *testSecret) Put(v []byte) error {
    22  	t.value = make([]byte, len(v), len(v))
    23  	copy(t.value, v)
    24  	return nil
    25  }
    26  
    27  type testKeycrypt struct {
    28  	host    string
    29  	secrets map[string]*testSecret
    30  }
    31  
    32  func (t *testKeycrypt) Lookup(name string) Secret {
    33  	if t.secrets == nil {
    34  		t.secrets = make(map[string]*testSecret)
    35  	}
    36  	if t.secrets[name] == nil {
    37  		t.secrets[name] = &testSecret{path: name}
    38  	}
    39  	return t.secrets[name]
    40  }
    41  
    42  func TestMarshal(t *testing.T) {
    43  	kc := &testKeycrypt{}
    44  	type data struct {
    45  		A, B, C string
    46  	}
    47  	s := kc.Lookup("foo/bar")
    48  	put := data{"a", "b", "c"}
    49  	if err := PutJSON(s, &put); err != nil {
    50  		t.Fatal(err)
    51  	}
    52  	var get data
    53  	if err := GetJSON(s, &get); err != nil {
    54  		t.Fatal(err)
    55  	}
    56  	if got, want := get, put; got != want {
    57  		t.Fatalf("got %v, want %v", got, want)
    58  	}
    59  }
    60  
    61  func TestResolver(t *testing.T) {
    62  	RegisterFunc("test", func(host string) Keycrypt {
    63  		return &testKeycrypt{host: host}
    64  	})
    65  	defer unregister("test")
    66  	s, err := Lookup("test://host/path/to/blah")
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  	ts, ok := s.(*testSecret)
    71  	if !ok {
    72  		t.Fatal("bad secret type")
    73  	}
    74  	if want, got := "path/to/blah", ts.path; got != want {
    75  		t.Fatalf("got %q, want %q", got, want)
    76  	}
    77  }