package main import ( "encoding/json" "fmt" "os" "slices" "strings" "testing" ) // aLongGroup is members as JSON over 200 KB: 1666 paths of the shape of mesh-delivery #5's change (novox/hq issue 1272). func aLongGroup(t *testing.T) string { t.Helper() var paths []string for i := 0; i < 1666; i++ { paths = append(paths, fmt.Sprintf("modules/mesh-delivery-forge-bridge/vendor/github.com/nats-io/nats-server/v2/server/certstore/certstore_windows_file_%04d.go", i)) } body, err := json.Marshal([]map[string]any{{"id": "novox/mesh-delivery#5", "paths": paths}, {"id": "novox/mesh-catalog#374"}}) if err != nil { t.Fatal(err) } if len(body) < 200<<10 { t.Fatalf("the members are only %d bytes", len(body)) } return string(body) } func readBackFromTheCommand(t *testing.T, argv []string, members string) { t.Helper() for _, a := range argv { if len(a) > 64<<10 { t.Errorf("an argument of %d bytes is handed to the command", len(a)) } } i := slices.Index(argv, "--members-file") if i < 0 { t.Fatalf("the command does not name a members file: %.200v", argv) } raw, err := os.ReadFile(argv[i+1]) if err != nil || string(raw) != members { t.Errorf("the file does not hold the whole members list (%d bytes, %v)", len(raw), err) } removeMembersFile(argv) if _, err := os.Stat(argv[i+1]); !os.IsNotExist(err) { t.Errorf("the file is still there after the command: %v", err) } } func TestDeliveryOrderHandsALongMembersListInAFile(t *testing.T) { // 1272/AC2 members := aLongGroup(t) argv, err := argvFor("delivery-order", map[string]any{"members": members}) if err != nil { t.Fatal(err) } if argv[0] != "delivery" || argv[1] != "order" { t.Errorf("the command is %.100v", strings.Join(argv, " ")) } readBackFromTheCommand(t, argv, members) } func TestAShortMembersListIsStillTheArgumentItWas(t *testing.T) { // 1272/AC3 members := `[{"id":"novox/a#1"},{"id":"novox/b#2"}]` argv, err := argvFor("delivery-order", map[string]any{"members": members}) want := []string{"delivery", "order", "--members", members} if err != nil || !slices.Equal(argv, want) { t.Errorf("a short list gives %v, %v, want %v", argv, err, want) } } func TestTheCommandReadsTheMembersFromTheFileAsFromTheArgument(t *testing.T) { // 1272/AC1 members := `[{"id":"novox/a#1"}]` argv, _ := membersFlags(strings.Repeat(" ", membersInArgument) + members) defer removeMembersFile(argv) if len(argv) != 2 || argv[0] != "--members-file" { t.Fatalf("a long list gives %v", argv) } if st, err := os.Stat(argv[1]); err != nil || st.Mode().Perm() != 0o600 { t.Errorf("the file is %v, %v", st, err) } }