141 lines
4.5 KiB
Go
141 lines
4.5 KiB
Go
package remote
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestNewKeepsZeroTimeoutUnlimited(t *testing.T) {
|
|
client := New(Config{Timeout: 0})
|
|
if client.client.Timeout != 0 {
|
|
t.Fatalf("timeout = %v, want 0", client.client.Timeout)
|
|
}
|
|
}
|
|
|
|
func TestNewKeepsPositiveTimeout(t *testing.T) {
|
|
client := New(Config{Timeout: 7 * time.Second})
|
|
if client.client.Timeout != 7*time.Second {
|
|
t.Fatalf("timeout = %v, want 7s", client.client.Timeout)
|
|
}
|
|
}
|
|
|
|
func TestExtractBaseURLFromEndpointLog(t *testing.T) {
|
|
got := extractBaseURLFromText(`2026-04-10 INFO Update endpoint success. endpoint config: https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com`)
|
|
want := "https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com"
|
|
if got != want {
|
|
t.Fatalf("got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestExtractBaseURLFromMarketplaceLog(t *testing.T) {
|
|
got := extractBaseURLFromText(`2026-04-30 [info] [Marketplace] Using service url: https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com/marketplace/_apis/public/gallery`)
|
|
want := "https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com"
|
|
if got != want {
|
|
t.Fatalf("got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestExtractBaseURLFromRawWindowsLogURL(t *testing.T) {
|
|
got := extractBaseURLFromText(`2026-05-06T12:00:00 endpoint=https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com/algo/api/v2/model/list`)
|
|
want := "https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com"
|
|
if got != want {
|
|
t.Fatalf("got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestExtractBaseURLIgnoresLingmaOSSAssetHost(t *testing.T) {
|
|
got := extractBaseURLFromText(`2026-05-06 endpoint config: https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com
|
|
2026-05-06 Download asset from: https://lingma-ide.oss-rg-china-mainland.aliyuncs.com/lingma-extension/download?name=plugin.zip`)
|
|
want := "https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com"
|
|
if got != want {
|
|
t.Fatalf("got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeBaseURLRepairsMissingLeadingH(t *testing.T) {
|
|
got := normalizeRemoteBaseURLHint(`ttps://ai-lingma-example-cn-beijing.rdc.aliyuncs.com`)
|
|
want := "https://ai-lingma-example-cn-beijing.rdc.aliyuncs.com"
|
|
if got != want {
|
|
t.Fatalf("got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeBaseURLRejectsLingmaOSSAssetHost(t *testing.T) {
|
|
if got := normalizeRemoteBaseURLHint(`https://lingma-ide.oss-rg-china-mainland.aliyuncs.com/lingma-extension/download`); got != "" {
|
|
t.Fatalf("got %q, want empty", got)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeBaseURLRejectsUnsupportedScheme(t *testing.T) {
|
|
if got := normalizeRemoteBaseURLHint(`ftp://ai-lingma-example-cn-beijing.rdc.aliyuncs.com`); got != "" {
|
|
t.Fatalf("got %q, want empty", got)
|
|
}
|
|
}
|
|
|
|
func TestModelListStatusErrorSuggestsManualRemoteBaseURLOn404(t *testing.T) {
|
|
client := New(Config{BaseURL: "https://lingma-ide.oss-rg-china-mainland.aliyuncs.com"})
|
|
err := client.modelListStatusError(404, `<Error><Code>NoSuchKey</Code></Error>`)
|
|
if err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
text := err.Error()
|
|
for _, want := range []string{
|
|
"https://lingma-ide.oss-rg-china-mainland.aliyuncs.com",
|
|
"远端 API 域名自动探测命中了错误地址",
|
|
"https://lingma.alibabacloud.com",
|
|
} {
|
|
if !strings.Contains(text, want) {
|
|
t.Fatalf("error %q missing %q", text, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestExtractMachineIDFromTextMarkers(t *testing.T) {
|
|
got := extractMachineIDFromText(`2026-05-06 info using machine id from file: abcdef1234567890abcdef`)
|
|
if got != "abcdef1234567890abcdef" {
|
|
t.Fatalf("machine id = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestExtractMachineIDFromTextJSON(t *testing.T) {
|
|
got := extractMachineIDFromText(`{"machineId":"windows-machine-id-1234567890","other":true}`)
|
|
if got != "windows-machine-id-1234567890" {
|
|
t.Fatalf("machine id = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestCandidateLingmaCacheDirsIncludesVSCodeSharedClientCache(t *testing.T) {
|
|
home := t.TempDir()
|
|
t.Setenv("HOME", home)
|
|
t.Setenv("USERPROFILE", home)
|
|
t.Setenv("LINGMA_CACHE_DIR", "")
|
|
dirs := candidateLingmaCacheDirs()
|
|
want := filepath.Join(home, ".lingma", "vscode", "sharedClientCache")
|
|
for _, dir := range dirs {
|
|
if dir == want {
|
|
return
|
|
}
|
|
}
|
|
t.Fatalf("missing vscode shared client cache %q in %#v", want, dirs)
|
|
}
|
|
|
|
func TestLoadMachineIDReadsVSCodeSharedClientCacheID(t *testing.T) {
|
|
dir := t.TempDir()
|
|
if err := os.MkdirAll(filepath.Join(dir, "cache"), 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(dir, "cache", "id"), []byte("abcdefghijklmnop1234"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got, err := loadMachineID(dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got != "abcdefghijklmnop1234" {
|
|
t.Fatalf("machine id = %q", got)
|
|
}
|
|
}
|