mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-13 09:32:26 -04:00
* Wraps syestem info / posture checks into a goroutine with timeout e.checks = checks is set before doing the SyncMeta, so if it fails next time isCheckEquals compares true and bypasses the update. This is to avoid another repeating the 15 seconds hang. The checks will be synced on reconnect or posture checks changes push from mgmt. * Propagate context to OS calls that can leverage its cancellation / timeout * Distinguish timeout from cancellation in logs * Dont log twice * Block on timeout failure and reapply the exclude_ips * Refactor for complexity
86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
package system
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/shirou/gopsutil/v3/process"
|
|
)
|
|
|
|
func Benchmark_getRunningProcesses(b *testing.B) {
|
|
b.Run("getRunningProcesses new", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
ps, err := getRunningProcesses(context.Background())
|
|
if err != nil {
|
|
b.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if len(ps) == 0 {
|
|
b.Fatalf("expected non-empty process list, got empty")
|
|
}
|
|
}
|
|
})
|
|
b.Run("getRunningProcesses old", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
ps, err := getRunningProcessesOld()
|
|
if err != nil {
|
|
b.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if len(ps) == 0 {
|
|
b.Fatalf("expected non-empty process list, got empty")
|
|
}
|
|
}
|
|
})
|
|
s, _ := getRunningProcesses(context.Background())
|
|
b.Logf("getRunningProcesses returned %d processes", len(s))
|
|
s, _ = getRunningProcessesOld()
|
|
b.Logf("getRunningProcessesOld returned %d processes", len(s))
|
|
}
|
|
|
|
func TestCheckFileAndProcess_ContextCanceled(t *testing.T) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
|
|
// With a canceled context and non-empty paths the gathering must bail with an error
|
|
// instead of running the (potentially blocking) process scan / stat loop.
|
|
if _, err := checkFileAndProcess(ctx, []string{"/does/not/exist"}); err == nil {
|
|
t.Fatal("expected error on canceled context, got nil")
|
|
}
|
|
}
|
|
|
|
func TestCheckFileAndProcess_EmptyPaths(t *testing.T) {
|
|
// No check paths means no work to do: it must return immediately with no error,
|
|
// even on a canceled context (nothing to scan or stat).
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
|
|
files, err := checkFileAndProcess(ctx, nil)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error for empty paths: %v", err)
|
|
}
|
|
if len(files) != 0 {
|
|
t.Fatalf("expected no files, got %d", len(files))
|
|
}
|
|
}
|
|
|
|
func getRunningProcessesOld() ([]string, error) {
|
|
processes, err := process.Processes()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
processMap := make(map[string]bool)
|
|
for _, p := range processes {
|
|
path, _ := p.Exe()
|
|
if path != "" {
|
|
processMap[path] = true
|
|
}
|
|
}
|
|
|
|
uniqueProcesses := make([]string, 0, len(processMap))
|
|
for p := range processMap {
|
|
uniqueProcesses = append(uniqueProcesses, p)
|
|
}
|
|
|
|
return uniqueProcesses, nil
|
|
}
|