Source file src/os/root_unix_test.go

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build unix || (js && wasm) || wasip1
     6  
     7  package os_test
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  	"runtime"
    13  	"syscall"
    14  	"testing"
    15  )
    16  
    17  func TestRootChown(t *testing.T) {
    18  	if runtime.GOOS == "wasip1" {
    19  		t.Skip("Chown not supported on " + runtime.GOOS)
    20  	}
    21  
    22  	// Look up the current default uid/gid.
    23  	f := newFile(t)
    24  	dir, err := f.Stat()
    25  	if err != nil {
    26  		t.Fatal(err)
    27  	}
    28  	sys := dir.Sys().(*syscall.Stat_t)
    29  
    30  	groups, err := os.Getgroups()
    31  	if err != nil {
    32  		t.Fatalf("getgroups: %v", err)
    33  	}
    34  	groups = append(groups, os.Getgid())
    35  	for _, test := range rootTestCases {
    36  		test.run(t, func(t *testing.T, target string, root *os.Root) {
    37  			if target != "" {
    38  				if err := os.WriteFile(target, nil, 0o666); err != nil {
    39  					t.Fatal(err)
    40  				}
    41  			}
    42  			for _, gid := range groups {
    43  				err := root.Chown(test.open, -1, gid)
    44  				if errEndsTest(t, err, test.wantError, "root.Chown(%q, -1, %v)", test.open, gid) {
    45  					return
    46  				}
    47  				checkUidGid(t, target, int(sys.Uid), gid)
    48  			}
    49  		})
    50  	}
    51  }
    52  
    53  func TestRootConsistencyChown(t *testing.T) {
    54  	if runtime.GOOS == "wasip1" {
    55  		t.Skip("Chown not supported on " + runtime.GOOS)
    56  	}
    57  	groups, err := os.Getgroups()
    58  	if err != nil {
    59  		t.Fatalf("getgroups: %v", err)
    60  	}
    61  	var gid int
    62  	if len(groups) == 0 {
    63  		gid = os.Getgid()
    64  	} else {
    65  		gid = groups[0]
    66  	}
    67  	for _, test := range rootConsistencyTestCases {
    68  		test.run(t, func(t *testing.T, path string, r *os.Root) (string, error) {
    69  			chown := os.Chown
    70  			lstat := os.Lstat
    71  			if r != nil {
    72  				chown = r.Chown
    73  				lstat = r.Lstat
    74  			}
    75  			err := chown(path, -1, gid)
    76  			if err != nil {
    77  				return "", err
    78  			}
    79  			fi, err := lstat(path)
    80  			if err != nil {
    81  				return "", err
    82  			}
    83  			sys := fi.Sys().(*syscall.Stat_t)
    84  			return fmt.Sprintf("%v %v", sys.Uid, sys.Gid), nil
    85  		})
    86  	}
    87  }
    88  

View as plain text