-
Notifications
You must be signed in to change notification settings - Fork 443
feat(cram): timeout for cram tests #12041
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
Conversation
cd13f97
to
24c54cf
Compare
dbfa4d5
to
dee3b27
Compare
3f68cdb
to
1e8cf33
Compare
src/dune_rules/cram/cram_exec.ml
Outdated
@@ -376,47 +376,59 @@ let make_temp_dir ~script = | |||
temp_dir | |||
;; | |||
|
|||
let run_cram_test env ~script ~cram_stanzas ~temp_dir ~cwd = | |||
let run_cram_test env ~loc ~script ~cram_stanzas ~temp_dir ~cwd ~timeout = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should pass this loc as a tuple with the timeout so that we have an idea what the loc applies to.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We have timeout : (Loc.t * float) option
here whereas loc
is just the cram test file:
let loc = Loc.in_file (Path.drop_optional_build_context_maybe_sandboxed src) in
I've gone ahead and passed the src : Path.t
so that we can infer the location from that directly rather than early on.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd like to review how the digest is computed later this week
@rgrinberg I suppose since we are doing this: let encode { src; dir; script; output; timeout } path target : Sexp.t =
List
[ path src
; path dir
; path script
; target output
; Dune_sexp.Encoder.(option float (Option.map ~f:snd timeout))
|> Dune_sexp.to_sexp
]
;; we are changing the rule digest every time we change the time. This is confirmed by the test I just pushed: Reading let trace =
( rule_digest_version (* Update when changing the rule digest scheme. *)
, sandbox_mode
, Dep.Facts.digest facts ~env
, target_paths rule.targets.files @ target_paths rule.targets.dirs
, Action.for_shell action
, can_go_in_shared_cache
, List.map locks ~f:Path.to_string
, Execution_parameters.action_stdout_on_success execution_parameters
, Execution_parameters.action_stderr_on_success execution_parameters
, Execution_parameters.workspace_root_to_build_path_prefix_map execution_parameters
, Execution_parameters.expand_aliases_in_sandbox execution_parameters )
in
Digest.generic trace and If we deem that timeout changes shouldn't affect digests then the simple solution would be to remove the timeout from the digest, but I am unsure if this is something we want. Take the situation where we have a test that succeeds with no timeout, then we add a short timeout that shouldn't succeed. It will not rerun the rule since the digest is the same, but obviously that build can no longer be reproduced. A more sensible semantic would be for the digest not to change for larger timeouts, but to change for smaller timeouts. However such a thing seems impossible. |
We add a (timeout) field for cram stanzas allowing users to set up a time budget for cram tests to run in. If the budget is exceeded then the cram test will be cancelled. Signed-off-by: Ali Caglayan <alizter@gmail.com>
We add a test that demonstrates the timeout affects the computaiton of the digest causing cram tests to be rerun when the timeout is changed. Signed-off-by: Ali Caglayan <alizter@gmail.com>
Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
Re-running the action when the timeout changes is fine, the issue is with allowing the action to observe the name of cram script. That seems very much unnecessary. I've gone ahead and gotten rid of it. |
Since we just branched 3.20, we need to wait for the 3.21 version bump. |
Why does it matter? 3.20 hasn't been released yet. |
Right, but the alpha has started, so if we merge this now, we need to remember to bump the version numbers to 3.21 since this patch won't be in 3.20. AFAIK we don't backport new PRs after the alpha. |
Can't we always just do another alpha? In any case, I'll leave the choice to @maiste to either include this in 3.20 or 3.21. |
If that's mandatory I can redo an alpha1. What do you prefer? |
I think users would certainly appreciate being able to use this feature sooner rather than later. So if it's possible, yes I would do another alpha with this feature. |
OK then let's go with this. It will allow me to fix some typos that were in the previous changelog. |
CHANGES: ### Fixed - Stop re-running cram tests after promotion when it's not necessary (ocaml/dune#11994, @rgrinberg) - fix: `$ dune subst` should not fail when adding the version field in opam files (ocaml/dune#11801, fixes ocaml/dune#11045, @btjorge) - Kill all processes in the process group after the main process has terminated; in particular this avoids background processes in cram tests to stick around after the test finished (ocaml/dune#11841, fixes ocaml/dune#11820, @Alizter, @Leonidas-from-XIV) ### Added - `(tests)` stanzas now generate aliases with the test name. To run `(test (name a))` you can do `dune build @runtest-a`. (ocaml/dune#11558, grants part of ocaml/dune#10239, @Alizter) - Inline test libraries now produce aliases `runtest-name_of_lib` allowing users to run specific inline tests as `dune build @runtest-name_of_lib`. (ocaml/dune#11109, partially fixes ocaml/dune#10239, @Alizter) - feature: `$ dune subst` use version from `dune-project` when no version control repository has been detected (ocaml/dune#11801, @btjorge) - Allow `dune exec` to run concurrently with another instance of dune in watch mode (ocaml/dune#11840, @gridbugs) - Introduce `%{os}`, `%{os_version}`, `%{os_distribution}`, and `%{os_family}` percent forms. These have the same values as their opam counterparts. (ocaml/dune#11863, @rgrinberg) - Introduce option `(implicit_transitive_deps false-if-hidden-includes-supported)` that is equivalent to `(implicit_transitive_deps false)` when `-H` is supported by the compiler (OCaml >= 5.2) and equivalent to `(implicit_transitive_deps true)` otherwise. (ocaml/dune#11866, fixes ocaml/dune#11212, @nojb) - Add `dune describe location` for printing the path to the executable that would be run (ocaml/dune#11905, @gridbugs) - `dune runtest` can now understand absolute paths as well as run tests in specific build contexts (ocaml/dune#11936, @Alizter). - Added 'empty' alias which contains no targets. (ocaml/dune#11556 ocaml/dune#11952 ocaml/dune#11955 ocaml/dune#11956, grants ocaml/dune#4161, @Alizter and @rgrinberg) - Allow `dune promote` to properly run while a watch mode server is running (ocaml/dune#12010, @ElectreAAS) - Add `--alias` and `--alias-rec` flags as an alternative to the `@@` and `@` syntax in the command line (ocaml/dune#12043, fixes ocaml/dune#5775, @rgrinberg) - Added a `(timeout <float>)` field to the `(cram)` stanza to specify per-test time limits. Tests exceeding the timeout are terminated with an error. (ocaml/dune#12041, @Alizter) ### Changed - Format long lists in s-expressions to fill the line instead of formatting them in a vertical way (ocaml/dune#10892, fixes ocaml/dune#10860, @nojb) - Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is both more performant and difficult to break than MD5 (ocaml/dune#11735, @rgrinberg, @Alizter) - Print a warning when `dune build` runs over RPC (ocaml/dune#11833, @gridbugs) - Stop emitting empty module group wrapper `.js` file in `melange.emit` (ocaml/dune#11987, fixes ocaml/dune#11986, @anmonteiro)
CHANGES: ### Fixed - Stop re-running cram tests after promotion when it's not necessary (ocaml/dune#11994, @rgrinberg) - fix: `$ dune subst` should not fail when adding the version field in opam files (ocaml/dune#11801, fixes ocaml/dune#11045, @btjorge) - Kill all processes in the process group after the main process has terminated; in particular this avoids background processes in cram tests to stick around after the test finished (ocaml/dune#11841, fixes ocaml/dune#11820, @Alizter, @Leonidas-from-XIV) ### Added - `(tests)` stanzas now generate aliases with the test name. To run `(test (name a))` you can do `dune build @runtest-a`. (ocaml/dune#11558, grants part of ocaml/dune#10239, @Alizter) - Inline test libraries now produce aliases `runtest-name_of_lib` allowing users to run specific inline tests as `dune build @runtest-name_of_lib`. (ocaml/dune#11109, partially fixes ocaml/dune#10239, @Alizter) - feature: `$ dune subst` use version from `dune-project` when no version control repository has been detected (ocaml/dune#11801, @btjorge) - Allow `dune exec` to run concurrently with another instance of dune in watch mode (ocaml/dune#11840, @gridbugs) - Introduce `%{os}`, `%{os_version}`, `%{os_distribution}`, and `%{os_family}` percent forms. These have the same values as their opam counterparts. (ocaml/dune#11863, @rgrinberg) - Introduce option `(implicit_transitive_deps false-if-hidden-includes-supported)` that is equivalent to `(implicit_transitive_deps false)` when `-H` is supported by the compiler (OCaml >= 5.2) and equivalent to `(implicit_transitive_deps true)` otherwise. (ocaml/dune#11866, fixes ocaml/dune#11212, @nojb) - Add `dune describe location` for printing the path to the executable that would be run (ocaml/dune#11905, @gridbugs) - `dune runtest` can now understand absolute paths as well as run tests in specific build contexts (ocaml/dune#11936, @Alizter). - Added 'empty' alias which contains no targets. (ocaml/dune#11556 ocaml/dune#11952 ocaml/dune#11955 ocaml/dune#11956, grants ocaml/dune#4161, @Alizter and @rgrinberg) - Allow `dune promote` to properly run while a watch mode server is running (ocaml/dune#12010, @ElectreAAS) - Add `--alias` and `--alias-rec` flags as an alternative to the `@@` and `@` syntax in the command line (ocaml/dune#12043, fixes ocaml/dune#5775, @rgrinberg) - Added a `(timeout <float>)` field to the `(cram)` stanza to specify per-test time limits. Tests exceeding the timeout are terminated with an error. (ocaml/dune#12041, @Alizter) ### Changed - Format long lists in s-expressions to fill the line instead of formatting them in a vertical way (ocaml/dune#10892, fixes ocaml/dune#10860, @nojb) - Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is both more performant and difficult to break than MD5 (ocaml/dune#11735, @rgrinberg, @Alizter) - Print a warning when `dune build` runs over RPC (ocaml/dune#11833, @gridbugs) - Stop emitting empty module group wrapper `.js` file in `melange.emit` (ocaml/dune#11987, fixes ocaml/dune#11986, @anmonteiro)
CHANGES: ### Fixed - Stop re-running cram tests after promotion when it's not necessary (ocaml/dune#11994, @rgrinberg) - fix: `$ dune subst` should not fail when adding the version field in opam files (ocaml/dune#11801, fixes ocaml/dune#11045, @btjorge) - Kill all processes in the process group after the main process has terminated; in particular this avoids background processes in cram tests to stick around after the test finished (ocaml/dune#11841, fixes ocaml/dune#11820, @Alizter, @Leonidas-from-XIV) ### Added - `(tests)` stanzas now generate aliases with the test name. To run `(test (name a))` you can do `dune build @runtest-a`. (ocaml/dune#11558, grants part of ocaml/dune#10239, @Alizter) - Inline test libraries now produce aliases `runtest-name_of_lib` allowing users to run specific inline tests as `dune build @runtest-name_of_lib`. (ocaml/dune#11109, partially fixes ocaml/dune#10239, @Alizter) - feature: `$ dune subst` use version from `dune-project` when no version control repository has been detected (ocaml/dune#11801, @btjorge) - Allow `dune exec` to run concurrently with another instance of dune in watch mode (ocaml/dune#11840, @gridbugs) - Introduce `%{os}`, `%{os_version}`, `%{os_distribution}`, and `%{os_family}` percent forms. These have the same values as their opam counterparts. (ocaml/dune#11863, @rgrinberg) - Introduce option `(implicit_transitive_deps false-if-hidden-includes-supported)` that is equivalent to `(implicit_transitive_deps false)` when `-H` is supported by the compiler (OCaml >= 5.2) and equivalent to `(implicit_transitive_deps true)` otherwise. (ocaml/dune#11866, fixes ocaml/dune#11212, @nojb) - Add `dune describe location` for printing the path to the executable that would be run (ocaml/dune#11905, @gridbugs) - `dune runtest` can now understand absolute paths as well as run tests in specific build contexts (ocaml/dune#11936, @Alizter). - Added 'empty' alias which contains no targets. (ocaml/dune#11556 ocaml/dune#11952 ocaml/dune#11955 ocaml/dune#11956, grants ocaml/dune#4161, @Alizter and @rgrinberg) - Allow `dune promote` to properly run while a watch mode server is running (ocaml/dune#12010, @ElectreAAS) - Add `--alias` and `--alias-rec` flags as an alternative to the `@@` and `@` syntax in the command line (ocaml/dune#12043, fixes ocaml/dune#5775, @rgrinberg) - Added a `(timeout <float>)` field to the `(cram)` stanza to specify per-test time limits. Tests exceeding the timeout are terminated with an error. (ocaml/dune#12041, @Alizter) ### Changed - Format long lists in s-expressions to fill the line instead of formatting them in a vertical way (ocaml/dune#10892, fixes ocaml/dune#10860, @nojb) - Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is both more performant and difficult to break than MD5 (ocaml/dune#11735, @rgrinberg, @Alizter) - Print a warning when `dune build` runs over RPC (ocaml/dune#11833, @gridbugs) - Stop emitting empty module group wrapper `.js` file in `melange.emit` (ocaml/dune#11987, fixes ocaml/dune#11986, @anmonteiro)
CHANGES: ### Fixed - Stop re-running cram tests after promotion when it's not necessary (ocaml/dune#11994, @rgrinberg) - fix: `$ dune subst` should not fail when adding the version field in opam files (ocaml/dune#11801, fixes ocaml/dune#11045, @btjorge) - Kill all processes in the process group after the main process has terminated; in particular this avoids background processes in cram tests to stick around after the test finished (ocaml/dune#11841, fixes ocaml/dune#11820, @Alizter, @Leonidas-from-XIV) ### Added - `(tests)` stanzas now generate aliases with the test name. To run `(test (name a))` you can do `dune build @runtest-a`. (ocaml/dune#11558, grants part of ocaml/dune#10239, @Alizter) - Inline test libraries now produce aliases `runtest-name_of_lib` allowing users to run specific inline tests as `dune build @runtest-name_of_lib`. (ocaml/dune#11109, partially fixes ocaml/dune#10239, @Alizter) - feature: `$ dune subst` use version from `dune-project` when no version control repository has been detected (ocaml/dune#11801, @btjorge) - Allow `dune exec` to run concurrently with another instance of dune in watch mode (ocaml/dune#11840, @gridbugs) - Introduce `%{os}`, `%{os_version}`, `%{os_distribution}`, and `%{os_family}` percent forms. These have the same values as their opam counterparts. (ocaml/dune#11863, @rgrinberg) - Introduce option `(implicit_transitive_deps false-if-hidden-includes-supported)` that is equivalent to `(implicit_transitive_deps false)` when `-H` is supported by the compiler (OCaml >= 5.2) and equivalent to `(implicit_transitive_deps true)` otherwise. (ocaml/dune#11866, fixes ocaml/dune#11212, @nojb) - Add `dune describe location` for printing the path to the executable that would be run (ocaml/dune#11905, @gridbugs) - `dune runtest` can now understand absolute paths as well as run tests in specific build contexts (ocaml/dune#11936, @Alizter). - Added 'empty' alias which contains no targets. (ocaml/dune#11556 ocaml/dune#11952 ocaml/dune#11955 ocaml/dune#11956, grants ocaml/dune#4161, @Alizter and @rgrinberg) - Allow `dune promote` to properly run while a watch mode server is running (ocaml/dune#12010, @ElectreAAS) - Add `--alias` and `--alias-rec` flags as an alternative to the `@@` and `@` syntax in the command line (ocaml/dune#12043, fixes ocaml/dune#5775, @rgrinberg) - Added a `(timeout <float>)` field to the `(cram)` stanza to specify per-test time limits. Tests exceeding the timeout are terminated with an error. (ocaml/dune#12041, @Alizter) ### Changed - Format long lists in s-expressions to fill the line instead of formatting them in a vertical way (ocaml/dune#10892, fixes ocaml/dune#10860, @nojb) - Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is both more performant and difficult to break than MD5 (ocaml/dune#11735, @rgrinberg, @Alizter) - Print a warning when `dune build` runs over RPC (ocaml/dune#11833, @gridbugs) - Stop emitting empty module group wrapper `.js` file in `melange.emit` (ocaml/dune#11987, fixes ocaml/dune#11986, @anmonteiro)
CHANGES: ### Fixed - Stop re-running cram tests after promotion when it's not necessary (ocaml/dune#11994, @rgrinberg) - fix: `$ dune subst` should not fail when adding the version field in opam files (ocaml/dune#11801, fixes ocaml/dune#11045, @btjorge) - Kill all processes in the process group after the main process has terminated; in particular this avoids background processes in cram tests to stick around after the test finished (ocaml/dune#11841, fixes ocaml/dune#11820, @Alizter, @Leonidas-from-XIV) ### Added - `(tests)` stanzas now generate aliases with the test name. To run `(test (name a))` you can do `dune build @runtest-a`. (ocaml/dune#11558, grants part of ocaml/dune#10239, @Alizter) - Inline test libraries now produce aliases `runtest-name_of_lib` allowing users to run specific inline tests as `dune build @runtest-name_of_lib`. (ocaml/dune#11109, partially fixes ocaml/dune#10239, @Alizter) - feature: `$ dune subst` use version from `dune-project` when no version control repository has been detected (ocaml/dune#11801, @btjorge) - Allow `dune exec` to run concurrently with another instance of dune in watch mode (ocaml/dune#11840, @gridbugs) - Introduce `%{os}`, `%{os_version}`, `%{os_distribution}`, and `%{os_family}` percent forms. These have the same values as their opam counterparts. (ocaml/dune#11863, @rgrinberg) - Introduce option `(implicit_transitive_deps false-if-hidden-includes-supported)` that is equivalent to `(implicit_transitive_deps false)` when `-H` is supported by the compiler (OCaml >= 5.2) and equivalent to `(implicit_transitive_deps true)` otherwise. (ocaml/dune#11866, fixes ocaml/dune#11212, @nojb) - Add `dune describe location` for printing the path to the executable that would be run (ocaml/dune#11905, @gridbugs) - `dune runtest` can now understand absolute paths as well as run tests in specific build contexts (ocaml/dune#11936, @Alizter). - Added 'empty' alias which contains no targets. (ocaml/dune#11556 ocaml/dune#11952 ocaml/dune#11955 ocaml/dune#11956, grants ocaml/dune#4161, @Alizter and @rgrinberg) - Allow `dune promote` to properly run while a watch mode server is running (ocaml/dune#12010, @ElectreAAS) - Add `--alias` and `--alias-rec` flags as an alternative to the `@@` and `@` syntax in the command line (ocaml/dune#12043, fixes ocaml/dune#5775, @rgrinberg) - Added a `(timeout <float>)` field to the `(cram)` stanza to specify per-test time limits. Tests exceeding the timeout are terminated with an error. (ocaml/dune#12041, @Alizter) ### Changed - Format long lists in s-expressions to fill the line instead of formatting them in a vertical way (ocaml/dune#10892, fixes ocaml/dune#10860, @nojb) - Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is both more performant and difficult to break than MD5 (ocaml/dune#11735, @rgrinberg, @Alizter) - Print a warning when `dune build` runs over RPC (ocaml/dune#11833, @gridbugs) - Stop emitting empty module group wrapper `.js` file in `melange.emit` (ocaml/dune#11987, fixes ocaml/dune#11986, @anmonteiro)
We add a
(timeout)
field for cram stanzas allowing users to set up a time budget for cram tests to run in. If the budget is exceeded then the cram test will be cancelled.dune_engine
changes are ok?