mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-08-31 19:08:29 +00:00
feat: Add unit tests and fakes for Crestron environment and data store
- Introduced `FakeCrestronEnvironment` and `FakeEthernetHelper` for testing purposes. - Implemented `InMemoryCrestronDataStore` to facilitate unit tests for data storage. - Created `DebugServiceTests` to validate the behavior of debug-related services. - Added project files for unit tests targeting .NET 9.0 with necessary dependencies. - Developed production adapters (`CrestronConsoleAdapter`, `CrestronDataStoreAdapter`, `CrestronEnvironmentAdapter`, `CrestronEthernetAdapter`) to interface with the Crestron SDK. - Updated `Debug` class to utilize injected service abstractions instead of direct SDK calls. - Enhanced `ControlSystem` initialization to register service adapters before usage.
This commit is contained in:
parent
bfb9838743
commit
24df4e7a03
21 changed files with 1020 additions and 93 deletions
36
src/PepperDash.Core.Abstractions/DebugServiceRegistration.cs
Normal file
36
src/PepperDash.Core.Abstractions/DebugServiceRegistration.cs
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
namespace PepperDash.Core.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Allows pre-registration of Crestron service implementations before the <c>Debug</c>
|
||||
/// static class initialises. Call <see cref="Register"/> from the composition root
|
||||
/// (e.g. ControlSystem constructor) <em>before</em> any code touches <c>Debug.*</c>.
|
||||
/// Test projects should call it with no-op / in-memory implementations so that the
|
||||
/// <c>Debug</c> static constructor never tries to reach the real Crestron SDK.
|
||||
/// </summary>
|
||||
public static class DebugServiceRegistration
|
||||
{
|
||||
/// <summary>Gets the registered environment abstraction, or <c>null</c> if not registered.</summary>
|
||||
public static ICrestronEnvironment? Environment { get; private set; }
|
||||
|
||||
/// <summary>Gets the registered console abstraction, or <c>null</c> if not registered.</summary>
|
||||
public static ICrestronConsole? Console { get; private set; }
|
||||
|
||||
/// <summary>Gets the registered data-store abstraction, or <c>null</c> if not registered.</summary>
|
||||
public static ICrestronDataStore? DataStore { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Registers the service implementations that <c>Debug</c> will use when its
|
||||
/// static constructor runs. Any parameter may be <c>null</c> to leave the
|
||||
/// corresponding service unregistered (the <c>Debug</c> class will skip that
|
||||
/// capability gracefully).
|
||||
/// </summary>
|
||||
public static void Register(
|
||||
ICrestronEnvironment? environment,
|
||||
ICrestronConsole? console,
|
||||
ICrestronDataStore? dataStore)
|
||||
{
|
||||
Environment = environment;
|
||||
Console = console;
|
||||
DataStore = dataStore;
|
||||
}
|
||||
}
|
||||
100
src/PepperDash.Core.Abstractions/Enums.cs
Normal file
100
src/PepperDash.Core.Abstractions/Enums.cs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
namespace PepperDash.Core.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors Crestron's <c>eDevicePlatform</c> without requiring the Crestron SDK.
|
||||
/// </summary>
|
||||
public enum DevicePlatform
|
||||
{
|
||||
/// <summary>Hardware appliance (e.g. CP4, MC4).</summary>
|
||||
Appliance,
|
||||
/// <summary>Crestron Virtual Control / server runtime.</summary>
|
||||
Server,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors Crestron's <c>eRuntimeEnvironment</c>.
|
||||
/// </summary>
|
||||
public enum RuntimeEnvironment
|
||||
{
|
||||
/// <summary>SimplSharpPro program slot (hardware 4-series).</summary>
|
||||
SimplSharpPro,
|
||||
/// <summary>SimplSharp (older 3-series or server environments).</summary>
|
||||
SimplSharp,
|
||||
/// <summary>Any other environment — check for completeness.</summary>
|
||||
Other,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors Crestron's <c>ConsoleAccessLevelEnum</c>.
|
||||
/// </summary>
|
||||
public enum ConsoleAccessLevel
|
||||
{
|
||||
AccessAdministrator = 0,
|
||||
AccessOperator = 1,
|
||||
AccessProgrammer = 2,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors Crestron's <c>eProgramStatusEventType</c>.
|
||||
/// </summary>
|
||||
public enum ProgramStatusEventType
|
||||
{
|
||||
Starting,
|
||||
Stopping,
|
||||
Paused,
|
||||
Resumed,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors the event type used by Crestron's <c>EthernetEventArgs</c>.
|
||||
/// </summary>
|
||||
public enum EthernetEventType
|
||||
{
|
||||
LinkDown = 0,
|
||||
LinkUp = 1,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event args for Crestron ethernet link events.
|
||||
/// </summary>
|
||||
public class PepperDashEthernetEventArgs : EventArgs
|
||||
{
|
||||
public EthernetEventType EthernetEventType { get; }
|
||||
public short EthernetAdapter { get; }
|
||||
|
||||
public PepperDashEthernetEventArgs(EthernetEventType eventType, short adapter)
|
||||
{
|
||||
EthernetEventType = eventType;
|
||||
EthernetAdapter = adapter;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors the set of <c>CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET</c> values
|
||||
/// used across this codebase — does not aim to be exhaustive.
|
||||
/// </summary>
|
||||
public enum EthernetParameterType
|
||||
{
|
||||
GetCurrentIpAddress,
|
||||
GetHostname,
|
||||
GetDomainName,
|
||||
GetLinkStatus,
|
||||
GetCurrentDhcpState,
|
||||
GetCurrentIpMask,
|
||||
GetCurrentRouter,
|
||||
GetMacAddress,
|
||||
GetDnsServer,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors Crestron's <c>SocketStatus</c> without requiring the Crestron SDK.
|
||||
/// </summary>
|
||||
public enum PepperDashSocketStatus
|
||||
{
|
||||
SocketNotConnected = 0,
|
||||
SocketConnected = 2,
|
||||
SocketConnectionInProgress = 6,
|
||||
SocketConnectFailed = 11,
|
||||
SocketDisconnecting = 12,
|
||||
SocketBrokenRemotely = 7,
|
||||
}
|
||||
32
src/PepperDash.Core.Abstractions/ICrestronConsole.cs
Normal file
32
src/PepperDash.Core.Abstractions/ICrestronConsole.cs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
namespace PepperDash.Core.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Abstracts <c>Crestron.SimplSharp.CrestronConsole</c> to allow unit testing
|
||||
/// without the Crestron SDK.
|
||||
/// </summary>
|
||||
public interface ICrestronConsole
|
||||
{
|
||||
/// <summary>Prints a line to the Crestron console/telnet output.</summary>
|
||||
void PrintLine(string message);
|
||||
|
||||
/// <summary>Prints text (without newline) to the Crestron console/telnet output.</summary>
|
||||
void Print(string message);
|
||||
|
||||
/// <summary>
|
||||
/// Sends a response string to the console for the currently-executing console command.
|
||||
/// </summary>
|
||||
void ConsoleCommandResponse(string message);
|
||||
|
||||
/// <summary>
|
||||
/// Registers a new command with the Crestron console.
|
||||
/// </summary>
|
||||
/// <param name="callback">Handler invoked when the command is typed.</param>
|
||||
/// <param name="command">Command name (no spaces).</param>
|
||||
/// <param name="helpText">Help text shown by the Crestron console.</param>
|
||||
/// <param name="accessLevel">Minimum access level required to run the command.</param>
|
||||
void AddNewConsoleCommand(
|
||||
Action<string> callback,
|
||||
string command,
|
||||
string helpText,
|
||||
ConsoleAccessLevel accessLevel);
|
||||
}
|
||||
31
src/PepperDash.Core.Abstractions/ICrestronDataStore.cs
Normal file
31
src/PepperDash.Core.Abstractions/ICrestronDataStore.cs
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
namespace PepperDash.Core.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Abstracts <c>Crestron.SimplSharp.CrestronDataStore.CrestronDataStoreStatic</c>
|
||||
/// to allow unit testing without the Crestron SDK.
|
||||
/// </summary>
|
||||
public interface ICrestronDataStore
|
||||
{
|
||||
/// <summary>Initialises the data store. Must be called once before any other operation.</summary>
|
||||
void InitStore();
|
||||
|
||||
/// <summary>Reads an integer value from the local (program-slot) store.</summary>
|
||||
/// <returns><c>true</c> if the value was found and read successfully.</returns>
|
||||
bool TryGetLocalInt(string key, out int value);
|
||||
|
||||
/// <summary>Writes an integer value to the local (program-slot) store.</summary>
|
||||
/// <returns><c>true</c> on success.</returns>
|
||||
bool SetLocalInt(string key, int value);
|
||||
|
||||
/// <summary>Writes an unsigned integer value to the local (program-slot) store.</summary>
|
||||
/// <returns><c>true</c> on success.</returns>
|
||||
bool SetLocalUint(string key, uint value);
|
||||
|
||||
/// <summary>Reads a boolean value from the local (program-slot) store.</summary>
|
||||
/// <returns><c>true</c> if the value was found and read successfully.</returns>
|
||||
bool TryGetLocalBool(string key, out bool value);
|
||||
|
||||
/// <summary>Writes a boolean value to the local (program-slot) store.</summary>
|
||||
/// <returns><c>true</c> on success.</returns>
|
||||
bool SetLocalBool(string key, bool value);
|
||||
}
|
||||
45
src/PepperDash.Core.Abstractions/ICrestronEnvironment.cs
Normal file
45
src/PepperDash.Core.Abstractions/ICrestronEnvironment.cs
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
namespace PepperDash.Core.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Abstracts <c>Crestron.SimplSharp.CrestronEnvironment</c> to allow unit testing
|
||||
/// without the Crestron SDK.
|
||||
/// </summary>
|
||||
public interface ICrestronEnvironment
|
||||
{
|
||||
/// <summary>Gets the platform the program is executing on.</summary>
|
||||
DevicePlatform DevicePlatform { get; }
|
||||
|
||||
/// <summary>Gets the current runtime environment.</summary>
|
||||
RuntimeEnvironment RuntimeEnvironment { get; }
|
||||
|
||||
/// <summary>Gets the platform-appropriate newline string.</summary>
|
||||
string NewLine { get; }
|
||||
|
||||
/// <summary>Gets the application number (program slot).</summary>
|
||||
uint ApplicationNumber { get; }
|
||||
|
||||
/// <summary>Gets the room ID (used in Crestron Virtual Control / server environments).</summary>
|
||||
uint RoomId { get; }
|
||||
|
||||
/// <summary>Raised when program status changes (starting, stopping, etc.).</summary>
|
||||
event EventHandler<ProgramStatusEventArgs> ProgramStatusChanged;
|
||||
|
||||
/// <summary>Raised when the ethernet link changes state.</summary>
|
||||
event EventHandler<PepperDashEthernetEventArgs> EthernetEventReceived;
|
||||
|
||||
/// <summary>Gets the application root directory path.</summary>
|
||||
string GetApplicationRootDirectory();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event args for <see cref="ICrestronEnvironment.ProgramStatusChanged"/>.
|
||||
/// </summary>
|
||||
public class ProgramStatusEventArgs : EventArgs
|
||||
{
|
||||
public ProgramStatusEventType EventType { get; }
|
||||
|
||||
public ProgramStatusEventArgs(ProgramStatusEventType eventType)
|
||||
{
|
||||
EventType = eventType;
|
||||
}
|
||||
}
|
||||
16
src/PepperDash.Core.Abstractions/IEthernetHelper.cs
Normal file
16
src/PepperDash.Core.Abstractions/IEthernetHelper.cs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
namespace PepperDash.Core.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Abstracts <c>Crestron.SimplSharp.CrestronEthernetHelper</c> to allow unit testing
|
||||
/// without the Crestron SDK.
|
||||
/// </summary>
|
||||
public interface IEthernetHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns a network parameter string for the specified adapter.
|
||||
/// </summary>
|
||||
/// <param name="parameter">The parameter to retrieve.</param>
|
||||
/// <param name="ethernetAdapterId">Ethernet adapter index (0 = LAN A).</param>
|
||||
/// <returns>String value of the requested parameter.</returns>
|
||||
string GetEthernetParameter(EthernetParameterType parameter, short ethernetAdapterId);
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<RootNamespace>PepperDash.Core.Abstractions</RootNamespace>
|
||||
<AssemblyName>PepperDash.Core.Abstractions</AssemblyName>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Deterministic>true</Deterministic>
|
||||
<NeutralLanguage>en</NeutralLanguage>
|
||||
<Title>PepperDash Core Abstractions</Title>
|
||||
<Company>PepperDash Technologies</Company>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<RepositoryUrl>https://github.com/PepperDash/PepperDashCore</RepositoryUrl>
|
||||
<NullableContextOptions>enable</NullableContextOptions>
|
||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||
<InformationalVersion>$(Version)</InformationalVersion>
|
||||
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||
<!-- No Crestron SDK reference — this project must remain hardware-agnostic so test projects can reference it -->
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
Loading…
Add table
Add a link
Reference in a new issue