Open
Description
Proposal Details
The accepted proposal #36532 added a Context method to testing.T
, which is great, but I can think of two straightforward ways to improve its usefulness further:
- Expose
T.Deadline()
as the deadline for the context. There are (hopefully rare) cases where something needs to propagate deadline information to something that isn't go, e.g. a subprocess, where simple cancelation may not be sufficient. Even in cases where the final consumer of the context is go, it's helpful for e.g. logging to be able to distinguish between a context cancelled due to a timeout vs. cancelled for some other reason. This should be as simple as swapping outcontext.WithCancel
forcontext.WithDeadline
where appropriate. - Create a
trace.Task
named for the test. When running a trace or benchmark with-trace
, it can be handy to be able to track back regions to specific tests. This, too, is fairly low-cost given that thetesting
package already depends onruntime/trace
.
Metadata
Metadata
Assignees
Type
Projects
Status
Incoming
Milestone
Relationships
Development
No branches or pull requests
Activity
gabyhelp commentedon Nov 21, 2024
Related Issues
(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)
smithamax commentedon Feb 22, 2025
Now that
T.Context()
is out, wouldn't this potentially break existing tests that check for the existence of a deadline. Would have been nice if it was in there from the start, but I don't think it can be added nowadam-azarchs commentedon Feb 25, 2025
The presence or absence of a deadline isn't specified in the
T.Context()
API; undefined behavior is fair game for changes. Alternatively, if this is deemed a serious issue, then we do now have the ability to conditionalize the behavior based on the go version declared in thego.mod
. It seems very unlikely that setting the deadline would in itself change the behavior of called code.The main use cases I'd see for setting the deadline:
context.Context
for cancelation where you'd really like to have stuff abort if things time out. For example, maybe those onhttp.ResponseController
.context.Context
because they're not go.I suppose it's true that one could always just put in
but aside from being simply awkward, it's also not quite the same behavior because of the need to deal with the
CancelFunc
.t.Context()
#72875