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