mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-10 05:52:20 +08:00
147 lines
2.6 KiB
Go
147 lines
2.6 KiB
Go
package ctxutil
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
travis "github.com/jbenet/go-ipfs/util/testutil/ci/travis"
|
|
|
|
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.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 travis.IsRunning() {
|
|
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 travis.IsRunning() {
|
|
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")
|
|
}
|
|
|
|
}
|