Skip to content

Commit

Permalink
Refactor channels and update test methods
Browse files Browse the repository at this point in the history
Refactored `MediaChannel` and `ReceiverChannel` to inherit from `ChromecastChannel` and handle single status objects. Removed `StatusChannel.cs` and integrated its functionality. Updated `MemberData` attributes in test files to use `ChromecastReceiversFilter.GetAny`. Enhanced error handling in `MediaChannelTester.cs` and increased delay in `QueueLoadAsync` test. Added media metadata in `TestHelper.cs`. Renamed `StopMessage` to `StopMediaMessage` and updated related types. Uncommented code in `MemoryAllocationTester.cs`.
  • Loading branch information
Tapanila committed Dec 26, 2024
1 parent 4da0755 commit 8050fe4
Show file tree
Hide file tree
Showing 16 changed files with 94 additions and 122 deletions.
4 changes: 2 additions & 2 deletions Sharpcaster.Test/ChromecastConnectionTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public ChromecastConnectionTester(ITestOutputHelper outputHelper, ChromecastDevi
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task SearchChromecastsAndConnectToIt(ChromecastReceiver receiver)
{
var TestHelper = new TestHelper();
Expand Down Expand Up @@ -76,7 +76,7 @@ public async Task TestingHeartBeat(ChromecastReceiver receiver)
int commandsToRun = 10;

//We are setting up an event to listen to status change. Because we don't know when the video has started to play
client.MediaChannel.StatusChanged += (object sender, IEnumerable<MediaStatus> e) =>
client.MediaChannel.StatusChanged += (object sender, MediaStatus e) =>
{
_autoResetEvent.Set();
};
Expand Down
8 changes: 1 addition & 7 deletions Sharpcaster.Test/JsonTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,7 @@ public void TestConnectMessage()
IMessage connectMessage = new ConnectMessage();
var requestId = (connectMessage as IMessageWithId).RequestId;

var options = new JsonSerializerOptions
{
TypeInfoResolver = SharpcasteSerializationContext.Default
};


var output = JsonSerializer.Serialize(connectMessage, options);
var output = JsonSerializer.Serialize(connectMessage, SharpcasteSerializationContext.Default.ConnectMessage);
Assert.Equal("{\"requestId\":" + requestId + ",\"type\":\"CONNECT\"}", output);
}

Expand Down
2 changes: 1 addition & 1 deletion Sharpcaster.Test/LoggingTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void TestLogging()
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task TestPlayMediaWorksWithoutLogging(ChromecastReceiver receiver)
{
ChromecastClient client = new();
Expand Down
30 changes: 18 additions & 12 deletions Sharpcaster.Test/MediaChannelTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ public async Task TestWaitForDeviceStopDuringPlayback(ChromecastReceiver receive
AutoResetEvent _disconnectReceived = new(false);
IMediaChannel mediaChannel = client.MediaChannel;

mediaChannel.StatusChanged += (object sender, IEnumerable<MediaStatus> e) =>
mediaChannel.StatusChanged += (object sender, MediaStatus e) =>
{
output.WriteLine(e.FirstOrDefault()?.PlayerState.ToString());
output.WriteLine(e.PlayerState.ToString());
};

client.Disconnected += (object sender, EventArgs e) =>
Expand Down Expand Up @@ -100,12 +100,12 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev(ChromecastReceiver re
var mediaStatusChanged = 0;

//We are setting up an event to listen to status change. Because we don't know when the audio has started to play
mediaChannel.StatusChanged += async (object sender, IEnumerable<MediaStatus> e) =>
mediaChannel.StatusChanged += async (object sender, MediaStatus e) =>
{
try
{
mediaStatusChanged += 1;
MediaStatus status = e.FirstOrDefault();
MediaStatus status = e;
int currentItemId = status?.CurrentItemId ?? -1;

if (currentItemId != -1 && status.PlayerState == PlayerStateType.Playing)
Expand Down Expand Up @@ -194,7 +194,7 @@ public async Task TestLoadMediaQueueAndCheckContent(ChromecastReceiver receiver)
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task TestLoadingMediaQueue(ChromecastReceiver receiver)
{
var TestHelper = new TestHelper();
Expand Down Expand Up @@ -231,7 +231,7 @@ public async Task TestLoadingMedia(ChromecastReceiver receiver)
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task StartApplicationAThenStartBAndLoadMedia(ChromecastReceiver receiver)
{
var th = new TestHelper();
Expand Down Expand Up @@ -268,10 +268,10 @@ public async Task TestLoadingAndPausingMedia(ChromecastReceiver receiver)
bool firstPlay = true;

//We are setting up an event to listen to status change. Because we don't know when the video has started to play
client.MediaChannel.StatusChanged += async (object sender, IEnumerable<MediaStatus> e) =>
client.MediaChannel.StatusChanged += async (object sender, MediaStatus e) =>
{
//runSequence += ".";
if (e.FirstOrDefault().PlayerState == PlayerStateType.Playing)
if (e.PlayerState == PlayerStateType.Playing)
{
if (firstPlay)
{
Expand Down Expand Up @@ -314,11 +314,11 @@ public async Task TestLoadingAndStoppingMedia(ChromecastReceiver receiver)
bool firstPlay = true;

//We are setting up an event to listen to status change. Because we don't know when the video has started to play
client.MediaChannel.StatusChanged += async (object sender, IEnumerable<MediaStatus> e) =>
client.MediaChannel.StatusChanged += async (object sender, MediaStatus e) =>
{
try
{
if (e.FirstOrDefault().PlayerState == PlayerStateType.Playing)
if (e.PlayerState == PlayerStateType.Playing)
{
if (firstPlay)
{
Expand Down Expand Up @@ -507,14 +507,20 @@ public async Task TestFailingQueue(ChromecastReceiver receiver)

client.MediaChannel.InvalidRequest += (object sender, InvalidRequestMessage e) =>
{
output.WriteLine("Error happened: " + e.Reason);
output.WriteLine("Invalid Request Error happened: " + e.Reason);
errorHappened = true;
};

client.MediaChannel.LoadFailed += (object sender, LoadFailedMessage e) =>
{
output.WriteLine("Load Failed Error happened and failing media was " + e.ItemId);
errorHappened = true;
};

var result = await client.MediaChannel.QueueLoadAsync(MyCd);


await Task.Delay(200);
await Task.Delay(2000);
Assert.True(errorHappened);
}
}
Expand Down
4 changes: 2 additions & 2 deletions Sharpcaster.Test/MemoryAllocationTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ public async Task ConnectToChromecastAndLaunchApplication()
var client = new ChromecastClient();
Assert.NotEmpty(receivers);
await client.ConnectChromecast(receivers.First());
//var status = await client.LaunchApplicationAsync("B3419EF5");
var status = await client.LaunchApplicationAsync("B3419EF5");

//Assert.Equal("B3419EF5", status.Application.AppId);
Assert.Equal("B3419EF5", status.Application.AppId);

await client.DisconnectAsync();

Expand Down
14 changes: 4 additions & 10 deletions Sharpcaster.Test/ReceiverChannelTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public ReceiverChannelTester(ITestOutputHelper outputHelper, ChromecastDevicesFi
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task TestMute(ChromecastReceiver receiver)
{
var TestHelper = new TestHelper();
Expand All @@ -30,7 +30,7 @@ public async Task TestMute(ChromecastReceiver receiver)
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task TestUnMute(ChromecastReceiver receiver)
{
var TestHelper = new TestHelper();
Expand All @@ -41,7 +41,7 @@ public async Task TestUnMute(ChromecastReceiver receiver)
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task TestVolume(ChromecastReceiver receiver)
{
var TestHelper = new TestHelper();
Expand All @@ -59,7 +59,7 @@ public async Task TestVolume(ChromecastReceiver receiver)
}

[Theory]
[MemberData(nameof(ChromecastReceiversFilter.GetAll), MemberType = typeof(ChromecastReceiversFilter))]
[MemberData(nameof(ChromecastReceiversFilter.GetAny), MemberType = typeof(ChromecastReceiversFilter))]
public async Task TestStoppingApplication(ChromecastReceiver receiver)
{
var TestHelper = new TestHelper();
Expand Down Expand Up @@ -89,12 +89,6 @@ public async Task TestApplicationLaunchStatusMessage(ChromecastReceiver receiver

var status = await client.ReceiverChannel.StopApplication();
Assert.Null(status.Applications);
Assert.Equal("USER_ALLOWED", launchStatus);
}

private void ReceiverChannel_LaunchStatusChanged(object sender, Messages.Receiver.LaunchStatusMessage e)
{
throw new System.NotImplementedException();
}
}
}
21 changes: 18 additions & 3 deletions Sharpcaster.Test/helper/TestHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -337,21 +337,36 @@ public static QueueItem[] CreateFailingQueue
{
Media = new Media
{
ContentUrl = "https://audionautix.com/Music/AwayInAManger.mp3"
ContentUrl = "https://audionautix.com/Music/AwayInAManger.mp33",
Metadata = new MediaMetadata
{
Title = "Away In A Manger",
SubTitle = "Christmas Songs"
}
}
},
new QueueItem()
{
Media = new Media
{
ContentUrl = "https://audionautix.com/Music/CarolOfTheBells.mp3"
ContentUrl = "https://audionautix.com/Music/CarolOfTheBells.mp33",
Metadata = new MediaMetadata
{
Title = "Carol Of The Bells",
SubTitle = "Christmas Songs"
}
}
},
new QueueItem()
{
Media = new Media
{
ContentUrl = "https://audionautix.com/Music/JoyToTheWorld.mp3"
ContentUrl = "https://audionautix.com/Music/JoyToTheWorld.mp33",
Metadata = new MediaMetadata
{
Title = "Joy To The World",
SubTitle = "Christmas Songs"
}
}
}

Expand Down
30 changes: 20 additions & 10 deletions Sharpcaster/Channels/MediaChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
using Sharpcaster.Interfaces;
using Sharpcaster.Messages.Media;
using Sharpcaster.Messages.Queue;
using Sharpcaster.Messages.Receiver;
using Sharpcaster.Models.ChromecastStatus;
using Sharpcaster.Models.Media;
using Sharpcaster.Models.Queue;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
Expand All @@ -17,7 +18,7 @@ namespace Sharpcaster.Channels
/// <summary>
/// Media channel
/// </summary>
public class MediaChannel : StatusChannel<MediaStatusMessage, IEnumerable<MediaStatus>>, IMediaChannel
public class MediaChannel : ChromecastChannel, IMediaChannel
{
/// <summary>
/// Raised when error is received
Expand All @@ -26,7 +27,10 @@ public class MediaChannel : StatusChannel<MediaStatusMessage, IEnumerable<MediaS
public event EventHandler<LoadCancelledMessage> LoadCancelled;
public event EventHandler<LoadFailedMessage> LoadFailed;
public event EventHandler<InvalidRequestMessage> InvalidRequest;
public MediaStatus MediaStatus { get => Status.FirstOrDefault(); }
public event EventHandler<MediaStatus> StatusChanged;

public MediaStatus MediaStatus { get => mediaStatus; }
private MediaStatus mediaStatus;
/// <summary>
/// Initializes a new instance of MediaChannel class
/// </summary>
Expand All @@ -40,7 +44,7 @@ private async Task<MediaStatus> SendAsync(int messageRequestId, string messagePa
{
var response = await SendAsync(messageRequestId, messagePayload, application.TransportId);
var mediaStatusMessage = JsonSerializer.Deserialize(response, SharpcasteSerializationContext.Default.MediaStatusMessage);
if (DoNotReturnOnLoading && mediaStatusMessage.Status.FirstOrDefault()?.ExtendedStatus?.PlayerState == PlayerStateType.Loading)
if (DoNotReturnOnLoading && mediaStatusMessage.Status?.FirstOrDefault()?.ExtendedStatus?.PlayerState == PlayerStateType.Loading)
{
response = await Client.WaitResponseAsync(messageRequestId);
mediaStatusMessage = JsonSerializer.Deserialize(response, SharpcasteSerializationContext.Default.MediaStatusMessage);
Expand All @@ -50,15 +54,15 @@ private async Task<MediaStatus> SendAsync(int messageRequestId, string messagePa
catch (Exception ex)
{
Logger?.LogError("Error sending message: {exceptionMessage}", ex.Message);
Status = null;
mediaStatus = null;
throw;
}
}

private async Task<MediaStatus> SendAsync(MediaSessionMessage message)
{
var chromecastStatus = Client.GetChromecastStatus();
message.MediaSessionId = Status?.First().MediaSessionId ?? throw new ArgumentNullException(nameof(message), "MediaSessionID");
message.MediaSessionId = MediaStatus?.MediaSessionId ?? throw new ArgumentNullException(nameof(message), "MediaSessionID");
var messagePayload = JsonSerializer.Serialize(message, SharpcasteSerializationContext.Default.MediaSessionMessage);
return await SendAsync(message.RequestId, messagePayload, chromecastStatus.Applications[0]);
}
Expand Down Expand Up @@ -96,8 +100,14 @@ public override Task OnMessageReceivedAsync(string messagePayload, string type)
var errorMessage = JsonSerializer.Deserialize(messagePayload, SharpcasteSerializationContext.Default.ErrorMessage);
ErrorHappened?.Invoke(this, errorMessage);
return Task.CompletedTask;
case "MEDIA_STATUS":
var mediaStatusMessage = JsonSerializer.Deserialize(messagePayload, SharpcasteSerializationContext.Default.MediaStatusMessage);
mediaStatus = mediaStatusMessage.Status.FirstOrDefault();
StatusChanged?.Invoke(this, MediaStatus);
return Task.CompletedTask;
}
return base.OnMessageReceivedAsync(messagePayload, type);
Debugger.Break();
return Task.CompletedTask;
}

/// <summary>
Expand All @@ -124,7 +134,7 @@ public async Task<MediaStatus> PauseAsync()
/// <returns>media status</returns>
public async Task<MediaStatus> StopAsync()
{
return await SendAsync(new StopMessage());
return await SendAsync(new StopMediaMessage());
}

/// <summary>
Expand Down Expand Up @@ -181,8 +191,8 @@ public async Task<int[]> QueueGetItemIdsAsync()
public async Task<MediaStatus> GetMediaStatusAsync()
{
var chromecastStatus = Client.GetChromecastStatus();
var mediaStatusMessage = new MediaStatusMessage();
var response = await SendAsync(mediaStatusMessage.RequestId, JsonSerializer.Serialize(mediaStatusMessage, SharpcasteSerializationContext.Default.MediaStatusMessage), chromecastStatus.Application.TransportId);
var mediaStatusMessage = new GetStatusMessage();
var response = await SendAsync(mediaStatusMessage.RequestId, JsonSerializer.Serialize(mediaStatusMessage, SharpcasteSerializationContext.Default.GetStatusMessage), chromecastStatus.Application.TransportId);
var mediaStatus = JsonSerializer.Deserialize(response, SharpcasteSerializationContext.Default.MediaStatusMessage);
return mediaStatus.Status.FirstOrDefault();
}
Expand Down
13 changes: 8 additions & 5 deletions Sharpcaster/Channels/ReceiverChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@ namespace Sharpcaster.Channels
/// <summary>
/// ReceiverChannel, Receives ChromecastStatus, volume, starting and stopping application
/// </summary>
public class ReceiverChannel : StatusChannel<ReceiverStatusMessage, ChromecastStatus>, IReceiverChannel
public class ReceiverChannel : ChromecastChannel, IReceiverChannel
{
public ChromecastStatus ReceiverStatus { get => receiverStatus; }
private ChromecastStatus receiverStatus;

public ReceiverChannel(ILogger<ReceiverChannel> logger = null) : base("receiver", logger)
{
}

public event EventHandler<LaunchStatusMessage> LaunchStatusChanged;
public event EventHandler<ChromecastStatus> ReceiverStatusChanged;

public async Task<ChromecastStatus> GetChromecastStatusAsync()
{
Expand Down Expand Up @@ -59,7 +62,7 @@ public async Task<ChromecastStatus> SetVolume(double level)

public async Task<ChromecastStatus> StopApplication()
{
var stopMessage = new StopMessage() { SessionId = Status.Application.SessionId };
var stopMessage = new StopMessage() { SessionId = ReceiverStatus.Application.SessionId };
var response = await SendAsync(stopMessage.RequestId, JsonSerializer.Serialize(stopMessage, SharpcasteSerializationContext.Default.StopMessage));
var status = JsonSerializer.Deserialize(response, SharpcasteSerializationContext.Default.ReceiverStatusMessage);
return status.Status;
Expand All @@ -75,8 +78,8 @@ public override Task OnMessageReceivedAsync(string messagePayload, string type)
break;
case "RECEIVER_STATUS":
var receiverStatusMessage = JsonSerializer.Deserialize(messagePayload, SharpcasteSerializationContext.Default.ReceiverStatusMessage);
Status = receiverStatusMessage.Status;
OnStatusChanged(receiverStatusMessage.Status);
receiverStatus = receiverStatusMessage.Status;
ReceiverStatusChanged?.Invoke(this, ReceiverStatus);
break;

}
Expand Down
Loading

0 comments on commit 8050fe4

Please sign in to comment.