Skip to content

Commit

Permalink
add tests for prlimit
Browse files Browse the repository at this point in the history
Signed-off-by: lifubang <lifubang@acmcoder.com>
  • Loading branch information
lifubang committed May 8, 2024
1 parent 4ce20f3 commit 565a905
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/syscall/export_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
var (
RawSyscallNoError = rawSyscallNoError
ForceClone3 = &forceClone3
Prlimit = prlimit
)

const (
Expand Down
6 changes: 6 additions & 0 deletions src/syscall/export_rlimit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@

package syscall

import "sync/atomic"

func OrigRlimitNofile() *Rlimit {
return origRlimitNofile.Load()
}

func GetInternalOrigRlimitNofile() *atomic.Pointer[Rlimit] {
return &origRlimitNofile
}
63 changes: 63 additions & 0 deletions src/syscall/syscall_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -654,3 +654,66 @@ func TestAllThreadsSyscallBlockedSyscall(t *testing.T) {
wr.Close()
wg.Wait()
}

func TestPrlimitSelf(t *testing.T) {
origLimit := syscall.OrigRlimitNofile()
origRlimitNofile := syscall.GetInternalOrigRlimitNofile()
defer origRlimitNofile.Store(origLimit)

origRlimitNofile.Store(&syscall.Rlimit{
Cur: 1024,
Max: 65536,
})

// Get the current nofile limit
var lim syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &lim); err != nil {
t.Fatalf("Failed to get the current nofile limit: %v", err)
}
// Set current process's nofile limit through prlimit
if err := syscall.Prlimit(0, syscall.RLIMIT_NOFILE, &lim, nil); err != nil {
t.Fatalf("Prlimit self failed: %v", err)
}

rlimLater := origRlimitNofile.Load()
if rlimLater != nil {
t.Fatalf("origRlimitNofile expected to be nil, but got %v", rlimLater)
}
}

func TestPrlimitOtherProcess(t *testing.T) {
origLimit := syscall.OrigRlimitNofile()
origRlimitNofile := syscall.GetInternalOrigRlimitNofile()
defer origRlimitNofile.Store(origLimit)

origRlimitNofile.Store(&syscall.Rlimit{
Cur: 1024,
Max: 65536,
})
rlimOrig := origRlimitNofile.Load()

// Get the current nofile limit
var lim syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &lim); err != nil {
t.Fatalf("Failed to get the current nofile limit: %v", err)
}

// Start a child process firstly,
// so we can use Prlimit to set it's nofile limit.
cmd := exec.Command("sleep", "infinity")
cmd.Start()
defer func() {
cmd.Process.Kill()
cmd.Process.Wait()
}()

// Set child process's nofile rlimit through prlimit
if err := syscall.Prlimit(cmd.Process.Pid, syscall.RLIMIT_NOFILE, &lim, nil); err != nil {
t.Fatalf("Prlimit(%d) failed: %v", cmd.Process.Pid, err)
}

rlimLater := origRlimitNofile.Load()
if rlimLater != rlimOrig {
t.Fatalf("origRlimitNofile expected to be %v, but got %v", rlimOrig, rlimLater)
}
}

0 comments on commit 565a905

Please sign in to comment.