83 lines
2.5 KiB
Go
83 lines
2.5 KiB
Go
package epics_test
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/uopi/goca/proto"
|
|
"github.com/uopi/goca/testca"
|
|
"github.com/uopi/uopi/internal/datasource/epics"
|
|
)
|
|
|
|
func TestDiscovery_EnvironmentVariables(t *testing.T) {
|
|
// 1. Setup a fake CA server.
|
|
srv, err := testca.New([]testca.PVSpec{
|
|
{Name: "DISCO:PV", DBFType: proto.DBFDouble, Count: 1, Value: 123.45},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("testca.New: %v", err)
|
|
}
|
|
defer srv.Close()
|
|
|
|
// 2. Set the environment variable to point to this server.
|
|
os.Setenv("EPICS_CA_ADDR_LIST", srv.UDPAddr())
|
|
os.Setenv("EPICS_CA_AUTO_ADDR_LIST", "NO")
|
|
defer os.Unsetenv("EPICS_CA_ADDR_LIST")
|
|
defer os.Unsetenv("EPICS_CA_AUTO_ADDR_LIST")
|
|
|
|
// 3. Create datasource with NO explicit address (should pick up from env).
|
|
ds := epics.New("", "", "", "", false, nil)
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
if err := ds.Connect(ctx); err != nil {
|
|
t.Fatalf("Connect: %v", err)
|
|
}
|
|
|
|
// 4. Verify discovery works.
|
|
meta, err := ds.GetMetadata(ctx, "DISCO:PV")
|
|
if err != nil {
|
|
t.Fatalf("GetMetadata failed (discovery failed): %v", err)
|
|
}
|
|
if meta.Name != "DISCO:PV" {
|
|
t.Errorf("got %q, want DISCO:PV", meta.Name)
|
|
}
|
|
}
|
|
|
|
func TestDiscovery_ConfigOverride(t *testing.T) {
|
|
// 1. Setup TWO fake CA servers.
|
|
srv1, _ := testca.New([]testca.PVSpec{{Name: "PV:1", DBFType: proto.DBFDouble, Value: 1.0}})
|
|
defer srv1.Close()
|
|
srv2, _ := testca.New([]testca.PVSpec{{Name: "PV:2", DBFType: proto.DBFDouble, Value: 2.0}})
|
|
defer srv2.Close()
|
|
|
|
// 2. Point env to srv1.
|
|
os.Setenv("EPICS_CA_ADDR_LIST", srv1.UDPAddr())
|
|
os.Setenv("EPICS_CA_AUTO_ADDR_LIST", "NO")
|
|
defer os.Unsetenv("EPICS_CA_ADDR_LIST")
|
|
defer os.Unsetenv("EPICS_CA_AUTO_ADDR_LIST")
|
|
|
|
// 3. Create datasource pointing explicitly to srv2 (should OVERRIDE env).
|
|
ds := epics.New(srv2.UDPAddr(), "", "", "", false, nil)
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
if err := ds.Connect(ctx); err != nil {
|
|
t.Fatalf("Connect: %v", err)
|
|
}
|
|
|
|
// 4. PV from srv2 should be found.
|
|
if _, err := ds.GetMetadata(ctx, "PV:2"); err != nil {
|
|
t.Errorf("PV:2 from config address not found: %v", err)
|
|
}
|
|
|
|
// 5. PV from srv1 should NOT be found (since AutoAddrList is disabled by config override).
|
|
ctx2, cancel2 := context.WithTimeout(context.Background(), 500*time.Millisecond)
|
|
defer cancel2()
|
|
if _, err := ds.GetMetadata(ctx2, "PV:1"); err == nil {
|
|
t.Error("PV:1 from env address was found, but config should have overridden it")
|
|
}
|
|
}
|