节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
3.34 KiB
Stardust
package scenario

import (
	"context"
	"encoding/json"
	"io"
	"os"
	"path/filepath"
	"testing"
	"time"

	"staragent-conformance/internal/fakeserver"
)

func TestAllScenariosWithMockAgent(t *testing.T) {
	for _, def := range Definitions() {
		def := def
		t.Run(def.Name, func(t *testing.T) {
			ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second)
			defer cancel()

			server := fakeserver.New(fakeserver.Options{
				Period:           1,
				AutoPingInterval: 100 * time.Millisecond,
			})
			if err := server.Start(); err != nil {
				t.Fatalf("start fake server: %v", err)
			}
			defer server.Close()

			workDir := t.TempDir()
			configPath, dataDir, err := prepareConfig(server.URL(), workDir, "", 5)
			if err != nil {
				t.Fatalf("prepare config: %v", err)
			}
			sink := newLogSink(io.Discard)
			env := &Env{
				Ctx:        ctx,
				Options:    Options{MockAgent: true, Out: io.Discard},
				Server:     server,
				Control:    NewControl(server.URL()),
				WorkDir:    workDir,
				ConfigPath: configPath,
				DataDir:    dataDir,
				logs:       sink,
				out:        io.Discard,
			}
			defer env.StopAgent()

			if err := def.Run(ctx, env); err != nil {
				t.Fatalf("%v\nstate: %s\nlog:\n%s", err, summarizeState(server.State()), sink.String())
			}
		})
	}
}

func TestPrepareConfigTemplate(t *testing.T) {
	workDir := t.TempDir()
	template := filepath.Join("..", "..", "templates", "agent.json")
	configPath, dataDir, err := prepareConfig("http://127.0.0.1:45678", workDir, template, 5)
	if err != nil {
		t.Fatalf("prepareConfig: %v", err)
	}
	data, err := os.ReadFile(configPath)
	if err != nil {
		t.Fatalf("read config: %v", err)
	}
	var cfg map[string]any
	if err := json.Unmarshal(data, &cfg); err != nil {
		t.Fatalf("config is not JSON: %v\n%s", err, data)
	}
	if cfg["Server"] != "http://127.0.0.1:45678" {
		t.Fatalf("Server = %v", cfg["Server"])
	}
	if cfg["DataDir"] != dataDir {
		t.Fatalf("DataDir = %v, want %v", cfg["DataDir"], dataDir)
	}
	if cfg["Code"] != "" || cfg["Secret"] != "" {
		t.Fatalf("template must start with empty Code/Secret, got %v/%v", cfg["Code"], cfg["Secret"])
	}
	if cfg["ProductCode"] == "" {
		t.Fatal("ProductCode is empty")
	}
	if cfg["MetricsInterval"] != float64(5) {
		t.Fatalf("MetricsInterval = %v, want 5", cfg["MetricsInterval"])
	}
}

func TestPrepareConfigMetricsInterval(t *testing.T) {
	workDir := t.TempDir()
	templatePath := filepath.Join(workDir, "template.json")
	if err := os.WriteFile(templatePath, []byte(`{"Server":"x","DataDir":"y","ProductCode":"T","MetricsInterval":30}`), 0o600); err != nil {
		t.Fatal(err)
	}
	configPath, _, err := prepareConfig("http://127.0.0.1:1", workDir, templatePath, 5)
	if err != nil {
		t.Fatalf("prepareConfig: %v", err)
	}
	data, _ := os.ReadFile(configPath)
	var cfg map[string]any
	if err := json.Unmarshal(data, &cfg); err != nil {
		t.Fatal(err)
	}
	if cfg["MetricsInterval"] != float64(30) {
		t.Fatalf("template MetricsInterval = %v, want 30 (template must win)", cfg["MetricsInterval"])
	}

	configPath, _, err = prepareConfig("http://127.0.0.1:1", workDir+"/plain", "", 12)
	if err != nil {
		t.Fatalf("prepareConfig default: %v", err)
	}
	data, _ = os.ReadFile(configPath)
	cfg = nil
	if err := json.Unmarshal(data, &cfg); err != nil {
		t.Fatal(err)
	}
	if cfg["MetricsInterval"] != float64(12) {
		t.Fatalf("default MetricsInterval = %v, want 12", cfg["MetricsInterval"])
	}
}