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