utcpush.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. unit utcpush;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, system.pushnotifications;
  6. type
  7. { TMyPushService }
  8. TMyPushService = class(TPushService)
  9. Private
  10. FMyDeviceID : TPropArray;
  11. FMyDeviceToken : TPropArray;
  12. FMyStartError: String;
  13. FMyStatus: TStatus;
  14. protected
  15. function GetDeviceID: TPropArray; override;
  16. function GetDeviceToken: TPropArray; override;
  17. function GetStartupError: string; override;
  18. function GetStartupNotifications: TPushServiceNotificationArray; override;
  19. function GetStatus: TStatus; override;
  20. procedure StartService; override;
  21. procedure StopService; override;
  22. Public
  23. constructor Create(const aOwner: TPushServiceManager; const aServiceName: string); override;
  24. procedure Change(AChanges: TChanges);
  25. procedure ReceiveNotification(const aNotification: TPushServiceNotification);
  26. Property MyStatus : TStatus Read FMyStatus Write FMyStatus;
  27. Property MyDeviceID : TPropArray Read FMyDeviceID Write FMyDeviceID;
  28. Property MyDeviceToken : TPropArray Read FMyDeviceToken Write FMyDeviceToken;
  29. Property MyStartError : String Read FMyStartError write FMyStartError;
  30. end;
  31. { TTestPushNotifications }
  32. TTestPushNotifications= class(TTestCase)
  33. private
  34. FConn: TPushServiceConnection;
  35. FConn2: TPushServiceConnection;
  36. FManager: TPushServiceManager;
  37. FMyService: TMyPushService;
  38. FChanges: TPushService.TChanges;
  39. FChangeCount : Integer;
  40. FNotif: TPushServiceNotification;
  41. FReceiveCount : Integer;
  42. FReceived : TPushServiceNotification;
  43. procedure DoChange(Sender: TObject; AChange: TPushService.TChanges);
  44. procedure DoReceive(Sender: TObject; const aNotification: TPushServiceNotification);
  45. function GetService: TPushService;
  46. protected
  47. procedure SetUp; override;
  48. procedure TearDown; override;
  49. Property Manager : TPushServiceManager Read FManager;
  50. Property Service : TPushService Read GetService;
  51. Property MyService : TMyPushService Read FMyService Write FMyService;
  52. Property Conn : TPushServiceConnection Read FConn Write FConn;
  53. Property Conn2 : TPushServiceConnection Read FConn2 Write FConn2;
  54. Property Notif : TPushServiceNotification Read FNotif Write FNotif;
  55. published
  56. procedure TestHookUp;
  57. Procedure TestCreateService;
  58. Procedure TestAddService;
  59. Procedure TestRemoveService;
  60. Procedure TestIndexOfService;
  61. Procedure TestIndexOfServiceName;
  62. Procedure TestGetServiceByName;
  63. Procedure TestCreateServiceConnection;
  64. Procedure TestDestroyServiceConnection;
  65. Procedure TestIndexOfConnection;
  66. Procedure TestIndexOfConnection2;
  67. Procedure TestConnectionActive;
  68. Procedure TestServiceAppProp;
  69. Procedure TestDeviceID;
  70. Procedure TestDeviceToken;
  71. Procedure TestStartupError;
  72. Procedure TestOnChange;
  73. Procedure TestOnChange2;
  74. Procedure TestOnReceive;
  75. Procedure TestOnReceive2;
  76. end;
  77. implementation
  78. { TMyPushService }
  79. function TMyPushService.GetDeviceID: TPropArray;
  80. begin
  81. Result:=FMyDeviceID;
  82. end;
  83. function TMyPushService.GetDeviceToken: TPropArray;
  84. begin
  85. Result:=FMyDeviceToken;
  86. end;
  87. function TMyPushService.GetStartupError: string;
  88. begin
  89. Result:=FMyStartError;
  90. end;
  91. function TMyPushService.GetStartupNotifications: TPushServiceNotificationArray;
  92. begin
  93. Result:=[];
  94. end;
  95. function TMyPushService.GetStatus: TStatus;
  96. begin
  97. Result:=FMyStatus;
  98. end;
  99. procedure TMyPushService.StartService;
  100. begin
  101. FMyStatus:=TStatus.Started;
  102. end;
  103. procedure TMyPushService.StopService;
  104. begin
  105. FMyStatus:=TStatus.Stopped;
  106. end;
  107. constructor TMyPushService.Create(const aOwner: TPushServiceManager; const aServiceName: string);
  108. begin
  109. inherited Create(aOwner, aServiceName);
  110. FMyDeviceID:=[];
  111. FMyDeviceToken:=[];
  112. FMyStartError:='';
  113. FMyStatus:=TStatus.Stopped;
  114. end;
  115. procedure TMyPushService.Change(AChanges: TChanges);
  116. begin
  117. DoChange(aChanges);
  118. end;
  119. procedure TMyPushService.ReceiveNotification(const aNotification: TPushServiceNotification);
  120. begin
  121. DoReceiveNotification(aNotification);
  122. end;
  123. procedure TTestPushNotifications.TestHookUp;
  124. begin
  125. AssertNotNull('Have Global Instance',TPushServiceManager.Instance);
  126. AssertNotNull('Have local Instance',Manager);
  127. AssertEquals('No services',0, Manager.Count);
  128. AssertEquals('No change count',0, FChangeCount);
  129. AssertTrue('FChanges empty',[]=FChanges);
  130. end;
  131. procedure TTestPushNotifications.TestCreateService;
  132. begin
  133. MyService:=TMyPushService.Create(Manager,'my');
  134. AssertEquals('ServiceName','my',MyService.ServiceName);
  135. AssertSame('Manager',Manager,MyService.Manager);
  136. AssertEquals('Registered in Manager 1',1,Manager.Count);
  137. AssertSame('Registered in Manager 2',Service,Manager.Services[0]);
  138. end;
  139. procedure TTestPushNotifications.TestAddService;
  140. begin
  141. MyService:=TMyPushService.Create(Nil,'my');
  142. AssertNull('Manager',MyService.Manager);
  143. Manager.AddService(MyService,False);
  144. AssertSame('Manager',Manager,MyService.Manager);
  145. AssertEquals('Registered in Manager 1',1,Manager.Count);
  146. AssertSame('Registered in Manager 2',Service,Manager.Services[0]);
  147. end;
  148. procedure TTestPushNotifications.TestRemoveService;
  149. begin
  150. TestAddService;
  151. Manager.RemoveService(MyService);
  152. AssertEquals('No longer Registered in Manager ',0,Manager.Count);
  153. end;
  154. procedure TTestPushNotifications.TestIndexOfService;
  155. begin
  156. MyService:=TMyPushService.Create(Manager,'my');
  157. TMyPushService.Create(Manager,'my2');
  158. AssertEquals('IndexOf',0,Manager.IndexOfService(MyService));
  159. end;
  160. procedure TTestPushNotifications.TestIndexOfServiceName;
  161. begin
  162. MyService:=TMyPushService.Create(Manager,'my');
  163. TMyPushService.Create(Manager,'my2');
  164. AssertEquals('IndexOf',0,Manager.IndexOfServiceByName('my'));
  165. end;
  166. procedure TTestPushNotifications.TestGetServiceByName;
  167. begin
  168. TestAddService;
  169. AssertSame('Result', MyService, Manager.GetServiceByName('my'));
  170. end;
  171. procedure TTestPushNotifications.TestCreateServiceConnection;
  172. begin
  173. MyService:=TMyPushService.Create(Manager,'my');
  174. Conn:=MyService.CreateConnection;
  175. AssertFalse('Not active',Conn.Active);
  176. AssertEquals('Conn count',1,MyService.ConnectionCount);
  177. AssertSame('Conn[0]',Conn,MyService.Connections[0]);
  178. end;
  179. procedure TTestPushNotifications.TestDestroyServiceConnection;
  180. begin
  181. TestCreateServiceConnection;
  182. FreeAndNil(FConn);
  183. AssertEquals('Conn count',0,MyService.ConnectionCount);
  184. end;
  185. procedure TTestPushNotifications.TestIndexOfConnection;
  186. begin
  187. TestCreateServiceConnection;
  188. Conn2:=MyService.CreateConnection;
  189. AssertEquals('IndexOf',0,Service.IndexOfConnection(Conn));
  190. end;
  191. procedure TTestPushNotifications.TestIndexOfConnection2;
  192. begin
  193. TestCreateServiceConnection;
  194. Conn2:=TPushServiceConnection.Create(Nil);
  195. AssertEquals('IndexOf',-1,Service.IndexOfConnection(Conn2));
  196. end;
  197. procedure TTestPushNotifications.TestConnectionActive;
  198. begin
  199. TestCreateServiceConnection;
  200. Conn.Active:=True;
  201. AssertTrue('Service running',TPushService.TStatus.Started=MyService.Status);
  202. end;
  203. procedure TTestPushNotifications.TestServiceAppProp;
  204. begin
  205. MyService:=TMyPushService.Create(Nil,'my');
  206. MyService.AppProps['a']:='b';
  207. MyService.AppProps['b']:='c';
  208. AssertEquals('Approps','b',MyService.AppProps['a']);
  209. end;
  210. procedure TTestPushNotifications.TestDeviceID;
  211. begin
  212. MyService:=TMyPushService.Create(Nil,'my');
  213. MyService.MyDeviceID:=[TPushService.TPropPair.Create('a','b'),TPushService.TPropPair.Create('b','c')];
  214. AssertEquals('Device ID','c',MyService.DeviceIDValue['b']);
  215. end;
  216. procedure TTestPushNotifications.TestDeviceToken;
  217. begin
  218. MyService:=TMyPushService.Create(Nil,'my');
  219. MyService.MyDeviceToken:=[TPushService.TPropPair.Create('a','b'),TPushService.TPropPair.Create('b','c')];
  220. AssertEquals('Device token','c',MyService.DeviceTokenValue['b']);
  221. end;
  222. procedure TTestPushNotifications.TestStartupError;
  223. begin
  224. MyService:=TMyPushService.Create(Nil,'my');
  225. MyService.MyStartError:='xyz';
  226. AssertEquals('Service ','xyz',Service.StartupError);
  227. end;
  228. procedure TTestPushNotifications.TestOnChange;
  229. begin
  230. TestCreateServiceConnection;
  231. Conn.OnChange:=@DoChange;
  232. Conn.Active:=True;
  233. Conn2:=MyService.CreateConnection;
  234. Conn2.OnChange:=@DoChange;
  235. Conn2.Active:=True;
  236. MyService.Change([TPushService.TChange.DeviceToken, TPushService.TChange.StartupNotifications]);
  237. AssertEquals('Count',2,FChangeCount);
  238. AssertTrue('Correct changes',[TPushService.TChange.DeviceToken, TPushService.TChange.StartupNotifications]=FChanges);
  239. end;
  240. procedure TTestPushNotifications.TestOnChange2;
  241. begin
  242. // only active connections need to get the event
  243. TestCreateServiceConnection;
  244. Conn.OnChange:=@DoChange;
  245. Conn2:=MyService.CreateConnection;
  246. Conn2.OnChange:=@DoChange;
  247. MyService.Change([TPushService.TChange.DeviceToken, TPushService.TChange.StartupNotifications]);
  248. AssertEquals('Count',0,FChangeCount);
  249. AssertTrue('Correct changes',[]=FChanges);
  250. end;
  251. procedure TTestPushNotifications.TestOnReceive;
  252. begin
  253. // only active connections need to get the event
  254. TestCreateServiceConnection;
  255. Conn.OnReceiveNotification:=@DoReceive;
  256. Conn.Active:=True;
  257. Conn2:=MyService.CreateConnection;
  258. Conn2.OnReceiveNotification:=@DoReceive;
  259. Conn2.Active:=True;
  260. Notif:=TPushServiceNotification.Create;
  261. MyService.ReceiveNotification(Notif);
  262. AssertEquals('Count',2,FReceiveCount);
  263. AssertSame('Correct changes',Notif,FReceived);
  264. end;
  265. procedure TTestPushNotifications.TestOnReceive2;
  266. begin
  267. TestCreateServiceConnection;
  268. Conn.OnReceiveNotification:=@DoReceive;
  269. Conn2:=MyService.CreateConnection;
  270. Conn2.OnReceiveNotification:=@DoReceive;
  271. Notif:=TPushServiceNotification.Create;
  272. MyService.ReceiveNotification(Notif);
  273. AssertEquals('Count',0,FReceiveCount);
  274. end;
  275. function TTestPushNotifications.GetService: TPushService;
  276. begin
  277. Result:=FMyService;
  278. end;
  279. procedure TTestPushNotifications.DoChange(Sender: TObject; AChange: TPushService.TChanges);
  280. begin
  281. FChanges:=aChange;
  282. Inc(FChangeCount);
  283. end;
  284. procedure TTestPushNotifications.DoReceive(Sender: TObject; const aNotification: TPushServiceNotification);
  285. begin
  286. FReceived:=aNotification;
  287. inc(FReceiveCount);
  288. end;
  289. procedure TTestPushNotifications.SetUp;
  290. begin
  291. FManager:=TPushServiceManager.Create;
  292. FChanges:=[];
  293. FChangeCount:=0;
  294. FReceiveCount:=0;
  295. FReceived:=Nil;
  296. end;
  297. procedure TTestPushNotifications.TearDown;
  298. begin
  299. FreeAndNil(FNotif);
  300. FreeAndNil(FConn);
  301. FreeAndNil(FConn2);
  302. FreeAndNil(FMyService);
  303. FreeAndNil(FManager);
  304. end;
  305. initialization
  306. RegisterTest(TTestPushNotifications);
  307. end.