package main import ( "flag" "io" "reflect" "testing" "time" ) func TestAgentFlagsBeforeAndAfterCommand(t *testing.T) { for _, tc := range []struct { name string args []string want []string socket, listen string every time.Duration }{ {"legacy flags first", []string{"-socket=/custom/bird.ctl", "-watch-interval=45s", "watch"}, []string{"watch"}, "/custom/bird.ctl", "", 45 * time.Second}, {"compose command first", []string{"watch", "-socket=/run/bird/bird.ctl", "-watch-interval=30s"}, []string{"watch"}, "/run/bird/bird.ctl", "", 30 * time.Second}, {"serve", []string{"serve", "-listen=127.0.0.1:9999"}, []string{"serve"}, "", "127.0.0.1:9999", time.Minute}, {"mixed", []string{"-socket=/first", "watch", "-watch-interval=5s"}, []string{"watch"}, "/first", "", 5 * time.Second}, {"parse check", []string{"parse-check", "bird.conf"}, []string{"parse-check", "bird.conf"}, "", "", time.Minute}, {"global delimiter", []string{"--", "parse-check", "-bird.conf"}, []string{"parse-check", "-bird.conf"}, "", "", time.Minute}, {"flags then delimiter", []string{"-socket=/first", "--", "parse-check", "-bird.conf"}, []string{"parse-check", "-bird.conf"}, "/first", "", time.Minute}, {"delimiter as value", []string{"-socket", "--", "watch", "-watch-interval=5s"}, []string{"watch"}, "--", "", 5 * time.Second}, } { t.Run(tc.name, func(t *testing.T) { fs := flag.NewFlagSet("agent", flag.ContinueOnError) fs.SetOutput(io.Discard) socket := fs.String("socket", "", "") listen := fs.String("listen", "", "") every := fs.Duration("watch-interval", time.Minute, "") args, err := parseAgentArgs(fs, tc.args) if err != nil || !reflect.DeepEqual(args, tc.want) || *socket != tc.socket || *listen != tc.listen || *every != tc.every { t.Fatalf("args=%v socket=%s listen=%s every=%s err=%v", args, *socket, *listen, *every, err) } }) } } func TestAgentRejectsIgnoredFlagsAndUnexpectedArguments(t *testing.T) { for _, argv := range [][]string{{"watch", "-unknown=1"}, {"serve", "-unknown=1"}, {"watch", "unused"}, {"serve", "unused"}, {"configure", "unused"}} { fs := flag.NewFlagSet("agent", flag.ContinueOnError) fs.SetOutput(io.Discard) if _, err := parseAgentArgs(fs, argv); err == nil { t.Fatalf("ignored argv: %v", argv) } } }