mirror of https://github.com/restic/restic.git
177 lines
3.9 KiB
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")
|
|
}
|
|
}
|