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)
							 | 
						|
								}
							 |