diff --git a/test/blackbox-tests/test-cases/exec-watch/dune b/test/blackbox-tests/test-cases/exec-watch/dune index 6d92f7790f6..41a483576a3 100644 --- a/test/blackbox-tests/test-cases/exec-watch/dune +++ b/test/blackbox-tests/test-cases/exec-watch/dune @@ -7,9 +7,9 @@ ;; sometimes go undetected. Adding a delay (e.g. `sleep 1`) before modifying the ;; program seems to guarantee a rebuild will be triggered, but that is too ;; unreliable to depend on in a test so these tests are disabled on macos. - ;; (<> "macosx" %{ocaml-config:system}) + (<> "macosx" %{ocaml-config:system}) ;; disabled until it works in CI - false)) + )) (cram (deps wait-for-file.sh)) diff --git a/test/blackbox-tests/test-cases/exec-watch/exec-watch-basic.t/run.t b/test/blackbox-tests/test-cases/exec-watch/exec-watch-basic.t/run.t index e6b5b232d06..40c99674f35 100644 --- a/test/blackbox-tests/test-cases/exec-watch/exec-watch-basic.t/run.t +++ b/test/blackbox-tests/test-cases/exec-watch/exec-watch-basic.t/run.t @@ -18,7 +18,7 @@ between each change to its code. 1 | let () = print_endline "baz ^ Error: String literal not terminated - Had errors, waiting for filesystem changes... + Had 1 error, waiting for filesystem changes... Success, waiting for filesystem changes... baz $ PID=$! diff --git a/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/bin/dune b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/bin/dune new file mode 100644 index 00000000000..ccc9621ef5b --- /dev/null +++ b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/bin/dune @@ -0,0 +1,3 @@ +(executable + (name main) + (libraries unix)) diff --git a/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/bin/main.ml b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/bin/main.ml new file mode 100644 index 00000000000..cc68426678c --- /dev/null +++ b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/bin/main.ml @@ -0,0 +1,9 @@ +let () = + let touch path = + let fd = Unix.openfile path [ Unix.O_CREAT ] 777 in + Unix.close fd + in + print_endline "foo"; + match Sys.argv.(1) with + | exception _ -> () + | path -> touch path diff --git a/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/dune-project b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/dune-project new file mode 100644 index 00000000000..0a32580ffcf --- /dev/null +++ b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/dune-project @@ -0,0 +1 @@ +(lang dune 3.6) diff --git a/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/run.t b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/run.t new file mode 100644 index 00000000000..cb9c9147a2e --- /dev/null +++ b/test/blackbox-tests/test-cases/exec-watch/exec-watch-multi-levels.t/run.t @@ -0,0 +1,27 @@ + +exec + watch works fine when invoked at the root level + $ DONE_FLAG=_build/done_flag + $ dune exec --watch ./bin/main.exe $DONE_FLAG & + Success, waiting for filesystem changes... + foo + $ PID=$! + +Wait for the $DONE_FLAG file to exist, then delete the file. This file is +created by the program being exec'd, so when it exists we know that it's safe to +change the code and proceed with the test. + $ ../wait-for-file.sh $DONE_FLAG + $ kill $PID + + +It's broken when invoked in a child folder + $ cd bin && dune exec --root .. --watch ./bin/main.exe & + Entering directory '..' + Error: posix_spawn(): No such file or directory + Leaving directory '..' + $ wait + +But it works fine without watch mode + $ cd bin && dune exec --root .. ./bin/main.exe + Entering directory '..' + Leaving directory '..' + foo