> I interpret that to mean you are changing the umask before running `go 
test`. That is, you might run `go test` with different umask values and 
don't want the cached results to ignore the umask value. As did Ian if I 
correctly understood their reply. The discussion then evolved into how a 
specific unit test can safely change the umask without affecting other unit 
tests. Running unit tests with different umask values is a different 
problem from how to write unit tests that modify the umask value.

That is correct. Unfortunately there seems to be a lack of knowledge in 
some cases of what umask is and how it behaves, which is why the discussion 
got sidetracked.

> At this point it is unclear, at least to me, what problem you are trying 
to solve.

I want go test to invalidate its cache when the umask is changed, i.e. I 
want the following sequence of commands to work correctly:

$ umask 002
$ go test ./...
$ umask 022
$ go test ./... # should not use cache
$ go test ./... # should use cache

Currently, the go test cache does not record the umask, so it incorrectly 
re-uses the cached test results in the second invocation of go test. It 
should instead invalidate the cache.

Note that go test does record the external files used by the tests and the 
external environment variables used by the tests, and so it correctly 
invalidates the cache when any of them change. I would like the cache to 
also be invalidated when the external umask changes. Alternately put, go 
test already has special case code for external changes to files and 
environment variables, and I would like extend that to external umask 
changes too.

Hope this makes my request clearer.

I'd be delighted to submit at CL to do this (it's probably 10-20 lines of 
code with almost no performance penalty [1]), but I want to check that it 
has a reasonable chance to being accepted before I start the work.

[1] The performance cost is two very fast syscalls during startup.
On Tuesday, September 17, 2024 at 10:49:12 AM UTC+2 Kurtis Rader wrote:

> You wrote earlier:
>
> > Currently changing the umask does not invalidate go test's cache, so I 
> get incorrect test results if I change the umask and re-run go test
>
> I interpret that to mean you are changing the umask before running `go 
> test`. That is, you might run `go test` with different umask values and 
> don't want the cached results to ignore the umask value. As did Ian if I 
> correctly understood their reply. The discussion then evolved into how a 
> specific unit test can safely change the umask without affecting other unit 
> tests. Running unit tests with different umask values is a different 
> problem from how to write unit tests that modify the umask value. At this 
> point it is unclear, at least to me, what problem you are trying to solve.
>
> On Tue, Sep 17, 2024 at 1:33 AM twp...@gmail.com <twp...@gmail.com> wrote:
>
>> umask cannot be set in subtests for two reasons:
>> 1. It is a process-wide global variable stored by the operating system. 
>> Changing the umask in a test changes the umask for the entire process, i.e. 
>> it changes the umask for all tests.
>> 2. It is not possible to set and restore the umask atomically. This makes 
>> it inherently racy for concurrent programs.
>>
>> To learn more about umask, and why it is special, please read the man 
>> page <https://man7.org/linux/man-pages/man2/umask.2.html>.
>> On Monday, September 16, 2024 at 5:34:29 PM UTC+2 Jason Phillips wrote:
>>
>>> Why can't it be set within subtests? Note that subtests (like regular 
>>> tests) aren't run in parallel unless you explicitly call t.Parallel().
>>>
>>> On Friday, September 13, 2024 at 6:35:15 PM UTC-4 twp...@gmail.com 
>>> wrote:
>>>
>>>> > Personally, I would approach this kind of thing by writing a test that
>>>> sets the umask to various different values and invokes subtests with
>>>> each umask value.
>>>>
>>>> I would love to do this but umask is a process global (as far as I 
>>>> understand it) and so can't be set within subtests.
>>>>
>>>> On Saturday, September 14, 2024 at 12:33:19 AM UTC+2 Ian Lance Taylor 
>>>> wrote:
>>>>
>>>>> On Fri, Sep 13, 2024 at 3:03 PM twp...@gmail.com <twp...@gmail.com> 
>>>>> wrote: 
>>>>> > 
>>>>> > tl;dr: umask is a system-wide global that affects go tests and 
>>>>> should be considered when validating go test's cache. 
>>>>> > 
>>>>> > 
>>>>> > Motivation: 
>>>>> > 
>>>>> > I'm the author of a popular open source project that writes files to 
>>>>> the user's home directory and cares about getting exact file permissions 
>>>>> correct. The file permissions depend on the the current umask setting. As 
>>>>> umask is a process global variable, it cannot be set for individual 
>>>>> tests, 
>>>>> and so separate tests are needed for different umasks. 
>>>>> > 
>>>>> > Currently changing the umask does not invalidate go test's cache, so 
>>>>> I get incorrect test results if I change the umask and re-run go test. 
>>>>> > 
>>>>> > 
>>>>> > Suggested solution: 
>>>>> > 
>>>>> > Include umask as an op in go test's id calculation. 
>>>>> > 
>>>>> > 
>>>>> > Next steps: 
>>>>> > 
>>>>> > * Is this something that the Go project would consider? 
>>>>> > * If so, I would be happy to submit a CL. 
>>>>>
>>>>> Personally, I would approach this kind of thing by writing a test that 
>>>>> sets the umask to various different values and invokes subtests with 
>>>>> each umask value. That way the test is independent of the external 
>>>>> environment. 
>>>>>
>>>>> In general our approach has been that if your test intrinsically 
>>>>> depends on the external environment, then you should run it with 
>>>>> -test.run=1 to disable the test cache. 
>>>>>
>>>>> Ian 
>>>>>
>>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/c9dcf1bb-25ae-4e58-8714-66325077c2d1n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/c9dcf1bb-25ae-4e58-8714-66325077c2d1n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> -- 
> Kurtis Rader
> Caretaker of the exceptional canines Junior and Hank
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/54562ddc-d526-437d-b49f-27a89962c334n%40googlegroups.com.

Reply via email to