> What about supporting a new annotation @setup that can be used to call
> tmp_dir but also custom functions in the test suite, which would be useful to
> fine-tune setup for specific tests, especially for expensive setups. Eg:
>
> @setup tmp_dir: "my_tmp_dir", :do_something_expensive
> @tag :slow
> test "my test B", context do
> end
I don’t think we need the `@setup` tag as I believe we can achieve what you
have in mind with describes and their own setups:
@moduletag :tmp_dir
describe "foo" do
setup [:expensive]
# ...
end
What do you think?
> @tag is a filter (as stated by the doc), so enabling it to run setup/actions
> sounds like mixing up responsibilities and AFAIK it wouldn't be extensible to
> support custom setup functions like described above.
FWIW, we also have :capture_log and :timeout tags that are more than just
filters. :)
>
> Is it too overkill or does it make sense?
>
> On Saturday, June 27, 2020 at 7:43:37 AM UTC-4, Wojtek Mach wrote:
> Here is a proof of concept for the tag-based solution:
> https://gist.github.com/wojtekmach/2c59fb3c3c1c274e35d164014662975a
> <https://gist.github.com/wojtekmach/2c59fb3c3c1c274e35d164014662975a>
> Of course it would be slightly different as part of ExUnit, but you get the
> idea. (And you can play with _this_ in your projects right now!)
>
>> On 27 Jun 2020, at 13:17, Wojtek Mach <[email protected] <javascript:>>
>> wrote:
>>
>> The downside of doing work in setup/0 is if you only need temp dir for one
>> test, unless you mess with tags which adds boilerplate, you’d unnecessarily
>> create dirs for tests that don’t need it. But then again you could argue
>> that if you need it in just one test, do it in that test :) still I think
>> it’s worth removing boilerplate.
>>
>> Contrary to the above mentioned golang issue, I am not super concerned about
>> leaking temp directories, so I wasn’t planning to do that. Though being able
>> to automatically remove those is arguably the only reason for tight
>> integration with exunit. As you can see the implementation is currently
>> fairly generic.
>>
>> I focused on the ex_unit case but a more general utility is interesting too.
>>
>> About @tag tmp_dir:
>>
>> @tag tmp_dir: true
>> test “foo”, %{tmp_dir: tmp_dir} do
>>
>> seems to strike a good balance between being explicit and easy enough to
>> use. 👍
>>
>>> On 27 Jun 2020, at 12:47, Devon Estes <[email protected] <javascript:>>
>>> wrote:
>>>
>>>
>>> What are the rules for deleting this directory after it’s done being used?
>>> Would it be deleted after the test finishes, or would it remain until the
>>> user deletes it?
>>>
>>> In general this seems ok to me, but it’s also a bit limiting as you only
>>> get one directory per test. I’d personally prefer to see something where
>>> you get one directory per process instead of one directory per test, or
>>> when each call to temp_dir! returns a new, unique directory as this covers
>>> some other common use cases (like parallel processing of files in multiple
>>> folders) without having to first create the temp_dir for the test and then
>>> in that temp_dir additional directories per process. I do this generally
>>> using UUIDs to create temporary directories, and I haven’t (personally) had
>>> any issues with debugging or anything, but I can see how this might be
>>> confusing for folks.
>>>
>>> Wojtek Mach <[email protected] <javascript:>> schrieb am Sa. 27. Juni
>>> 2020 um 12:19:
>>> It’s common to create temporary directories for tests, ideally a unique
>>> directory per test to run them concurrently.
>>>
>>> I’d like to propose adding `ExUnit.Callbacks.tmp_dir!/0` and this is how we
>>> could use it:
>>>
>>> defmodule MyTest do
>>> use ExUnit.Case, async: true
>>>
>>> test "my test" do
>>> assert tmp_dir!() =~ "my test"
>>> assert File.dir?(tmp_dir!())
>>> end
>>> end
>>>
>>> The directory is lazily created on the first call, the second call to that
>>> function within the same test simply returns the same path.
>>>
>>> While the path must be unique per test, I believe it should also be
>>> predictable to ease debugging, I picked: tmp/<module>/<test>.
>>>
>>> To extract the module & test name, we have two options:
>>>
>>> 1. Define tmp_dir!/0 as a regular function and use stack trace
>>> 2. Define tmp_dir!/0 as a macro
>>>
>>> Here’s a proof of concept for option 1:
>>>
>>> - the code:
>>> https://github.com/wojtekmach/elixir/commit/4c399540802a3cae583c086d865dc90d865df6c8
>>>
>>> <https://github.com/wojtekmach/elixir/commit/4c399540802a3cae583c086d865dc90d865df6c8>
>>> - example of usage in Elixir test suite:
>>> https://github.com/wojtekmach/elixir/commit/01df2551582dd9acdaa2f6ff982d6767763070f1
>>>
>>> <https://github.com/wojtekmach/elixir/commit/01df2551582dd9acdaa2f6ff982d6767763070f1>
>>>
>>> The downside of using stack trace is it can easily get mangled, people
>>> shouldn’t do this:
>>>
>>> test "my test" do
>>> tmp_dir!()
>>>
>>> Task.async(fn ->
>>> tmp_dir!()
>>> end)
>>> |> Task.await()
>>> end
>>>
>>> And instead do that:
>>>
>>> test "my test" do
>>> tmp_dir = tmp_dir!()
>>>
>>> Task.async(fn ->
>>> tmp_dir
>>> end)
>>> |> Task.await()
>>> end
>>>
>>> I believe documenting this might be enough.
>>>
>>> This proposal is inspired by https://github.com/golang/go/issues/35998
>>> <https://github.com/golang/go/issues/35998>.
>>>
>>> Any feedback appreciated!
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an
>>> email to [email protected] <javascript:>.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/elixir-lang-core/066A99E3-B470-44C3-9632-F52E97AB8791%40wojtekmach.pl
>>>
>>> <https://groups.google.com/d/msgid/elixir-lang-core/066A99E3-B470-44C3-9632-F52E97AB8791%40wojtekmach.pl>.
>>> --
>>>
>>> _________________
>>> Devon Estes
>>> +49 176 2356 4717
>>> www.devonestes.com <http://www.devonestes.com/>
>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an
>>> email to [email protected] <javascript:>.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGowJcgGwFrF%2Btf%2BjmKnFSzntuVUX7pLb2Mj4jsvP6XyBXXo%2Bw%40mail.gmail.com
>>>
>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGowJcgGwFrF%2Btf%2BjmKnFSzntuVUX7pLb2Mj4jsvP6XyBXXo%2Bw%40mail.gmail.com?utm_medium=email&utm_source=footer>.
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected]
> <mailto:[email protected]>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/d7fb19b1-d06c-4587-a609-f07b3b7ff8b9o%40googlegroups.com
>
> <https://groups.google.com/d/msgid/elixir-lang-core/d7fb19b1-d06c-4587-a609-f07b3b7ff8b9o%40googlegroups.com?utm_medium=email&utm_source=footer>.
--
You received this message because you are subscribed to the Google Groups
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-core/0A935EC4-BBF3-4351-88AB-0B2EE800B7F1%40wojtekmach.pl.