tree 73fd0f50e7c42d48e77a5e1562fe704fee13a6b1
parent 3c6fc224d6252f9eebbe0e7b873bdf2c45969bbf
author Nate Bosch <nbosch@google.com> 1617203401 -0700
committer GitHub <noreply@github.com> 1617203401 -0700
gpgsig -----BEGIN PGP SIGNATURE-----
 
 wsBcBAABCAAQBQJgZJDJCRBK7hj4Ov3rIwAAdHIIAA/uZMzAkQ83YFXavINinv2B
 +BkOKA+7drm7QMPe6suX3OJiFr0LwNOnQQbKsNgeFV83ePkXT39eQWF06bAJAU9m
 UIgnJhn8K2PbbRKY5LscTR7X7G9f+IQZc6flBrCoEfwfiQOv9zBvW+X514rCL991
 cyvVXVmFofN8bXyMEo80psLUk61z1lbEsJeujtzWpN0KojTiHhJ+xBhGfbEIMCsH
 Ddu0oXfr9oDgWwY+zEePQCB8Wu2/9DgYf37Jbyfb6O2nnlSXvzkjKnVAJescnStV
 ENzPz8ivSuryQFw79ily7DZbE4iERpFOuxdUaP7ons7IxtLW+rB7RertYB7stvY=
 =eoPV
 -----END PGP SIGNATURE-----
 

Inline some zone interactions to a single function (#1481)

Combine the behavior of `Invoker.unclosable`, and `errorsDontStopTest`
into a single method since they were previously used in two places to
wrap the same intent.

Add a `runTearDowns` method on `Invoker`. Use it from `Declarer` where
it is running `tearDownAll` callbacks, and from `Invoker` where it is
running a test's `tearDown` callbacks. This is the only place (outside of
tests internal to this repo) that the `waitForOutstandignCallbacks` zone
will be nested and the only place where an `Invoker` is not closable. The
implementation is intended to provide the following properties:

- The outer "test", which may be either a `test` or a `tearDownAll`,
  will not be considered complete until all outstanding callbacks from
  all tear down callbacks are also complete. This is the reason for a
  call to `addOutstandingCallback` in `runTearDowns` which doesn't get
  removed until all outstanding callbacks from the tear down are also
  complete.
- Tear downs do not need to wait for all outstanding callbacks from
  previous tear downs before they can start. They do wait for the
  `Future` returned from prior tear downs. This is the reason that the
  loop waits for the `Completer` which is completed following the tear
  down callback, and the remainder of the `waitForOutstandingCallbacks`
  work is `unawaited`.
- If an error is thrown within a tear down callback, only that tear
  down's outstanding callbacks will be ignored - other tear down
  callbacks will continue to hold the test open as normal and the test
  will not be considered complete the way it would be if the error had come
  from the test body. This is the reason for the zone nesting, an error
  will make it seem as though outstanding callbacks completed in only
  the zone where the error is raised.
- Give a verbose name and a longer doc comment to the `closable`
  fields. Documents clearly the single intended purpose it has today, and
  should prevent it from being accidentally given an extra purpose without
  updating the doc.
- Remove the future that never completes part. As far as I can tell, it
  isn't an exercised code path today, and if a usage somehow cropped up
  it's very unlikely that a non-completing future would be the right
  behavior.

Make `waitForOutstandingCallbacks` private and rewrite the tests to call
`runTearDowns`.