feat: add JoeAppEngine OPC UA nodes, fix DCL auto-reconnect and quality push

- Add JoeAppEngine folder to OPC UA nodes.json (BTCS, AlarmCntsBySeverity, Scheduler/ScanTime)
- Fix DataConnectionActor: capture Self in PreStart for use from non-actor threads,
  preventing Self.Tell failure in Disconnected event handler
- Implement InstanceActor.HandleConnectionQualityChanged to mark attributes Bad on disconnect
- Fix LmxFakeProxy TagMapper to serialize arrays as JSON instead of "System.Int32[]"
- Allow DataType and DataSourceReference updates in TemplateService.UpdateAttributeAsync
- Update test_infra_opcua.md with JoeAppEngine documentation
This commit is contained in:
Joseph Doherty
2026-03-19 13:27:54 -04:00
parent ffdda51990
commit 7740a3bcf9
70 changed files with 2684 additions and 541 deletions

View File

@@ -0,0 +1,90 @@
using ScadaLink.CLI;
namespace ScadaLink.CLI.Tests;
public class CliConfigTests
{
[Fact]
public void Load_DefaultValues_WhenNoConfigExists()
{
// Clear environment variables that might affect the test
var origContact = Environment.GetEnvironmentVariable("SCADALINK_CONTACT_POINTS");
var origLdap = Environment.GetEnvironmentVariable("SCADALINK_LDAP_SERVER");
var origFormat = Environment.GetEnvironmentVariable("SCADALINK_FORMAT");
try
{
Environment.SetEnvironmentVariable("SCADALINK_CONTACT_POINTS", null);
Environment.SetEnvironmentVariable("SCADALINK_LDAP_SERVER", null);
Environment.SetEnvironmentVariable("SCADALINK_FORMAT", null);
var config = CliConfig.Load();
Assert.Equal(636, config.LdapPort);
Assert.True(config.LdapUseTls);
Assert.Equal("json", config.DefaultFormat);
}
finally
{
Environment.SetEnvironmentVariable("SCADALINK_CONTACT_POINTS", origContact);
Environment.SetEnvironmentVariable("SCADALINK_LDAP_SERVER", origLdap);
Environment.SetEnvironmentVariable("SCADALINK_FORMAT", origFormat);
}
}
[Fact]
public void Load_ContactPoints_FromEnvironment()
{
var orig = Environment.GetEnvironmentVariable("SCADALINK_CONTACT_POINTS");
try
{
Environment.SetEnvironmentVariable("SCADALINK_CONTACT_POINTS", "host1:8080,host2:8080");
var config = CliConfig.Load();
Assert.Equal(2, config.ContactPoints.Count);
Assert.Equal("host1:8080", config.ContactPoints[0]);
Assert.Equal("host2:8080", config.ContactPoints[1]);
}
finally
{
Environment.SetEnvironmentVariable("SCADALINK_CONTACT_POINTS", orig);
}
}
[Fact]
public void Load_LdapServer_FromEnvironment()
{
var orig = Environment.GetEnvironmentVariable("SCADALINK_LDAP_SERVER");
try
{
Environment.SetEnvironmentVariable("SCADALINK_LDAP_SERVER", "ldap.example.com");
var config = CliConfig.Load();
Assert.Equal("ldap.example.com", config.LdapServer);
}
finally
{
Environment.SetEnvironmentVariable("SCADALINK_LDAP_SERVER", orig);
}
}
[Fact]
public void Load_Format_FromEnvironment()
{
var orig = Environment.GetEnvironmentVariable("SCADALINK_FORMAT");
try
{
Environment.SetEnvironmentVariable("SCADALINK_FORMAT", "table");
var config = CliConfig.Load();
Assert.Equal("table", config.DefaultFormat);
}
finally
{
Environment.SetEnvironmentVariable("SCADALINK_FORMAT", orig);
}
}
}