Concurrency
context: 期限切れはcontext.DeadlineExceededとして観測する
WithTimeoutやWithDeadlineで期限が切れると、Errはcontext.DeadlineExceededになります。
Sourcedeadline.go
Go 1.22
package contextflow
import (
"context"
"time"
)
func WaitForDeadline(ctx context.Context) error {
<-ctx.Done()
return ctx.Err()
}
func ExpiredContext() (context.Context, context.CancelFunc) {
return context.WithDeadline(context.Background(), time.Now().Add(-time.Second))
}Testdeadline_test.go
Go 1.22
package contextflow
import (
"context"
"errors"
"testing"
)
func TestTimeout期限切れはContextDeadlineExceededを返す(t *testing.T) {
ctx, cancel := ExpiredContext()
defer cancel()
if err := WaitForDeadline(ctx); !errors.Is(err, context.DeadlineExceeded) {
t.Fatalf("WaitForDeadline() = %v, want DeadlineExceeded", err)
}
}01Assertion
このテストで確認できること
- すでに過去のdeadlineを持つcontextを作る
- Doneの後にErrを読むとDeadlineExceededになる
キャンセルと期限切れを同じ失敗として扱わない場合は、errors.Isでcontext.Canceledとcontext.DeadlineExceededを分けます。テストでは時間待ちでなく過去の期限を使うと安定します。
OBSERVED RESULT
<-ctx.Done()
ctx.Err() → context deadline exceeded