public void TimeoutUserSendsCorrectPackets() { var sim = SimAuth.Value; var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var chat = sut as IChatService; var id = ws.LastId.GetValueOrDefault() + 1; var replyJson = BuildTimeoutReply(id); var task = chat.TimeoutUserAsync("SomeTestUser", TimeSpan.FromMinutes(5)); ws.InjectPacket(replyJson); task.Wait(Simulator.TIMEOUT); // Wait for TimeoutUserAsync to complete // Validate packet sent ws.LastPacket["type"].Should().NotBeNull(); ws.LastPacket["type"].Value <string>().Should().Be("method"); ws.LastPacket["method"].Should().NotBeNull(); ws.LastPacket["method"].Value <string>().Should().Be("timeout"); ws.LastPacket["arguments"].Should().NotBeNull(); var args = ws.LastPacket["arguments"].Values <string>().ToArray(); args.Should().HaveCount(2); args[0].Should().Be("SomeTestUser"); args[1].Should().Be("5m0s"); task.Result.Should().BeTrue(); } }
public void WillReconnectToNextServer() { var sim = SimAnon.Value; var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var url1 = ws.ConnectUrl; // Prepare new ClientWebSocket for consumption by client code, and dispose the old one sim.ChatWebSocket = new SimulatedClientWebSocket(true, false, Simulator.CHAT_WELCOME); ws.Dispose(); ws = sim.ChatWebSocket; bool reconnectSucceeded = ws.JoinedChat.Wait(Simulator.TIMEOUT); var url2 = ws.ConnectUrl; reconnectSucceeded.Should().BeTrue(); url1.Should().NotBeNull(); url2.Should().NotBeNull(); url1.Should().NotBe(url2); } }
private static void ConfigureMixer(IServiceCollection services, IConfiguration Configuration, ServiceProvider sp) { if (!string.IsNullOrEmpty(Configuration["StreamServices:Mixer:ClientId"])) { var mxr = new MixerService(Configuration, sp.GetService <ILoggerFactory>()); services.AddSingleton <IHostedService>(mxr); services.AddSingleton <IStreamService>(mxr); } }
public void AddCorrectHeaders() { var sim = SimAuth.Value; var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); ws.Headers.Should().Contain("x-is-bot", "true"); } }
public void ImplementsCorrectInterfaces() { var sim = SimAnon.Value; var packet = BuildChatMessage(sim, 56789, "connor", "Hello world!"); var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var result = Assert.Raises <ChatMessageEventArgs>(x => sut.ChatMessage += x, x => sut.ChatMessage -= x, () => ws.InjectPacket(packet)); Assert.IsAssignableFrom <IChatService>(result.Sender); Assert.IsAssignableFrom <IStreamService>(result.Sender); } }
static void Main(string[] args) { IMixerService mixerService = new MixerService(); var urls = new string[] { "https://s3-images-mygaleon-ru.storage.cloud.croc.ru/dbf8d2ad-22d7-4d11-9692-9f7116e677e8.jpg", "https://s3-images-mygaleon-ru.storage.cloud.croc.ru/61dd3d38-2517-48ea-b03a-550e14348997.jpg", "https://s3-images-mygaleon-ru.storage.cloud.croc.ru/c32f6537-4077-4d15-8dfa-9b351f09fa50.jpg", "https://s3-images-mygaleon-ru.storage.cloud.croc.ru/b9112020-0ac4-458e-9955-63e7b5b17684.jpg" }; var bmps = mixerService.GetBitmapsFromUrls(urls); var outBmp = mixerService.CombineBitmaps(bmps); outBmp.Save("output.bmp", ImageFormat.Bmp); }
public void ImplementCorrectInterfaces() { var packet = BuildLiveEvent("channel:1234:update", followers: 66); var sim = SimAnon.Value; var ws = sim.ConstellationWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var result = Assert.Raises <ServiceUpdatedEventArgs>(x => sut.Updated += x, x => sut.Updated -= x, () => ws.InjectPacket(packet)); Assert.IsAssignableFrom <IChatService>(result.Sender); Assert.IsAssignableFrom <IStreamService>(result.Sender); } }
public void DetectsUserRoles() { var sim = SimAnon.Value; var packet = BuildChatMessage(sim, 56789, "connor", "Hello world!", roles: new string[] { "Owner", "Mod" }); var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); using (var monitor = sut.Monitor()) { ws.InjectPacket(packet); monitor.Should().Raise(nameof(sut.ChatMessage)) .WithArgs <ChatMessageEventArgs>(a => a.Message == "Hello world!" && a.UserName == "connor" && a.UserId == 56789 && a.IsModerator && a.IsOwner && !a.IsWhisper) .WithSender(sut); } } }
public void HandlesNullAvatar() { var sim = SimAnon.Value; var packet = BuildChatMessage(sim, 56789, "connor", "Hello world!", roles: new string[] { "Owner", "Mod" }, avatar: null); var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); using (var monitor = sut.Monitor()) { ws.InjectPacket(packet); monitor.Should().Raise(nameof(sut.ChatMessage)) .WithArgs <ChatMessageEventArgs>(a => a.Properties.ContainsKey("AvatarUrl") && a.UserName == "connor") .WithSender(sut); } } }
public void DontRaiseEventWhenViewersIsSameAsBefore() { var packet = BuildLiveEvent("channel:1234:update", viewers: 35); var sim = SimAnon.Value; var ws = sim.ConstellationWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); ws.InjectPacket(packet); // 1st using (var monitor = sut.Monitor()) { ws.InjectPacket(packet); // 2nd monitor.Should().NotRaise(nameof(sut.Updated)); } } }
public void WillReconnect() { var sim = SimAnon.Value; var ws = sim.ConstellationWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); // Prepare new ClientWebSocket for consumption by client code, and dispose the old one sim.ConstellationWebSocket = new SimulatedClientWebSocket(false, false, Simulator.CONSTALLATION_WELCOME); ws.Dispose(); ws = sim.ConstellationWebSocket; var connectedAndJoined = ws.JoinedConstallation.Wait(Simulator.TIMEOUT); connectedAndJoined.Should().BeTrue(); } }
public void RaisesUserLeftEvent() { var sim = SimAnon.Value; var packet = BuildUserJoinOrLeave(sim, "SomeNewUser", 34103083, isJoin: false); var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); using (var monitor = sut.Monitor()) { ws.InjectPacket(packet); monitor.Should().Raise(nameof(sut.UserLeft)) .WithArgs <ChatUserInfoEventArgs>(a => a.UserId == 34103083 && a.UserName == "SomeNewUser" && a.ServiceName == "Mixer" && a.ChannelId == sim.ChannelInfo.Id) .WithSender(sut); } } }
public void CanCombineEvent() { var packet = BuildLiveEvent("channel:1234:update", followers: 22, viewers: 43, online: true); var sim = SimAnon.Value; var ws = sim.ConstellationWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); using (var monitor = sut.Monitor()) { ws.InjectPacket(packet); monitor.Should().Raise(nameof(sut.Updated)) .WithArgs <ServiceUpdatedEventArgs>(a => a.NewFollowers == 22 && a.NewViewers == 43 && a.IsOnline == true && a.ServiceName == "Mixer" && a.ChannelId == sim.ChannelInfo.Id) .WithSender(sut); } } }
public void WillConnectAndJoinAnonymously() { var sim = SimAnon.Value; var ws = sim.ChatWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var connectedAndJoined = ws.JoinedChat.Wait(Simulator.TIMEOUT); connectedAndJoined.Should().BeTrue(); ws.LastPacket["method"].Should().NotBeNull(); ws.LastPacket["method"].Value <string>().Should().Be("auth"); ws.LastPacket["arguments"].Should().NotBeNull(); var args = ws.LastPacket["arguments"].ToString(Formatting.None); args.Should().Be($"[{sim.ChannelInfo.Id}]"); } }
public void CanHandleRealDataDump() { var sim = SimAuth.Value; var ws = sim.ConstellationWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); foreach (var line in File.ReadAllLines("Services/Mixer/Data/ConstellationDump.json")) { if (string.IsNullOrWhiteSpace(line)) { continue; } ws.InjectPacket(line); } sut.StopAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); } }
public void WillConnectAndJoin() { var sim = SimAnon.Value; var ws = sim.ConstellationWebSocket; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var connectedAndJoined = ws.JoinedConstallation.Wait(Simulator.TIMEOUT); connectedAndJoined.Should().BeTrue(); // {{"id": 1,"type": "method","method": "livesubscribe","params": {"events": ["channel:1234:update" ]}}} ws.LastPacket["method"].Should().NotBeNull(); ws.LastPacket["method"].Value <string>().Should().Be("livesubscribe"); var args = $"[{sim.ChannelInfo.Id},{sim.ChannelInfo.UserId},\"{sim.ChatAuthKey}\"]"; ws.LastPacket["params"].Should().NotBeNull(); ws.LastPacket["params"]["events"].Should().NotBeNull(); var events = ws.LastPacket["params"]["events"].ToString(Formatting.None); events.Should().ContainAll($"channel:{sim.ChannelInfo.Id}:update"); } }
public void CantSendAnononymously() { var sim = SimAnon.Value; var ws = sim.ChatWebSocket; const string text = "Some test message"; using (var sut = new MixerService(sim.Config, LoggerFactory, sim)) { sut.StartAsync(sim.Cancel.Token).Wait(Simulator.TIMEOUT); var chat = sut as IChatService; var id = ws.LastId.GetValueOrDefault() + 1; var replyJson = BuildMsgReply(sim, id, text); var task = chat.SendMessageAsync(text); ws.InjectPacket(replyJson); task.Wait(Simulator.TIMEOUT); // Wait for SendMessageAsync to complete task.Result.Should().BeFalse(); } }