-
Notifications
You must be signed in to change notification settings - Fork 17.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
testing: add (*T).Deadline #28135
Comments
Another option would be to add a t.Deadline and leave context creation up to the test. |
|
The way I see it, current testing is very simple and I like it that way. Adding a |
The last attempt at adding Context was trying to signal "this test is done, all you helpers can go away". I don't see why we should prefer one over the other. They both seem very indirect. The fact that there were these two very different plausible uses suggests that having plain t.Context will be confusing to people expecting one or the other (or a third equally plausible meaning). If the goal is to expose timeout information, let's focus on an API that does that well, instead of shoehorning it into context. |
@rsc are you OK with Per @golang/proposal-review |
This appears to be related, if not a resurrection of #18368 which was FrozenDueToAge. I'm adding this comment here to act as a trail of breadcrumbs, hoping that the link will show up in the older proposal. |
Sure, let's try adding t.Deadline for Go 1.13. |
We should prefer the second over the first because
Using Using It also fits in really well with the Stdlib's adoption of |
In #18368 (comment) you closed the issue because
It isn't a testing specific problem yes, but because of I guess if #15758 is done, then a testing specific solution doesn't matter. |
I want to share a potentially relevant experience report. I found context deadlines/timeouts are a great fit for strict cancellation purposes, but it's trickier to use them for "putting a bound on time to compute some result". Specifically, when there's only one explicit time provided, it's not very obvious whether the "grace period" should be on the caller or callee side. When it's on the caller side (i.e., the As a result, I found it worked better to make it completely a responsibility of the callee to finish and return before the deadline. The downside of this is that it complicates all callee code. |
The need for a grace period — and the fact that the appropriate duration for it depends on the details of the test — seems like a great reason to favor |
Change https://golang.org/cl/202758 mentions this issue: |
This issue is currently labeled as early-in-cycle for Go 1.15. That time is now, so friendly ping. If it no longer needs to be done early in cycle, that label can be removed. |
Background
#16221 added a
func (*T) Context() context.Context
to the testing package, which was backed out due to concerns from @dsnet, @neild, @niemeyer, me, and perhaps others as well (#18199).CL 134395 (
errgroup
propagation ofGoexit
, among other things) mitigates those concerns somewhat: it gives test authors a straightforward way to start a collection of goroutines and wait for them to finish, and cancels them if any of the goroutines callst.FailNow
ort.SkipNow
(#15758 notwithstanding).That leaves one use-case unaddressed: as @neild noted in the golang-dev thread and @dsnet noted in #18199 (comment), if a test times out (e.g. because of a deadlock in the package under test), it is often useful to shut it down cleanly and emit useful logs rather than wait for the
testing
package to dump all of the running goroutines.@bradfitz suggested that test authors can add their own derived context, but a test in general has no idea how much time it has left: if we want to check the
-test.timeout
flag, we need to be able to subtract off the amount of time spent so far, and that implies the use ofTestMain
and the boilerplate that goes with it.Proposal
I propose that we add back the
(*testing.T).Context
method, with the same signature as before but the following semantics:Done
, withErr
returningcontext.DeadlineExceeded
.Context
method (and their subtests) have returned, whichever occurs first.Failed
orSkipped
:Done
, withErr
returningcontext.Canceled
.Done
. That discourages the use of(*T).Context
for normal cleanup of “background” goroutines, which should be accomplished by some other means (sync.WaitGroup
,errgroup
,tomb
, or whatever alternative the test author prefers.)The text was updated successfully, but these errors were encountered: