mirror of
https://github.com/Luzifer/ansible-role-version.git
synced 2024-12-23 19:11:20 +00:00
146 lines
2.5 KiB
Go
146 lines
2.5 KiB
Go
|
package ctxext
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
context "golang.org/x/net/context"
|
||
|
)
|
||
|
|
||
|
// this test is on the context tool itself, not our stuff. it's for sanity on ours.
|
||
|
func TestDeadline(t *testing.T) {
|
||
|
if os.Getenv("TRAVIS") == "true" {
|
||
|
t.Skip("timeouts don't work reliably on travis")
|
||
|
}
|
||
|
|
||
|
ctx, _ := context.WithTimeout(context.Background(), 5*time.Millisecond)
|
||
|
|
||
|
select {
|
||
|
case <-ctx.Done():
|
||
|
t.Fatal("ended too early")
|
||
|
default:
|
||
|
}
|
||
|
|
||
|
<-time.After(6 * time.Millisecond)
|
||
|
|
||
|
select {
|
||
|
case <-ctx.Done():
|
||
|
default:
|
||
|
t.Fatal("ended too late")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestDeadlineFractionForever(t *testing.T) {
|
||
|
|
||
|
ctx, _ := WithDeadlineFraction(context.Background(), 0.5)
|
||
|
|
||
|
_, found := ctx.Deadline()
|
||
|
if found {
|
||
|
t.Fatal("should last forever")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestDeadlineFractionHalf(t *testing.T) {
|
||
|
if os.Getenv("TRAVIS") == "true" {
|
||
|
t.Skip("timeouts don't work reliably on travis")
|
||
|
}
|
||
|
|
||
|
ctx1, _ := context.WithTimeout(context.Background(), 10*time.Millisecond)
|
||
|
ctx2, _ := WithDeadlineFraction(ctx1, 0.5)
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
t.Fatal("ctx1 ended too early")
|
||
|
case <-ctx2.Done():
|
||
|
t.Fatal("ctx2 ended too early")
|
||
|
default:
|
||
|
}
|
||
|
|
||
|
<-time.After(2 * time.Millisecond)
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
t.Fatal("ctx1 ended too early")
|
||
|
case <-ctx2.Done():
|
||
|
t.Fatal("ctx2 ended too early")
|
||
|
default:
|
||
|
}
|
||
|
|
||
|
<-time.After(4 * time.Millisecond)
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
t.Fatal("ctx1 ended too early")
|
||
|
case <-ctx2.Done():
|
||
|
default:
|
||
|
t.Fatal("ctx2 ended too late")
|
||
|
}
|
||
|
|
||
|
<-time.After(6 * time.Millisecond)
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
default:
|
||
|
t.Fatal("ctx1 ended too late")
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func TestDeadlineFractionCancel(t *testing.T) {
|
||
|
|
||
|
ctx1, cancel1 := context.WithTimeout(context.Background(), 10*time.Millisecond)
|
||
|
ctx2, cancel2 := WithDeadlineFraction(ctx1, 0.5)
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
t.Fatal("ctx1 ended too early")
|
||
|
case <-ctx2.Done():
|
||
|
t.Fatal("ctx2 ended too early")
|
||
|
default:
|
||
|
}
|
||
|
|
||
|
cancel2()
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
t.Fatal("ctx1 should NOT be cancelled")
|
||
|
case <-ctx2.Done():
|
||
|
default:
|
||
|
t.Fatal("ctx2 should be cancelled")
|
||
|
}
|
||
|
|
||
|
cancel1()
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
case <-ctx2.Done():
|
||
|
default:
|
||
|
t.Fatal("ctx1 should be cancelled")
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func TestDeadlineFractionObeysParent(t *testing.T) {
|
||
|
|
||
|
ctx1, cancel1 := context.WithTimeout(context.Background(), 10*time.Millisecond)
|
||
|
ctx2, _ := WithDeadlineFraction(ctx1, 0.5)
|
||
|
|
||
|
select {
|
||
|
case <-ctx1.Done():
|
||
|
t.Fatal("ctx1 ended too early")
|
||
|
case <-ctx2.Done():
|
||
|
t.Fatal("ctx2 ended too early")
|
||
|
default:
|
||
|
}
|
||
|
|
||
|
cancel1()
|
||
|
|
||
|
select {
|
||
|
case <-ctx2.Done():
|
||
|
default:
|
||
|
t.Fatal("ctx2 should be cancelled")
|
||
|
}
|
||
|
|
||
|
}
|