Harden resolver and expand traffic runtime controls
This commit is contained in:
135
selective-vpn-api/app/traffic_appkey_test.go
Normal file
135
selective-vpn-api/app/traffic_appkey_test.go
Normal file
@@ -0,0 +1,135 @@
|
||||
package app
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestCanonicalizeAppKey(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
appKey string
|
||||
command string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "path vs bare command normalized to lowercase basename",
|
||||
command: "/usr/bin/Google-Chrome-Stable --new-window",
|
||||
want: "google-chrome-stable",
|
||||
},
|
||||
{
|
||||
name: "quoted path with spaces",
|
||||
command: "'/opt/My Apps/Opera' --private",
|
||||
want: "opera",
|
||||
},
|
||||
{
|
||||
name: "env wrapper skips assignments",
|
||||
command: "env GTK_THEME=Adwaita /usr/bin/Brave-Browser --incognito",
|
||||
want: "brave-browser",
|
||||
},
|
||||
{
|
||||
name: "flatpak run app id",
|
||||
command: "flatpak run org.mozilla.Firefox",
|
||||
want: "flatpak:org.mozilla.firefox",
|
||||
},
|
||||
{
|
||||
name: "snap run app id",
|
||||
command: "snap run --experimental foo.Bar",
|
||||
want: "snap:foo.bar",
|
||||
},
|
||||
{
|
||||
name: "gtk-launch desktop id",
|
||||
command: "gtk-launch Org.Gnome.Nautilus.desktop",
|
||||
want: "desktop:org.gnome.nautilus.desktop",
|
||||
},
|
||||
{
|
||||
name: "explicit app key fallback",
|
||||
appKey: "Opera",
|
||||
want: "opera",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
got := canonicalizeAppKey(tc.appKey, tc.command)
|
||||
if got != tc.want {
|
||||
t.Fatalf("canonicalizeAppKey(%q,%q) = %q, want %q", tc.appKey, tc.command, got, tc.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitCommandTokens(t *testing.T) {
|
||||
in := `env A=1 "/opt/My App/bin/App" --flag="x y"`
|
||||
got := splitCommandTokens(in)
|
||||
want := []string{"env", "A=1", "/opt/My App/bin/App", "--flag=x y"}
|
||||
if len(got) != len(want) {
|
||||
t.Fatalf("tokens len=%d want=%d tokens=%v", len(got), len(want), got)
|
||||
}
|
||||
for i := range want {
|
||||
if got[i] != want[i] {
|
||||
t.Fatalf("token[%d]=%q want=%q all=%v", i, got[i], want[i], got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDedupeTrafficAppProfilesByCanonicalAppKey(t *testing.T) {
|
||||
in := []TrafficAppProfile{
|
||||
{
|
||||
ID: "chrome-old",
|
||||
Target: "VPN",
|
||||
AppKey: "Google-Chrome-Stable",
|
||||
Command: "/usr/bin/Google-Chrome-Stable --new-window",
|
||||
UpdatedAt: "2026-02-20T10:00:00Z",
|
||||
},
|
||||
{
|
||||
ID: "chrome-new",
|
||||
Target: "vpn",
|
||||
AppKey: "google-chrome-stable",
|
||||
Command: "google-chrome-stable --incognito",
|
||||
UpdatedAt: "2026-02-20T11:00:00Z",
|
||||
},
|
||||
}
|
||||
out, changed := dedupeTrafficAppProfiles(in)
|
||||
if !changed {
|
||||
t.Fatalf("expected changed=true")
|
||||
}
|
||||
if len(out) != 1 {
|
||||
t.Fatalf("expected 1 profile, got %d", len(out))
|
||||
}
|
||||
if out[0].ID != "chrome-new" {
|
||||
t.Fatalf("expected newest profile to win, got id=%q", out[0].ID)
|
||||
}
|
||||
if out[0].AppKey != "google-chrome-stable" {
|
||||
t.Fatalf("expected canonical app key, got %q", out[0].AppKey)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDedupeAppMarkItemsByCanonicalAppKey(t *testing.T) {
|
||||
in := []appMarkItem{
|
||||
{
|
||||
ID: 101,
|
||||
Target: "VPN",
|
||||
AppKey: "Opera",
|
||||
Command: "/usr/bin/Opera --private",
|
||||
AddedAt: "2026-02-20T10:00:00Z",
|
||||
},
|
||||
{
|
||||
ID: 202,
|
||||
Target: "vpn",
|
||||
AppKey: "opera",
|
||||
Command: "opera --new-window",
|
||||
AddedAt: "2026-02-20T11:00:00Z",
|
||||
},
|
||||
}
|
||||
out, changed := dedupeAppMarkItems(in)
|
||||
if !changed {
|
||||
t.Fatalf("expected changed=true")
|
||||
}
|
||||
if len(out) != 1 {
|
||||
t.Fatalf("expected 1 app mark item, got %d", len(out))
|
||||
}
|
||||
if out[0].ID != 202 {
|
||||
t.Fatalf("expected newest item to win, got id=%d", out[0].ID)
|
||||
}
|
||||
if out[0].AppKey != "opera" {
|
||||
t.Fatalf("expected canonical app key, got %q", out[0].AppKey)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user