restic/vendor/gopkg.in/tomb.v2/context_test.go

177 lines
3.9 KiB
Go

// +build go1.7
package tomb_test
import (
"context"
"testing"
"time"
"gopkg.in/tomb.v2"
)
func TestWithContext(t *testing.T) {
parent1, cancel1 := context.WithCancel(context.Background())
tb, child1 := tomb.WithContext(parent1)
if !tb.Alive() {
t.Fatalf("WithContext returned dead tomb")
}
if tb.Context(parent1) != child1 {
t.Fatalf("Context returned different context for same parent")
}
if tb.Context(nil) != child1 {
t.Fatalf("Context returned different context for nil parent")
}
select {
case <-child1.Done():
t.Fatalf("Tomb's child context was born dead")
default:
}
parent2, cancel2 := context.WithCancel(context.WithValue(context.Background(), "parent", "parent2"))
child2 := tb.Context(parent2)
if tb.Context(parent2) != child2 {
t.Fatalf("Context returned different context for same parent")
}
if child2.Value("parent") != "parent2" {
t.Fatalf("Child context didn't inherit its parent's properties")
}
select {
case <-child2.Done():
t.Fatalf("Tomb's child context was born dead")
default:
}
cancel2()
select {
case <-child2.Done():
default:
t.Fatalf("Tomb's child context didn't die after parent was canceled")
}
if !tb.Alive() {
t.Fatalf("Canceling unrelated parent context killed tomb")
}
parent3 := context.WithValue(context.Background(), "parent", "parent3")
child3 := tb.Context(parent3)
if child3.Value("parent") != "parent3" {
t.Fatalf("Child context didn't inherit its parent's properties")
}
select {
case <-child3.Done():
t.Fatalf("Tomb's child context was born dead")
default:
}
cancel1()
select {
case <-tb.Dying():
case <-time.After(5 * time.Second):
t.Fatalf("Canceling parent context did not kill tomb")
}
if tb.Err() != context.Canceled {
t.Fatalf("tomb should be %v, got %v", context.Canceled, tb.Err())
}
if tb.Context(parent1) == child1 || tb.Context(parent3) == child3 {
t.Fatalf("Tomb is dead and shouldn't be tracking children anymore")
}
select {
case <-child3.Done():
default:
t.Fatalf("Child context didn't die after tomb's death")
}
parent4 := context.WithValue(context.Background(), "parent", "parent4")
child4 := tb.Context(parent4)
select {
case <-child4.Done():
default:
t.Fatalf("Child context should be born canceled")
}
childnil := tb.Context(nil)
select {
case <-childnil.Done():
default:
t.Fatalf("Child context should be born canceled")
}
}
func TestContextNoParent(t *testing.T) {
var tb tomb.Tomb
parent2, cancel2 := context.WithCancel(context.WithValue(context.Background(), "parent", "parent2"))
child2 := tb.Context(parent2)
if tb.Context(parent2) != child2 {
t.Fatalf("Context returned different context for same parent")
}
if child2.Value("parent") != "parent2" {
t.Fatalf("Child context didn't inherit its parent's properties")
}
select {
case <-child2.Done():
t.Fatalf("Tomb's child context was born dead")
default:
}
cancel2()
select {
case <-child2.Done():
default:
t.Fatalf("Tomb's child context didn't die after parent was canceled")
}
if !tb.Alive() {
t.Fatalf("Canceling unrelated parent context killed tomb")
}
parent3 := context.WithValue(context.Background(), "parent", "parent3")
child3 := tb.Context(parent3)
if child3.Value("parent") != "parent3" {
t.Fatalf("Child context didn't inherit its parent's properties")
}
select {
case <-child3.Done():
t.Fatalf("Tomb's child context was born dead")
default:
}
tb.Kill(nil)
if tb.Context(parent3) == child3 {
t.Fatalf("Tomb is dead and shouldn't be tracking children anymore")
}
select {
case <-child3.Done():
default:
t.Fatalf("Child context didn't die after tomb's death")
}
parent4 := context.WithValue(context.Background(), "parent", "parent4")
child4 := tb.Context(parent4)
select {
case <-child4.Done():
default:
t.Fatalf("Child context should be born canceled")
}
childnil := tb.Context(nil)
select {
case <-childnil.Done():
default:
t.Fatalf("Child context should be born canceled")
}
}