| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package pkiext |
| |
| import ( |
| "bufio" |
| "bytes" |
| "crypto" |
| "crypto/x509" |
| "encoding/pem" |
| "fmt" |
| "testing" |
| |
| "github.com/hashicorp/vault/sdk/helper/certutil" |
| "github.com/hashicorp/vault/sdk/logical" |
| |
| "github.com/stretchr/testify/require" |
| ) |
| |
| func requireFieldsSetInResp(t *testing.T, resp *logical.Response, fields ...string) { |
| var missingFields []string |
| for _, field := range fields { |
| value, ok := resp.Data[field] |
| if !ok || value == nil { |
| missingFields = append(missingFields, field) |
| } |
| } |
| |
| require.Empty(t, missingFields, "The following fields were required but missing from response:\n%v", resp.Data) |
| } |
| |
| func requireSuccessNonNilResponse(t *testing.T, resp *logical.Response, err error, msgAndArgs ...interface{}) { |
| require.NoError(t, err, msgAndArgs...) |
| if resp.IsError() { |
| errContext := fmt.Sprintf("Expected successful response but got error: %v", resp.Error()) |
| require.Falsef(t, resp.IsError(), errContext, msgAndArgs...) |
| } |
| require.NotNil(t, resp, msgAndArgs...) |
| } |
| |
| func requireSuccessNilResponse(t *testing.T, resp *logical.Response, err error, msgAndArgs ...interface{}) { |
| require.NoError(t, err, msgAndArgs...) |
| if resp.IsError() { |
| errContext := fmt.Sprintf("Expected successful response but got error: %v", resp.Error()) |
| require.Falsef(t, resp.IsError(), errContext, msgAndArgs...) |
| } |
| if resp != nil { |
| msg := fmt.Sprintf("expected nil response but got: %v", resp) |
| require.Nilf(t, resp, msg, msgAndArgs...) |
| } |
| } |
| |
| func parseCert(t *testing.T, pemCert string) *x509.Certificate { |
| block, _ := pem.Decode([]byte(pemCert)) |
| require.NotNil(t, block, "failed to decode PEM block") |
| |
| cert, err := x509.ParseCertificate(block.Bytes) |
| require.NoError(t, err) |
| return cert |
| } |
| |
| func parseKey(t *testing.T, pemKey string) crypto.Signer { |
| block, _ := pem.Decode([]byte(pemKey)) |
| require.NotNil(t, block, "failed to decode PEM block") |
| |
| key, _, err := certutil.ParseDERKey(block.Bytes) |
| require.NoError(t, err) |
| return key |
| } |
| |
| type LogConsumerWriter struct { |
| Consumer func(string) |
| } |
| |
| func (l LogConsumerWriter) Write(p []byte) (n int, err error) { |
| // TODO this assumes that we're never passed partial log lines, which |
| // seems a safe assumption for now based on how docker looks to implement |
| // logging, but might change in the future. |
| scanner := bufio.NewScanner(bytes.NewReader(p)) |
| scanner.Buffer(make([]byte, 64*1024), bufio.MaxScanTokenSize) |
| for scanner.Scan() { |
| l.Consumer(scanner.Text()) |
| } |
| return len(p), nil |
| } |