package helper import ( "context" "fmt" "sync" "testing" "time" ) // 模拟服务端任务 func mockServerTask(ctx context.Context) error { // 模拟从 context 中获取数据 value := ctx.Value("testKey") if value == nil { return fmt.Errorf("testKey not found in context") } // 模拟耗时操作 for i := 0; i < 5; i++ { select { case <-ctx.Done(): return ctx.Err() default: fmt.Printf("Task is running... Step %d\n", i+1) time.Sleep(1 * time.Second) } } fmt.Println("Task completed successfully") return nil } func TestCopyValueCtx(t *testing.T) { // 创建带有值的原始 context originalCtx := context.WithValue(context.Background(), "testKey", "testValue") // 模拟客户端取消 context clientCtx, cancel := context.WithCancel(originalCtx) defer cancel() // 复制只有 value 的 context serverCtx := CopyValueCtx(clientCtx) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // 执行带有超时控制的任务 err := RunTaskWithTimeout(serverCtx, mockServerTask, 10*time.Second) if err != nil { fmt.Printf("Task failed: %v\n", err) } }() // 模拟客户端断开连接 time.Sleep(2 * time.Second) wg.Wait() }