Adds hundreds of unit/integration/e2e tests, fixes WS bcrypt auth, config merge, fleet analytics, agent schedule/log tail, and documents stale PROBLEMS items. Updates PROBLEMS.md, README, and test scripts; ignores local spread-kits and coverage dirs.
125 lines
3.0 KiB
Go
125 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"crypto-miner-agent/config"
|
|
)
|
|
|
|
func TestShortIDLong(t *testing.T) {
|
|
if got := shortID("abcdef1234567890"); got != "abcdef12" {
|
|
t.Fatalf("shortID long = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestShortIDShort(t *testing.T) {
|
|
if got := shortID("abc"); got != "abc" {
|
|
t.Fatalf("shortID short = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestShortIDEmpty(t *testing.T) {
|
|
if got := shortID(""); got != "pending" {
|
|
t.Fatalf("shortID empty = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestMustInstallPathUnknown(t *testing.T) {
|
|
cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{
|
|
InstallBase: "custom",
|
|
}}
|
|
if got := mustInstallPath(cfg); got != "unknown" {
|
|
t.Fatalf("mustInstallPath invalid cfg = %q, want unknown", got)
|
|
}
|
|
}
|
|
|
|
func TestMustInstallPathTemp(t *testing.T) {
|
|
cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{
|
|
InstallBase: "temp",
|
|
InstallRelativePath: "test-miner-install",
|
|
WorkerName: "w1",
|
|
BuildID: "build12345678",
|
|
}}
|
|
got := mustInstallPath(cfg)
|
|
if got == "unknown" || !strings.Contains(got, "test-miner-install") {
|
|
t.Fatalf("mustInstallPath temp = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestSetupLoggingStealthDiscards(t *testing.T) {
|
|
prev := log.Writer()
|
|
t.Cleanup(func() { log.SetOutput(prev) })
|
|
|
|
cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{StealthMode: true, FileLogging: true}}
|
|
setupLogging(cfg)
|
|
if log.Writer() != io.Discard {
|
|
t.Fatal("stealth mode should discard log output")
|
|
}
|
|
}
|
|
|
|
func TestSetupLoggingFileLoggingDisabled(t *testing.T) {
|
|
prev := log.Writer()
|
|
t.Cleanup(func() { log.SetOutput(prev) })
|
|
|
|
cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{FileLogging: false}}
|
|
setupLogging(cfg)
|
|
if log.Writer() != io.Discard {
|
|
t.Fatal("file logging disabled should discard output")
|
|
}
|
|
}
|
|
|
|
func closeLogFileWriter() {
|
|
if f, ok := log.Writer().(*os.File); ok {
|
|
_ = f.Close()
|
|
}
|
|
}
|
|
|
|
func TestSetupLoggingEnvLogFile(t *testing.T) {
|
|
prev := log.Writer()
|
|
dir := t.TempDir()
|
|
logPath := filepath.Join(dir, "nested", "agent.log")
|
|
t.Setenv("MINER_LOG_FILE", logPath)
|
|
t.Cleanup(func() {
|
|
closeLogFileWriter()
|
|
log.SetOutput(prev)
|
|
_ = os.Unsetenv("MINER_LOG_FILE")
|
|
})
|
|
|
|
cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{FileLogging: true}}
|
|
setupLogging(cfg)
|
|
if log.Writer() == io.Discard {
|
|
t.Fatal("MINER_LOG_FILE should enable file logging")
|
|
}
|
|
if _, err := os.Stat(logPath); err != nil {
|
|
t.Fatalf("expected log file at %s: %v", logPath, err)
|
|
}
|
|
}
|
|
|
|
func TestRedirectLogCreatesFile(t *testing.T) {
|
|
prev := log.Writer()
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "logs", "redirect.log")
|
|
t.Cleanup(func() {
|
|
closeLogFileWriter()
|
|
log.SetOutput(prev)
|
|
})
|
|
|
|
redirectLog(path)
|
|
log.Print("redirect test line")
|
|
if _, err := os.Stat(path); err != nil {
|
|
t.Fatalf("redirectLog should create %s: %v", path, err)
|
|
}
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(string(data), "redirect test line") {
|
|
t.Fatalf("log file contents: %q", data)
|
|
}
|
|
}
|