1package diagnose
2
3import (
4	"context"
5	"strings"
6	"testing"
7	"time"
8
9	"github.com/hashicorp/vault/sdk/physical"
10)
11
12func TestStorageTimeout(t *testing.T) {
13
14	testCases := []struct {
15		errSubString string
16		mb           physical.Backend
17	}{
18		{
19			errSubString: LatencyWarning,
20			mb:           mockStorageBackend{callType: timeoutCallWrite},
21		},
22		{
23			errSubString: LatencyWarning,
24			mb:           mockStorageBackend{callType: timeoutCallRead},
25		},
26		{
27			errSubString: LatencyWarning,
28			mb:           mockStorageBackend{callType: timeoutCallDelete},
29		},
30		{
31			errSubString: storageErrStringWrite,
32			mb:           mockStorageBackend{callType: errCallWrite},
33		},
34		{
35			errSubString: storageErrStringDelete,
36			mb:           mockStorageBackend{callType: errCallDelete},
37		},
38		{
39			errSubString: storageErrStringRead,
40			mb:           mockStorageBackend{callType: errCallRead},
41		},
42		{
43			errSubString: wrongRWValsPrefix,
44			mb:           mockStorageBackend{callType: badReadCall},
45		},
46	}
47
48	for _, tc := range testCases {
49		var outErr error
50		var dur time.Duration
51		uuid := "foo"
52		backendCallType := tc.mb.(mockStorageBackend).callType
53		if callTypeToOp(backendCallType) == readOp {
54			dur, outErr = EndToEndLatencyCheckRead(context.Background(), uuid, tc.mb)
55		}
56		if callTypeToOp(backendCallType) == writeOp {
57			dur, outErr = EndToEndLatencyCheckWrite(context.Background(), uuid, tc.mb)
58		}
59		if callTypeToOp(backendCallType) == deleteOp {
60			dur, outErr = EndToEndLatencyCheckDelete(context.Background(), uuid, tc.mb)
61		}
62
63		if tc.errSubString == "" && outErr == nil {
64			// this is the success case where the Storage Latency check passes
65			continue
66		}
67		if tc.errSubString == LatencyWarning && dur > time.Duration(0) {
68			// this is the success case where the Storage Latency check successfully returns nonzero duration
69			continue
70		}
71		if !strings.Contains(outErr.Error(), tc.errSubString) {
72			t.Errorf("wrong error: expected %s to be contained in %s", tc.errSubString, outErr)
73		}
74	}
75}
76