On Tuesday, September 17, 2024 at 12:44:42 PM UTC+2 Stephen Illingworth 
wrote:

If the only problem is that the cache is getting in the way then you can 
run the tests such that test cache is not used. The idiomatic way is to use 
-count=1 on the test command line

I would do this:

go test -count=1 <umask tests>

And then:

go test <other tests>


I am aware that I can work around go test cache's incorrect behavior by 
disabling the cache. This is annoying for several reasons:
* I have to manually maintain a list of tests that are affected by the 
umask.
* I have to run go test twice.
* I don't get the speed-ups of caching when the caching should work, which 
slows down my development cycle.

Note that all tests that write files are affected by umask, even if many 
people don't realize this. To demonstrate this, find a project that calls 
testing.T.TempDir() and run:

$ umask 777
$ go test ./... -count=1

The odds are that the tests will fail.

However, I want to make go test cache's behavior more correct for a case 
where it is currently incorrect for no measurable performance penalty. What 
are the reasons for *not* doing this?


On Tuesday 17 September 2024 at 11:25:40 UTC+1 twp...@gmail.com wrote:

> Should work, AIUI, even with the issues you mention. Or is there 
something else going on that I'm unaware of?

The problem is not running the tests. The problem is that the test cache is 
not invalidated correctly.

On Tuesday, September 17, 2024 at 11:52:35 AM UTC+2 Axel Wagner wrote:

On Tue, 17 Sept 2024 at 10:33, 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.


I might be misunderstanding something, but neither of these seems to 
actually be a problem. Tests are not run concurrently, unless explicitly 
requested by calling `t.Parallel()`. The same goes for sub tests, I 
believe. So, simply doing

func TestOne(t *testing.T) {
    defer syscall.Umask(syscall.Umask(0))
    // test goes here
}
func TestTwo(t *testing.T) {
    defer syscall.Umask(syscall.Umask(0777))
    // test goes here
}


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>
.

-- 
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/27617075-a38b-4e01-8412-b290aab3f906n%40googlegroups.com.

Reply via email to