You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							150 lines
						
					
					
						
							3.6 KiB
						
					
					
				| package testutil | |
| 
 | |
| import ( | |
| 	"fmt" | |
| 	"testing" | |
| 	"time" | |
| ) | |
| 
 | |
| // AssertEventually retries an assertion until it passes or times out | |
| func AssertEventually(t *testing.T, assertion func() error, timeout time.Duration, interval time.Duration, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 
 | |
| 	deadline := time.Now().Add(timeout) | |
| 	var lastErr error | |
| 
 | |
| 	for time.Now().Before(deadline) { | |
| 		if err := assertion(); err == nil { | |
| 			return // Success | |
| 		} else { | |
| 			lastErr = err | |
| 		} | |
| 		time.Sleep(interval) | |
| 	} | |
| 
 | |
| 	// Format the failure message | |
| 	var msg string | |
| 	if len(msgAndArgs) > 0 { | |
| 		if format, ok := msgAndArgs[0].(string); ok { | |
| 			msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 		} else { | |
| 			msg = fmt.Sprint(msgAndArgs...) | |
| 		} | |
| 	} else { | |
| 		msg = "assertion failed" | |
| 	} | |
| 
 | |
| 	t.Fatalf("%s after %v: %v", msg, timeout, lastErr) | |
| } | |
| 
 | |
| // AssertNoError fails the test if err is not nil | |
| func AssertNoError(t *testing.T, err error, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 	if err != nil { | |
| 		var msg string | |
| 		if len(msgAndArgs) > 0 { | |
| 			if format, ok := msgAndArgs[0].(string); ok { | |
| 				msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 			} else { | |
| 				msg = fmt.Sprint(msgAndArgs...) | |
| 			} | |
| 		} else { | |
| 			msg = "unexpected error" | |
| 		} | |
| 		t.Fatalf("%s: %v", msg, err) | |
| 	} | |
| } | |
| 
 | |
| // AssertError fails the test if err is nil | |
| func AssertError(t *testing.T, err error, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 	if err == nil { | |
| 		var msg string | |
| 		if len(msgAndArgs) > 0 { | |
| 			if format, ok := msgAndArgs[0].(string); ok { | |
| 				msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 			} else { | |
| 				msg = fmt.Sprint(msgAndArgs...) | |
| 			} | |
| 		} else { | |
| 			msg = "expected error but got nil" | |
| 		} | |
| 		t.Fatal(msg) | |
| 	} | |
| } | |
| 
 | |
| // AssertEqual fails the test if expected != actual | |
| func AssertEqual(t *testing.T, expected, actual interface{}, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 	if expected != actual { | |
| 		var msg string | |
| 		if len(msgAndArgs) > 0 { | |
| 			if format, ok := msgAndArgs[0].(string); ok { | |
| 				msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 			} else { | |
| 				msg = fmt.Sprint(msgAndArgs...) | |
| 			} | |
| 		} else { | |
| 			msg = "values not equal" | |
| 		} | |
| 		t.Fatalf("%s: expected %v, got %v", msg, expected, actual) | |
| 	} | |
| } | |
| 
 | |
| // AssertNotEqual fails the test if expected == actual | |
| func AssertNotEqual(t *testing.T, expected, actual interface{}, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 	if expected == actual { | |
| 		var msg string | |
| 		if len(msgAndArgs) > 0 { | |
| 			if format, ok := msgAndArgs[0].(string); ok { | |
| 				msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 			} else { | |
| 				msg = fmt.Sprint(msgAndArgs...) | |
| 			} | |
| 		} else { | |
| 			msg = "values should not be equal" | |
| 		} | |
| 		t.Fatalf("%s: both values are %v", msg, expected) | |
| 	} | |
| } | |
| 
 | |
| // AssertGreaterThan fails the test if actual <= expected | |
| func AssertGreaterThan(t *testing.T, expected, actual int, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 	if actual <= expected { | |
| 		var msg string | |
| 		if len(msgAndArgs) > 0 { | |
| 			if format, ok := msgAndArgs[0].(string); ok { | |
| 				msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 			} else { | |
| 				msg = fmt.Sprint(msgAndArgs...) | |
| 			} | |
| 		} else { | |
| 			msg = "value not greater than expected" | |
| 		} | |
| 		t.Fatalf("%s: expected > %d, got %d", msg, expected, actual) | |
| 	} | |
| } | |
| 
 | |
| // AssertContains fails the test if slice doesn't contain item | |
| func AssertContains(t *testing.T, slice []string, item string, msgAndArgs ...interface{}) { | |
| 	t.Helper() | |
| 	for _, s := range slice { | |
| 		if s == item { | |
| 			return // Found it | |
| 		} | |
| 	} | |
| 
 | |
| 	var msg string | |
| 	if len(msgAndArgs) > 0 { | |
| 		if format, ok := msgAndArgs[0].(string); ok { | |
| 			msg = fmt.Sprintf(format, msgAndArgs[1:]...) | |
| 		} else { | |
| 			msg = fmt.Sprint(msgAndArgs...) | |
| 		} | |
| 	} else { | |
| 		msg = "item not found in slice" | |
| 	} | |
| 	t.Fatalf("%s: %q not found in %v", msg, item, slice) | |
| }
 |