Files
wehub-resource-sync 36b3af2e3d
PR Check / Code Quality: Format (push) Failing after 1s
PR Check / Code Quality: Lint (darwin) (push) Failing after 0s
PR Check / Code Quality: Lint (freebsd) (push) Failing after 1s
PR Check / Code Quality: Lint (windows) (push) Failing after 1s
PR Check / Code Quality: Lint (linux) (push) Failing after 1s
PR Check / Security: Vulnerability Scan (push) Failing after 0s
Update Documentation / update-docs (push) Failing after 2s
PR Check / Code Quality: Vendor (push) Failing after 1s
PR Check / Code Quality: Coverage (push) Failing after 0s
PR Check / Tests: Unit (macos-latest) (push) Has been cancelled
PR Check / Tests: Unit (ubuntu-24.04) (push) Has been cancelled
PR Check / Tests: Unit (ubuntu-24.04-arm) (push) Has been cancelled
PR Check / Tests: Unit (windows-latest) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:22:06 +08:00

155 lines
3.9 KiB
Go

//go:build linux
package proc
import "testing"
func TestProcessState(t *testing.T) {
t.Parallel()
tests := []struct {
name string
fields []string
want string
}{
{name: "running", fields: []string{"R", "1", "1", "0"}, want: "R"},
{name: "sleeping", fields: []string{"S", "1", "1"}, want: "S"},
{name: "zombie", fields: []string{"Z"}, want: "Z"},
{name: "stopped", fields: []string{"T"}, want: "T"},
// /proc/<pid>/stat sometimes emits trailing flag letters; only the
// first character is the canonical state code.
{name: "extra characters trimmed", fields: []string{"Sl", "1"}, want: "S"},
{name: "empty fields", fields: nil, want: ""},
{name: "blank state token", fields: []string{""}, want: ""},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if got := processState(tt.fields); got != tt.want {
t.Errorf("processState(%v) = %q, want %q", tt.fields, got, tt.want)
}
})
}
}
func TestExtractContainerID(t *testing.T) {
t.Parallel()
const longID = "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
tests := []struct {
name string
cgroup string
dashPrefix string
slashPrefix string
want string
}{
{
name: "docker dash-prefix scope (typical systemd-managed docker)",
cgroup: "0::/system.slice/docker-" + longID + ".scope",
dashPrefix: "docker-",
slashPrefix: "docker/",
want: longID,
},
{
name: "docker slash-prefix (cgroupv1 / older docker)",
cgroup: "12:devices:/docker/" + longID,
dashPrefix: "docker-",
slashPrefix: "docker/",
want: longID,
},
{
name: "podman libpod-prefix scope",
cgroup: "0::/user.slice/user-1000.slice/user@1000.service/app.slice/libpod-" + longID + ".scope",
dashPrefix: "libpod-",
slashPrefix: "libpod/",
want: longID,
},
{
name: "slash-prefix path with extra ID chars uses first 64",
cgroup: "0::/docker/" + longID + "/extra",
dashPrefix: "docker-",
slashPrefix: "docker/",
want: longID,
},
{
name: "slash-prefix path with too-short remainder returns empty",
cgroup: "0::/docker/shortid",
dashPrefix: "docker-",
slashPrefix: "docker/",
want: "",
},
{
name: "no matching prefix",
cgroup: "0::/user.slice/user-1000.slice/session-2.scope",
dashPrefix: "docker-",
slashPrefix: "docker/",
want: "",
},
{
name: "empty cgroup",
cgroup: "",
dashPrefix: "docker-",
slashPrefix: "docker/",
want: "",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if got := extractContainerID(tt.cgroup, tt.dashPrefix, tt.slashPrefix); got != tt.want {
t.Errorf("extractContainerID(%q, %q, %q) = %q, want %q",
tt.cgroup, tt.dashPrefix, tt.slashPrefix, got, tt.want)
}
})
}
}
func TestExtractLXCBasedContainerName(t *testing.T) {
t.Parallel()
tests := []struct {
name string
cgroup string
want string
}{
{
name: "incus user-owned container",
cgroup: "0::/lxc.payload.user-1000_alpine-container/.lxc",
want: "alpine-container",
},
{
name: "lxc root-owned container (no user prefix)",
cgroup: "0::/lxc.payload.my-container/.lxc",
want: "my-container",
},
{
name: "lxc container with underscores in name",
cgroup: "0::/lxc.payload.test_raw_lxc_container_underline/.lxc",
want: "test_raw_lxc_container_underline",
},
{
name: "non-lxc cgroup (docker)",
cgroup: "0::/system.slice/docker-abc123.scope",
want: "",
},
{
name: "empty cgroup",
cgroup: "",
want: "",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if got := extractLXCBasedContainerName(tt.cgroup); got != tt.want {
t.Errorf("extractLXCBasedContainerName(%q) = %q, want %q", tt.cgroup, got, tt.want)
}
})
}
}