You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

212 rivejä
9.2 KiB

  1. using DotNetty.Buffers;
  2. using DotNetty.Codecs.Http;
  3. using DotNetty.Common.Utilities;
  4. using DotNetty.Transport.Channels.Embedded;
  5. using JT808.DotNetty.Abstractions;
  6. using JT808.DotNetty.Abstractions.Dtos;
  7. using JT808.DotNetty.Abstractions.Enums;
  8. using JT808.DotNetty.Core;
  9. using JT808.DotNetty.Core.Handlers;
  10. using JT808.DotNetty.Core.Interfaces;
  11. using JT808.DotNetty.Core.Services;
  12. using JT808.DotNetty.Core.Session;
  13. using JT808.DotNetty.WebApi.Authorization;
  14. using JT808.DotNetty.WebApi.Handlers;
  15. using JT808.Protocol;
  16. using Microsoft.Extensions.DependencyInjection;
  17. using Microsoft.Extensions.Logging;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Net;
  21. using System.Text;
  22. using System.Text.Json;
  23. using Xunit;
  24. using HttpVersion = DotNetty.Codecs.Http.HttpVersion;
  25. namespace JT808.DotNetty.WebApi.Test.Handlers
  26. {
  27. public class JT808WebAPIServerHandlerTest
  28. {
  29. [Fact]
  30. public void SessionTcpGetAllTest()
  31. {
  32. var ch = WebExt.CreateEmbeddedChannel(serviceProvider => {
  33. var sessionMgr = serviceProvider.GetRequiredService<JT808SessionManager>();
  34. sessionMgr.TryAdd("12345678",new EmbeddedChannel());
  35. });
  36. ch.WriteInbound(WebExt.CreateGetRequest(JT808NettyConstants.JT808WebApiRouteTable.SessionTcpGetAll));
  37. var result = ch.As<List<JT808TcpSessionInfoDto>>();
  38. Assert.Single(result.Data);
  39. Assert.Equal("12345678", result.Data[0].TerminalPhoneNo);
  40. Assert.Equal(JT808ResultCode.Ok, result.Code);
  41. }
  42. [Fact]
  43. public void GetUdpSessionAllTest()
  44. {
  45. var ch = WebExt.CreateEmbeddedChannel(serviceProvider => {
  46. var sessionMgr=serviceProvider.GetRequiredService<JT808SessionManager>();
  47. sessionMgr.TryAdd(new EmbeddedChannel(),new IPEndPoint(IPAddress.Parse("127.0.0.1"), 888),"123456789");
  48. });
  49. ch.WriteInbound(WebExt.CreateGetRequest(JT808NettyConstants.JT808WebApiRouteTable.SessionUdpGetAll));
  50. var result = ch.As<List<JT808UdpSessionInfoDto>>();
  51. Assert.Single(result.Data);
  52. Assert.Equal("123456789",result.Data[0].TerminalPhoneNo);
  53. Assert.Equal(JT808ResultCode.Ok, result.Code);
  54. }
  55. [Fact]
  56. public void RemoveSessionByTerminalPhoneNoTest()
  57. {
  58. var ch = WebExt.CreateEmbeddedChannel();
  59. ch.WriteInbound(WebExt.CreatePostRequest(JT808NettyConstants.JT808WebApiRouteTable.SessionRemoveByTerminalPhoneNo,Encoding.UTF8.GetBytes("12345678")));
  60. var result = ch.As<bool>();
  61. Assert.False(result.Data);
  62. Assert.Equal(JT808ResultCode.Empty, result.Code);
  63. Assert.Equal("Session Empty", result.Message);
  64. }
  65. [Fact]
  66. public void UnificationSendTest()
  67. {
  68. var ch = WebExt.CreateEmbeddedChannel();
  69. JT808UnificationSendRequestDto jT808UnificationSendRequestDto = new JT808UnificationSendRequestDto
  70. {
  71. TerminalPhoneNo = "123456789",
  72. Data = new byte[] { 1, 2, 3, 4 }
  73. };
  74. byte[] content = JsonSerializer.SerializeToUtf8Bytes(jT808UnificationSendRequestDto);
  75. ch.WriteInbound(WebExt.CreatePostRequest(JT808NettyConstants.JT808WebApiRouteTable.UnificationSend, content));
  76. var result = ch.As<bool>();
  77. Assert.False(result.Data);
  78. Assert.Equal(JT808ResultCode.Ok, result.Code);
  79. Assert.Equal("offline", result.Message);
  80. }
  81. [Fact]
  82. public void GetTcpAtomicCounterTest()
  83. {
  84. var ch = WebExt.CreateEmbeddedChannel(serviceProvider=>
  85. {
  86. var counterFactory = serviceProvider.GetRequiredService<JT808AtomicCounterServiceFactory>();
  87. var counter = counterFactory.Create(JT808TransportProtocolType.tcp);
  88. counter.MsgSuccessIncrement();
  89. counter.MsgSuccessIncrement();
  90. counter.MsgFailIncrement();
  91. });
  92. ch.WriteInbound(WebExt.CreateGetRequest(JT808NettyConstants.JT808WebApiRouteTable.GetTcpAtomicCounter));
  93. var result = ch.As<JT808AtomicCounterDto>();
  94. Assert.Equal(2,result.Data.MsgSuccessCount);
  95. Assert.Equal(1,result.Data.MsgFailCount);
  96. Assert.Equal(JT808ResultCode.Ok, result.Code);
  97. }
  98. [Fact]
  99. public void GetUdpAtomicCounterTest()
  100. {
  101. var ch = WebExt.CreateEmbeddedChannel(serviceProvider =>
  102. {
  103. var counterFactory = serviceProvider.GetRequiredService<JT808AtomicCounterServiceFactory>();
  104. var counter = counterFactory.Create(JT808TransportProtocolType.udp);
  105. counter.MsgSuccessIncrement();
  106. counter.MsgSuccessIncrement();
  107. counter.MsgSuccessIncrement();
  108. counter.MsgFailIncrement();
  109. });
  110. ch.WriteInbound(WebExt.CreateGetRequest(JT808NettyConstants.JT808WebApiRouteTable.GetUdpAtomicCounter));
  111. var result = ch.As<JT808AtomicCounterDto>();
  112. Assert.Equal(3, result.Data.MsgSuccessCount);
  113. Assert.Equal(1, result.Data.MsgFailCount);
  114. Assert.Equal(JT808ResultCode.Ok, result.Code);
  115. }
  116. [Fact]
  117. public void UriTest1()
  118. {
  119. string uri = JT808NettyConstants.JT808WebApiRouteTable.SessionTcpGetAll +"? token=123456";
  120. var uriSpan = uri.AsSpan();
  121. var index = uriSpan.IndexOf('?');
  122. var result = uriSpan.Slice(0, index).ToString();
  123. Assert.Equal(JT808NettyConstants.JT808WebApiRouteTable.SessionTcpGetAll, result);
  124. }
  125. [Fact]
  126. public void UriTest2()
  127. {
  128. var index = JT808NettyConstants.JT808WebApiRouteTable.SessionTcpGetAll.IndexOf('?');
  129. Assert.Equal(-1, index);
  130. }
  131. }
  132. public static class WebExt
  133. {
  134. public static EmbeddedChannel CreateEmbeddedChannel()
  135. {
  136. IServiceCollection serviceDescriptors = new ServiceCollection();
  137. serviceDescriptors.AddSingleton<ILoggerFactory, LoggerFactory>();
  138. serviceDescriptors.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
  139. serviceDescriptors.AddJT808Configure()
  140. .AddJT808NettyCore(options => { })
  141. .Builder();
  142. serviceDescriptors.AddJT808WebApiNettyHostTest();
  143. var handler = serviceDescriptors.BuildServiceProvider().GetRequiredService<JT808WebAPIServerHandler>();
  144. var ch = new EmbeddedChannel(
  145. new HttpRequestDecoder(4096, 8192, 8192, false),
  146. new HttpObjectAggregator(int.MaxValue),
  147. handler);
  148. return ch;
  149. }
  150. public static EmbeddedChannel CreateEmbeddedChannel(Action<IServiceProvider> action)
  151. {
  152. IServiceCollection serviceDescriptors = new ServiceCollection();
  153. serviceDescriptors.AddSingleton<ILoggerFactory, LoggerFactory>();
  154. serviceDescriptors.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
  155. serviceDescriptors.AddJT808Configure()
  156. .AddJT808NettyCore(options => { })
  157. .Builder();
  158. serviceDescriptors.AddSingleton<JT808MsgIdHttpHandlerBase, JT808MsgIdDefaultWebApiHandler>();
  159. serviceDescriptors.AddSingleton<IJT808WebApiAuthorization, JT808AuthorizationDefault>();
  160. serviceDescriptors.AddScoped<JT808WebAPIServerHandler>();
  161. var serviceProvider = serviceDescriptors.BuildServiceProvider();
  162. var handler = serviceProvider.GetRequiredService<JT808WebAPIServerHandler>();
  163. var ch = new EmbeddedChannel(
  164. new HttpRequestDecoder(4096, 8192, 8192, false),
  165. new HttpObjectAggregator(int.MaxValue),
  166. handler);
  167. action(serviceProvider);
  168. return ch;
  169. }
  170. public static JT808ResultDto<T> As<T>(this EmbeddedChannel embeddedChannel)
  171. {
  172. if(embeddedChannel == null) return default;
  173. DefaultFullHttpResponse response = embeddedChannel.ReadOutbound<DefaultFullHttpResponse>();
  174. if (response.Headers.TryGetInt(HttpHeaderNames.ContentLength, out int length))
  175. {
  176. byte[] tmp = new byte[length];
  177. response.Content.ReadBytes(tmp);
  178. response.Release();
  179. return JsonSerializer.Deserialize<JT808ResultDto<T>>(tmp);
  180. }
  181. response.Release();
  182. return default;
  183. }
  184. public static DefaultFullHttpRequest CreateGetRequest(string uri)
  185. {
  186. var request = new DefaultFullHttpRequest(HttpVersion.Http11, HttpMethod.Get, uri);
  187. request.Headers.Add((AsciiString)"token", "123456");
  188. return request;
  189. }
  190. public static DefaultFullHttpRequest CreatePostRequest(string uri,byte[]content)
  191. {
  192. var request = new DefaultFullHttpRequest(HttpVersion.Http11, HttpMethod.Post, uri);
  193. request.Headers.Add((AsciiString)"token", "123456");
  194. request.Content.WriteBytes(content);
  195. return request;
  196. }
  197. }
  198. }