github.com/lfch/etcd-io/tests/v3@v3.0.0-20221004140520-eac99acd3e9d/framework/testutils/execute.go (about) 1 // Copyright 2022 The etcd Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package testutils 16 17 import ( 18 "context" 19 "fmt" 20 "testing" 21 "time" 22 23 "github.com/lfch/etcd-io/client/pkg/v3/testutil" 24 ) 25 26 func ExecuteWithTimeout(t *testing.T, timeout time.Duration, f func()) { 27 ctx, cancel := context.WithTimeout(context.Background(), timeout) 28 defer cancel() 29 ExecuteUntil(ctx, t, f) 30 } 31 32 func ExecuteUntil(ctx context.Context, t *testing.T, f func()) { 33 deadline, deadlineSet := ctx.Deadline() 34 timeout := time.Until(deadline) 35 donec := make(chan struct{}) 36 go func() { 37 defer close(donec) 38 f() 39 }() 40 41 select { 42 case <-ctx.Done(): 43 msg := ctx.Err().Error() 44 if deadlineSet { 45 msg = fmt.Sprintf("test timed out after %v, err: %v", timeout, msg) 46 } 47 testutil.FatalStack(t, msg) 48 case <-donec: 49 } 50 }