package accept import ( "fmt" "os" "strconv" "testing" "time" "git.asio.asia/nixevol/NixMsg/internal/protocol" "git.asio.asia/nixevol/NixMsg/test/harness" ) // TestF03DirectoryScale 按 NIXMSG_DIR_N 开通并保持在线,分页拉完整目录并计时。 // 默认跳过,不进入 task check。 func TestF03DirectoryScale(t *testing.T) { if os.Getenv("NIXMSG_DIR_SCALE") != "1" { t.Skip("设置 NIXMSG_DIR_SCALE=1 才跑目录规模测试") } n := 50 if v := os.Getenv("NIXMSG_DIR_N"); v != "" { parsed, err := strconv.Atoi(v) if err != nil || parsed < 1 { t.Fatalf("NIXMSG_DIR_N=%q", v) } n = parsed } srv, err := harness.Start(harness.Options{}) if err != nil { t.Fatal(err) } defer func() { _ = srv.Stop() }() ac := AdminLogin(t, srv) const password = "password1234" ids := make([]string, n) for i := 0; i < n; i++ { ids[i] = fmt.Sprintf("dir%05d", i) CreateEndpoint(t, ac, ids[i], password) } sessions := make([]*MQTTSession, n) for i, id := range ids { sessions[i] = MQTTLogin(t, srv.HTTPBase, id, password) } t.Cleanup(func() { for _, s := range sessions { if s != nil { s.Close() } } }) start := time.Now() got := 0 cursor := "" for page := 0; page < n+2; page++ { frame := map[string]any{ "v": 1, "type": protocol.TypeDirectoryList, "rid": fmt.Sprintf("d%d", page), "limit": protocol.MaxPageLimit, } if cursor != "" { frame["cursor"] = cursor } resp := sessions[0].Request(t, frame) if !resp.OK { t.Fatalf("directory page %d: %+v", page, resp.Raw) } data, _ := resp.Data.(map[string]any) items, _ := data["items"].([]any) got += len(items) next, _ := data["next_cursor"].(string) if next == "" { break } cursor = next } elapsed := time.Since(start) if got < n { t.Fatalf("listed %d want at least %d in %s", got, n, elapsed) } t.Logf("F03c N=%d listed=%d elapsed=%s", n, got, elapsed) }