From 3c1911902d13c15b6fb2b21daeee065f61c0caac Mon Sep 17 00:00:00 2001 From: terminalchai Date: Fri, 20 Mar 2026 01:48:08 +0530 Subject: [PATCH 1/5] test: configure shared cmd state db --- cmd/main_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cmd/main_test.go b/cmd/main_test.go index fdd90122..de6d3574 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -2,20 +2,35 @@ package cmd import ( "os" + "path/filepath" "testing" + + "github.com/surge-downloader/surge/internal/config" + "github.com/surge-downloader/surge/internal/engine/state" ) func TestMain(m *testing.M) { tmpDir, err := os.MkdirTemp("", "surge-cmd-test-*") if err == nil { _ = os.Setenv("XDG_CONFIG_HOME", tmpDir) + _ = os.Setenv("XDG_DATA_HOME", tmpDir) + _ = os.Setenv("XDG_STATE_HOME", tmpDir) + _ = os.Setenv("XDG_CACHE_HOME", tmpDir) + _ = os.Setenv("XDG_RUNTIME_DIR", tmpDir) + _ = os.Setenv("HOME", tmpDir) _ = os.Setenv("APPDATA", tmpDir) _ = os.Setenv("USERPROFILE", tmpDir) + + if ensureErr := config.EnsureDirs(); ensureErr == nil { + state.CloseDB() + state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) + } } code := m.Run() if err == nil { + state.CloseDB() _ = os.RemoveAll(tmpDir) } os.Exit(code) From 527d4d78d730d4ef1109b689ca41840f205c157c Mon Sep 17 00:00:00 2001 From: terminalchai Date: Fri, 20 Mar 2026 01:58:09 +0530 Subject: [PATCH 2/5] test: harden cmd state DB setup --- cmd/main_test.go | 12 +++++++++--- cmd/test_env_test.go | 7 +++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/cmd/main_test.go b/cmd/main_test.go index de6d3574..05832ac1 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "os" "path/filepath" "testing" @@ -21,10 +22,15 @@ func TestMain(m *testing.M) { _ = os.Setenv("APPDATA", tmpDir) _ = os.Setenv("USERPROFILE", tmpDir) - if ensureErr := config.EnsureDirs(); ensureErr == nil { - state.CloseDB() - state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) + if ensureErr := config.EnsureDirs(); ensureErr != nil { + fmt.Fprintf(os.Stderr, "TestMain: failed to create isolated Surge test directories: %v\n", ensureErr) + os.Exit(1) } + + // Reset any previously configured/shared DB handle before pointing the + // package at the suite-wide isolated state path for cmd tests. + state.CloseDB() + state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) } code := m.Run() diff --git a/cmd/test_env_test.go b/cmd/test_env_test.go index c04c1135..f547aa9d 100644 --- a/cmd/test_env_test.go +++ b/cmd/test_env_test.go @@ -1,10 +1,12 @@ package cmd import ( + "path/filepath" "sync" "testing" "github.com/adrg/xdg" + "github.com/surge-downloader/surge/internal/config" "github.com/surge-downloader/surge/internal/engine/state" ) @@ -35,6 +37,11 @@ func setupXDGEnvIsolation(t *testing.T) string { xdg.CacheHome = oldCacheHome xdg.RuntimeDir = oldRuntimeDir state.CloseDB() + if err := config.EnsureDirs(); err != nil { + t.Errorf("failed to restore shared Surge test directories: %v", err) + } else { + state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) + } xdgEnvMu.Unlock() }) From aa1d1c81492d7962d371f33c678c45558fcdf6cb Mon Sep 17 00:00:00 2001 From: terminalchai Date: Fri, 20 Mar 2026 02:55:20 +0530 Subject: [PATCH 3/5] test: refactor shared state db reset --- cmd/main_test.go | 16 ++++++++++------ cmd/test_env_test.go | 8 +------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/cmd/main_test.go b/cmd/main_test.go index 05832ac1..a8b465e6 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -10,6 +10,15 @@ import ( "github.com/surge-downloader/surge/internal/engine/state" ) +func resetSharedStateDB() error { + // Reset any pre-existing global DB state (e.g. left by an init or an + // isolated test cleanup) before pointing the package at the shared suite DB. + state.CloseDB() + err := config.EnsureDirs() + state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) + return err +} + func TestMain(m *testing.M) { tmpDir, err := os.MkdirTemp("", "surge-cmd-test-*") if err == nil { @@ -22,15 +31,10 @@ func TestMain(m *testing.M) { _ = os.Setenv("APPDATA", tmpDir) _ = os.Setenv("USERPROFILE", tmpDir) - if ensureErr := config.EnsureDirs(); ensureErr != nil { + if ensureErr := resetSharedStateDB(); ensureErr != nil { fmt.Fprintf(os.Stderr, "TestMain: failed to create isolated Surge test directories: %v\n", ensureErr) os.Exit(1) } - - // Reset any previously configured/shared DB handle before pointing the - // package at the suite-wide isolated state path for cmd tests. - state.CloseDB() - state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) } code := m.Run() diff --git a/cmd/test_env_test.go b/cmd/test_env_test.go index f547aa9d..bc62a658 100644 --- a/cmd/test_env_test.go +++ b/cmd/test_env_test.go @@ -1,13 +1,10 @@ package cmd import ( - "path/filepath" "sync" "testing" "github.com/adrg/xdg" - "github.com/surge-downloader/surge/internal/config" - "github.com/surge-downloader/surge/internal/engine/state" ) var xdgEnvMu sync.Mutex @@ -36,11 +33,8 @@ func setupXDGEnvIsolation(t *testing.T) string { xdg.StateHome = oldStateHome xdg.CacheHome = oldCacheHome xdg.RuntimeDir = oldRuntimeDir - state.CloseDB() - if err := config.EnsureDirs(); err != nil { + if err := resetSharedStateDB(); err != nil { t.Errorf("failed to restore shared Surge test directories: %v", err) - } else { - state.Configure(filepath.Join(config.GetStateDir(), "surge.db")) } xdgEnvMu.Unlock() }) From 356e87e3f1063a3b97cbf089baff8ac663bfb42f Mon Sep 17 00:00:00 2001 From: terminalchai Date: Sun, 17 May 2026 03:51:27 +0530 Subject: [PATCH 4/5] test: remove tmpDir on early-exit path in TestMain --- cmd/main_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/main_test.go b/cmd/main_test.go index a8b465e6..794258ea 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -33,6 +33,7 @@ func TestMain(m *testing.M) { if ensureErr := resetSharedStateDB(); ensureErr != nil { fmt.Fprintf(os.Stderr, "TestMain: failed to create isolated Surge test directories: %v\n", ensureErr) + _ = os.RemoveAll(tmpDir) os.Exit(1) } } From 60026c082f3d3cf04aa3b8723994de024577e6c4 Mon Sep 17 00:00:00 2001 From: SuperCoolPencil Date: Mon, 18 May 2026 12:16:21 +0530 Subject: [PATCH 5/5] chore: go fmt --- internal/config/settings.go | 22 +++++++++++----------- internal/engine/types/accuracy_test.go | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/config/settings.go b/internal/config/settings.go index d2738b00..7fef40d1 100644 --- a/internal/config/settings.go +++ b/internal/config/settings.go @@ -68,19 +68,19 @@ type ExtensionSettings struct { // NetworkSettings contains network connection parameters. type NetworkSettings struct { - MaxConnectionsPerDownload int `json:"max_connections_per_host" ui_label:"Max Connections/Download" ui_desc:"Maximum concurrent connections per download (1-64)."` + MaxConnectionsPerDownload int `json:"max_connections_per_host" ui_label:"Max Connections/Download" ui_desc:"Maximum concurrent connections per download (1-64)."` // Deprecated: use MaxConnectionsPerDownload. // Kept as a non-serialized compatibility alias for older code paths and tests. - MaxConnectionsPerHost int `json:"-" ui_ignored:"true"` - MaxConcurrentDownloads int `json:"max_concurrent_downloads" ui_label:"Max Concurrent Downloads" ui_desc:"Maximum number of downloads running at once (1-10)." ui_restart:"true"` - MaxConcurrentProbes int `json:"max_concurrent_probes" ui_label:"Max Concurrent Probes" ui_desc:"Maximum number of simultaneous server probes when adding many downloads at once (1-10)." ui_restart:"true"` - UserAgent string `json:"user_agent" ui_label:"User Agent" ui_desc:"Custom User-Agent string for HTTP requests. Leave empty for default."` - ProxyURL string `json:"proxy_url" ui_label:"Proxy URL" ui_desc:"HTTP/HTTPS proxy URL (e.g. http://127.0.0.1:1700). Leave empty to use system default."` - CustomDNS string `json:"custom_dns" ui_label:"Custom DNS Server" ui_desc:"Set custom DNS (e.g., 1.1.1.1:53, 94.140.14.14:53). Leave empty for system."` - SequentialDownload bool `json:"sequential_download" ui_label:"Sequential Download" ui_desc:"Download pieces in order (Streaming Mode). May be slower."` - MinChunkSize int64 `json:"min_chunk_size" ui_label:"Min Chunk Size" ui_desc:"Minimum download chunk size in MB (e.g., 2)."` - WorkerBufferSize int `json:"worker_buffer_size" ui_label:"Worker Buffer Size" ui_desc:"I/O buffer size per worker in KB (e.g., 512)."` - DialHedgeCount int `json:"dial_hedge_count" ui_label:"Dial Hedge Count" ui_desc:"Number of extra connections to dial pre-emptively to avoid slow connects (0-16)."` + MaxConnectionsPerHost int `json:"-" ui_ignored:"true"` + MaxConcurrentDownloads int `json:"max_concurrent_downloads" ui_label:"Max Concurrent Downloads" ui_desc:"Maximum number of downloads running at once (1-10)." ui_restart:"true"` + MaxConcurrentProbes int `json:"max_concurrent_probes" ui_label:"Max Concurrent Probes" ui_desc:"Maximum number of simultaneous server probes when adding many downloads at once (1-10)." ui_restart:"true"` + UserAgent string `json:"user_agent" ui_label:"User Agent" ui_desc:"Custom User-Agent string for HTTP requests. Leave empty for default."` + ProxyURL string `json:"proxy_url" ui_label:"Proxy URL" ui_desc:"HTTP/HTTPS proxy URL (e.g. http://127.0.0.1:1700). Leave empty to use system default."` + CustomDNS string `json:"custom_dns" ui_label:"Custom DNS Server" ui_desc:"Set custom DNS (e.g., 1.1.1.1:53, 94.140.14.14:53). Leave empty for system."` + SequentialDownload bool `json:"sequential_download" ui_label:"Sequential Download" ui_desc:"Download pieces in order (Streaming Mode). May be slower."` + MinChunkSize int64 `json:"min_chunk_size" ui_label:"Min Chunk Size" ui_desc:"Minimum download chunk size in MB (e.g., 2)."` + WorkerBufferSize int `json:"worker_buffer_size" ui_label:"Worker Buffer Size" ui_desc:"I/O buffer size per worker in KB (e.g., 512)."` + DialHedgeCount int `json:"dial_hedge_count" ui_label:"Dial Hedge Count" ui_desc:"Number of extra connections to dial pre-emptively to avoid slow connects (0-16)."` } // PerformanceSettings contains performance tuning parameters. diff --git a/internal/engine/types/accuracy_test.go b/internal/engine/types/accuracy_test.go index 27c939aa..33b8f57f 100644 --- a/internal/engine/types/accuracy_test.go +++ b/internal/engine/types/accuracy_test.go @@ -94,7 +94,7 @@ func TestRestoreBitmap_ShortBitmapRecoversWithoutPanic(t *testing.T) { state := types.NewProgressState("test-short-restore", totalSize) malformed := []byte{0x02} // Too short: only enough storage for 4 chunks. - expectedBytes := 25 // 100 chunks * 2 bits = 25 bytes. + expectedBytes := 25 // 100 chunks * 2 bits = 25 bytes. defer func() { if r := recover(); r != nil {