)]}'
{
  "commit": "89a8b12bc7998b01e801cbeed82b3f64f49d1ef9",
  "tree": "9792b5180b470ca7e459b8b93321a9bae1e7daa5",
  "parents": [
    "09fb067979684dbd0918f664ec4d178975c84283"
  ],
  "author": {
    "name": "Nate Bosch",
    "email": "nbosch@google.com",
    "time": "Mon Dec 12 09:44:49 2022 -0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Dec 12 09:44:49 2022 -0800"
  },
  "message": "Don\u0027t ignore outstanding work on failure (#1815)\n\nFixes #1512\r\n\r\nThe test invoker tracks the work done by the test, both the callback\r\nbodies and the other work registered with the framework, and in the\r\ntypical case waits for it to complete before the test is considered\r\ndone.\r\n\r\nPreviously, any error would immediately ignore all outstanding work. In\r\nthe case of an unhandled async error, the test may still be using\r\nresources that will be cleaned up by the tear down.\r\n\r\nSome tests that previously would have failed quickly will now result in\r\na timeout. This should be uncommon, and will only impact tests that\r\nfail anyway.\r\n\r\n- Stop ignoring all outstanding work on any error.\r\n- Explicitly ignore outstanding work for a timeout.\r\n- Fix some cases that run tests that do fail and then timeout. These\r\n  tests had been manually incrementing the outstanding callback count\r\n  and relying on the known failure to prevent a timeout. Decrement the\r\n  outstanding callback count after the errors have been delivered.\r\n- More reliably decrement the outstanding work counter in a few\r\n  situations where an exception from a test callback could cause it to\r\n  be missed so it had to be cleaned up by the error handler.\r\n  - Use a try/finally around callbacks which introduce their own\r\n    outstanding work tracking zones.\r\n  - Use a try/catch/rethrow around the body for load suites (the\r\n    platform work including the user `main` method). Using a try/finally\r\n    can cause the runner to be held open waiting for `main` to complete\r\n    after a signal should have stopped tests.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3aa280c712b93eac508d0c7d4e3ad387b812a6f6",
      "old_mode": 33188,
      "old_path": "pkgs/test/CHANGELOG.md",
      "new_id": "60fb8688f10d168543c48fea1f44a659f36f3973",
      "new_mode": 33188,
      "new_path": "pkgs/test/CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "c1798b816cf7c45f8b96a05f5f223c2373202def",
      "old_mode": 33188,
      "old_path": "pkgs/test/pubspec.yaml",
      "new_id": "df2e49f3398345d4a7bc1e5339dd27915e711fc6",
      "new_mode": 33188,
      "new_path": "pkgs/test/pubspec.yaml"
    },
    {
      "type": "modify",
      "old_id": "458b0fcac7588334bc74a12de14fee64028c62bf",
      "old_mode": 33188,
      "old_path": "pkgs/test_api/CHANGELOG.md",
      "new_id": "d1ffa889b29168450dfdaac214f4af11ef641c19",
      "new_mode": 33188,
      "new_path": "pkgs/test_api/CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "54a439c9cbd60c597e3721a0a87db664cd5f125f",
      "old_mode": 33188,
      "old_path": "pkgs/test_api/lib/src/backend/invoker.dart",
      "new_id": "582d9f96c14e32a3572a5065f357bcf9caea00b0",
      "new_mode": 33188,
      "new_path": "pkgs/test_api/lib/src/backend/invoker.dart"
    },
    {
      "type": "modify",
      "old_id": "764fa6a2a438f5f55f5d38581722f5bd4a81d3f0",
      "old_mode": 33188,
      "old_path": "pkgs/test_api/pubspec.yaml",
      "new_id": "5c47c5b91b3945f96e461129b1a7824c6e00c3e7",
      "new_mode": 33188,
      "new_path": "pkgs/test_api/pubspec.yaml"
    },
    {
      "type": "modify",
      "old_id": "e8bf0a92ab156426b0eeb445c23cac443c73c97f",
      "old_mode": 33188,
      "old_path": "pkgs/test_api/test/backend/declarer_test.dart",
      "new_id": "0fe848a0519e9fae7fcde5662185907f81d87e46",
      "new_mode": 33188,
      "new_path": "pkgs/test_api/test/backend/declarer_test.dart"
    },
    {
      "type": "modify",
      "old_id": "6aa4774871a72d46ca9962879e81a3bb04ca89a4",
      "old_mode": 33188,
      "old_path": "pkgs/test_api/test/backend/invoker_test.dart",
      "new_id": "490bb023bdacdbfb59639d5c287b60340d7bd5d2",
      "new_mode": 33188,
      "new_path": "pkgs/test_api/test/backend/invoker_test.dart"
    },
    {
      "type": "modify",
      "old_id": "2c654d27fe8b0be2b415767aa1a0517dd2940301",
      "old_mode": 33188,
      "old_path": "pkgs/test_core/CHANGELOG.md",
      "new_id": "eaad8cfa9ef62c89886e31ca3cde6faab55ea50f",
      "new_mode": 33188,
      "new_path": "pkgs/test_core/CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "66f0e7f1ae4d30151a238223f3d368fdf1d56802",
      "old_mode": 33188,
      "old_path": "pkgs/test_core/lib/src/runner/load_suite.dart",
      "new_id": "2c64fc028804d779657ce9796f064eff0a684bda",
      "new_mode": 33188,
      "new_path": "pkgs/test_core/lib/src/runner/load_suite.dart"
    },
    {
      "type": "modify",
      "old_id": "8efd87be8aed13f1970efe45c39fd861f906e668",
      "old_mode": 33188,
      "old_path": "pkgs/test_core/pubspec.yaml",
      "new_id": "f7407f1ee091bc7bcfaa6499dd15578548611f45",
      "new_mode": 33188,
      "new_path": "pkgs/test_core/pubspec.yaml"
    }
  ]
}
