angular-cn/integration
Alex Rickabaugh 32c760f5e7 fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244)
The Angular runtime frequently calls into user code (for example, when
writing to a property binding). Since user code can throw errors, calls to
it are frequently wrapped in a try-finally block. In Ivy, the following
pattern is common:

```typescript
enterView();
try {
  callUserCode();
} finally {
  leaveView();
}
```

This has a significant problem, however: `leaveView` has a side effect: it
calls any pending lifecycle hooks that might've been scheduled during the
current round of change detection. Generally it's a bad idea to run
lifecycle hooks after the application has crashed. The application is in an
inconsistent state - directives may not be instantiated fully, queries may
not be resolved, bindings may not have been applied, etc. Invariants that
the app code relies upon may not hold. Further crashes or broken behavior
are likely.

Frequently, lifecycle hooks are used to make assertions about these
invariants. When these assertions fail, they will throw and "swallow" the
original error, making debugging of the problem much more difficult.

This commit modifies `leaveView` to understand whether the application is
currently crashing, via a parameter `safeToRunHooks`. This parameter is set
by modifying the above pattern:

```typescript
enterView();
let safeToRunHooks = false;
try {
  callUserCode();
  safeToRunHooks = true;
} finally {
  leaveView(..., safeToRunHooks);
}
```

If `callUserCode` crashes, then `safeToRunHooks` will never be set to `true`
and `leaveView` won't call any further user code. The original error will
then propagate back up the stack and be reported correctly. A test is added
to verify this behavior.

PR Close #31244
2019-06-26 08:01:14 -07:00
..
bazel Revert "build(bazel): update to bazel 0.27.0 and fix compat in @angular/bazel package (#31019)" (#31267) 2019-06-25 14:36:01 -07:00
bazel-schematics fix(bazel): do not modify tsconfig.json (#30877) 2019-06-11 14:23:00 -07:00
cli-hello-world ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
cli-hello-world-ivy-compat ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
cli-hello-world-ivy-minimal ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
dynamic-compiler ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
hello_world__closure ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
hello_world__systemjs_umd ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
i18n ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
injectable-def build: hide @angular/http for Angular v8 (#29550) 2019-04-02 10:55:31 -07:00
language_service_plugin fix(language-service): Remove 'any' in getQuickInfoAtPosition (#31014) 2019-06-14 10:46:16 -07:00
ng_elements ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
ng_update build: hide @angular/http for Angular v8 (#29550) 2019-04-02 10:55:31 -07:00
ngcc fix(ivy): ngcc should process undecorated base classes (#30821) 2019-06-11 00:19:34 +00:00
platform-server ci: update nodejs version to v10.16.0 (#31088) 2019-06-17 13:07:27 -07:00
service-worker-schema test(service-worker): verify that `config/schema.json` is published to npm (#27859) 2019-03-05 16:48:26 -08:00
side-effects refactor(core): cleanup code with side-effects which was preventing tree-shaking (#30580) 2019-06-03 09:01:51 -07:00
terser feat(compiler-cli): export tooling definitions (#29929) 2019-04-17 17:23:01 -07:00
typings_test_ts34 feat(upgrade): provide unit test helpers for wiring up injectors (#16848) 2019-06-20 17:04:01 -07:00
.gitignore ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
README.md build: update render3 section of integration test readme (#28372) 2019-02-07 12:36:51 -08:00
_payload-limits.json fix(ivy): don't mask errors by calling lifecycle hooks after a crash (#31244) 2019-06-26 08:01:14 -07:00
get-sharded-tests.js build: shard integration tests on circleci (#27937) 2019-01-07 15:35:09 -08:00
run_tests.sh ci: do not install firebase-tools without cache (#28615) 2019-02-08 10:23:19 -08:00

README.md

Integration tests for Angular

This directory contains end-to-end tests for Angular. Each directory is a self-contained application that exactly mimics how a user might expect Angular to work, so they allow high-fidelity reproductions of real-world issues.

For this to work, we first build the Angular distribution just like we would publish it to npm, then install the distribution into each app.

To test Angular CLI applications, we use the integration test cli-hello-world. When a significant change is released in the CLI, the application should be updated with ng update:

$ cd integration/cli-hello-world
$ yarn install
$ yarn ng update @angular/cli @angular-devkit/build-angular
# yarn build
# yarn test
# typescript version

Render3 tests

The directory cli-hello-world-ivy-compat contains a test for render3 used with the angular cli.

The cli-hello-world-ivy-minimal contains a minimal ivy app that is meant to mimic the bazel equivalent in packages/core/test/bundling/hello_world, and should be kept similar.

Writing an integration test

The API for each test is:

  • Each sub-directory here is an integration test
  • Each test should have a package.json file
  • The test runner will run yarn and yarn test on the package

This means that the test should be started by test script, like

"scripts": {"test": "runProgramA && assertResultIsGood"}

Note that the package.json file uses a special file://../../dist scheme to reference the Angular packages, so that the locally-built Angular is installed into the test app.

Also, beware of floating (non-locked) dependencies. If in doubt you can install the package directly from file:../../node_modules.

Running integration tests

$ ./integration/run_tests.sh

The test runner will first re-build any stale npm packages, then cd into each subdirectory to execute the test.