From cb4aa0fd3c55246051c8ecf17d17a6bc6589dcd8 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 29 Mar 2021 15:18:01 +0900 Subject: [PATCH] [Applications.ComponentBased][TCSACR-406][Update testcase] Adds: - WaitForPort_CHECK() - Send_CHECK_WITH_IOEXCEPTION() - SendAndReceive_CHECK_WITH_IOEXCEPTION() - SendAndReceiveAsync_CHECK_WITHOUT_EXCEPTION() - SendAndReceiveAsync_CHECK_WITH_ARUMENTEXCEPTION() - SendAndReceiveAsync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION() - SendAndReceiveAsync_CHECK_WITH_IOEXCEPTION() - RequestReceived_CHECK() - ComponentTask_INIT() - Start_CHECK_RUNNING() - Stop_CHECK_RUNNING() - IsRunning_CHECK() - Port_GET() - Sender_GET() - Request_GET() - IsReplyRequested_CHECK() - Reply_SET_AND_GET() Removes: - OnRequestEvent_CHECK() - OnSyncRequestEvent_CHECK() Changes: - ComponentPort_INIT() - ComponentPort_INIT_WITH_NULL_AND_CHECK_ARGUMENTEXCEPTION() - ComponentPort_INIT_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION() - ComponentPort_INIT_AND_CHECK_IOEXCEPTION() - SendSync_CHECK_WITHOUT_EXCEPTION() => SendAndReceive_CHECK_WITHOUT_EXCEPTION - SendSync_CHECK_WITHOUT_EXCEPTION() => SendAndReceive_CHECK_WITH_ARGUMENTEXCEPTION() - SendSync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION() => SendAndReceive_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION() Change-Id: I7571bc0dac759f25d0d1d5fca3e19c035cc12a2e Signed-off-by: Hwankyu Jhun --- .../ComponentPortTest/ComponentPortTest.csproj | 2 +- .../ComponentPortTest/ComponentPortTest/Port.cs | 74 ------ .../ComponentPortTest/ComponentPortTest/Service.cs | 210 +++++++++++++--- .../org.tizen.example.ComponentPortTest-1.0.0.tpk | Bin 32510 -> 23559 bytes ...tions.ComponentBased.ComponentPort.Tests.csproj | 2 +- .../testcase/TSComponentPort.cs | 274 +++++++++++++++------ .../testcase/TSComponentTask.cs | 155 ++++++++++++ .../testcase/TSRequestEventArgs.cs | 235 ++++++++++++++++++ 8 files changed, 762 insertions(+), 190 deletions(-) delete mode 100755 tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Port.cs create mode 100755 tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentTask.cs create mode 100755 tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSRequestEventArgs.cs diff --git a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/ComponentPortTest.csproj b/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/ComponentPortTest.csproj index 0da868b..306e554 100755 --- a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/ComponentPortTest.csproj +++ b/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/ComponentPortTest.csproj @@ -19,7 +19,7 @@ - + Runtime diff --git a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Port.cs b/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Port.cs deleted file mode 100755 index dbe9e2f..0000000 --- a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Port.cs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using Tizen.Applications.ComponentBased; - -namespace ServicePort -{ - public sealed class Port : ComponentPort - { - public Port(string name) : base(name) - { - Log.Info("Port(): " + PortName); - } - - protected override void OnRequestEvent(string sender, object request) - { - Log.Info("OnRequestEvent() sender: " + sender); - if (request.GetType() == typeof(Request)) - { - var req = (Request)request; - Log.Info("Command: " + req.Command + " Sequence: " + req.Sequence + " Message: " + req.Message); - - if (req.Command == "OnRequestEvent_CHECK") - { - Service.SendMessage(0); - } - } - else if (request.GetType() == typeof(Response)) - { - var res = (Response)request; - Log.Info("Command: " + res.Command + " Sequence: " + res.Sequence + " Result: " + res.Result); - } - } - - protected override object OnSyncRequestEvent(string sender, object request) - { - Log.Info("OnSyncRequestEvent() sender: " + sender); - Response res; - if (request.GetType() == typeof(Request)) - { - var req = (Request)request; - Log.Info("Command: " + req.Command + " Sequence: " + req.Sequence + " Message: " + req.Message); - - if (req.Command == "OnSyncRequestEvent_CHECK") - { - Service.SendMessage(0); - } - - res = new Response(req.Command, req.Sequence, 0); - } - else - { - Log.Error("Invalid request"); - res = new Response("Unknown", -1, -1); - } - - return res; - } - } - -} diff --git a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Service.cs b/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Service.cs index fe7a201..177cd1f 100755 --- a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Service.cs +++ b/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/code/ComponentPortTest/ComponentPortTest/Service.cs @@ -15,8 +15,8 @@ */ using System; -using System.Threading; using Tizen.Applications; +using Tizen.Applications.ComponentBased; using Tizen.Applications.ComponentBased.Common; using Tizen.Applications.Messages; @@ -24,45 +24,75 @@ namespace ServicePort { public class Service : ServiceComponent { - private Thread _thread; - private Port _port; - private Port _dummyPort; - private Thread _dummyThread; + private ComponentTask _task; + private ComponentTask _dummyTask; private int _sequence = 0; private static string _command = string.Empty; private static string _caller = string.Empty; private static string _remotePortName = string.Empty; private static MessagePort _messagePort; - private void ThreadMethod() + private void OnMessageRecevied(object sender, MessageReceivedEventArgs args) { - Log.Info("ThreadMethod()"); - _port.WaitForEvent(); + Log.Info(""); } - private void DummyThreadMethod() + private void OnRequestReceived(object sender, RequestEventArgs args) { - Log.Info("DummyThreadMethod()"); - _dummyPort.WaitForEvent(); - } + Log.Info("OnRequestReceived() Sender: " + args.Sender); + var request = args.Request; + if (request.GetType() == typeof(Request)) + { + var req = (Request)request; + Log.Info("Command: " + req.Command + " Sequence: " + req.Sequence + " Message: " + req.Message); - private void OnMessageRecevied(object sender, MessageReceivedEventArgs args) - { - Log.Info(""); + if (req.Command == "RequestReceived_CHECK" || + req.Command == "Sender_GET" || + req.Command == "Request_GET") + { + SendMessage(0); + } + + if (args.IsReplyRequested) + { + args.Reply = new Response(req.Command, req.Sequence, 0); + if (req.Command == "IsReplyRequested_CHECK") + { + SendMessage(0); + } + else if (req.Command == "Reply_SET_AND_GET") + { + var reply = (Response)args.Reply; + SendMessage(reply.Result); + } + } + } + else if (request.GetType() == typeof(Response)) + { + var res = (Response)request; + Log.Info("Command: " + res.Command + " Sequence: " + res.Sequence + " Result: " + res.Result); + } + else + { + Log.Warn("Invalid request"); + if (args.IsReplyRequested) + { + args.Reply = new Response("Unknown", -1, -1); + } + } } public override bool OnCreate() { Log.Info("OnCreate()"); - _port = new Port("ServicePort"); - _port.AddPrivilege("http://tizen.org/privilege/appmanager.launch"); - _thread = new Thread(new ThreadStart(ThreadMethod)); - _thread.Start(); + _task = new ComponentTask(new ComponentPort("ServicePort")); + _task.Port.AddPrivilege("http://tizen.org/privilege/appmanager.launch"); + _task.Port.RequestReceived += OnRequestReceived; + _task.Start(); - _dummyPort = new Port("DummyPort"); - _dummyPort.AddPrivilege("http://tizen.org/privilege/datasharing"); - _dummyThread = new Thread(new ThreadStart(DummyThreadMethod)); - _dummyThread.Start(); + _dummyTask = new ComponentTask(new ComponentPort("DummyPort")); + _dummyTask.Port.AddPrivilege("http://tizen.org/privilege/datasharing"); + _dummyTask.Start(); _messagePort = new MessagePort("ServicePort", false); _messagePort.MessageReceived += OnMessageRecevied; @@ -99,7 +129,7 @@ namespace ServicePort Log.Info("END"); } - private void HandleCommand() + private async void HandleCommand() { Log.Info("START"); if (_command == "Send_CHECK_WITHOUT_EXCEPTION") @@ -107,7 +137,7 @@ namespace ServicePort try { var request = new Request(_command, _sequence++, _caller); - _port.Send(_port.PortName, 5000, request); + _task.Port.Send(_task.Port.PortName, 5000, request); SendMessage(0); } catch @@ -116,12 +146,12 @@ namespace ServicePort SendMessage(-1); } } - else if (_command == "SendSync_CHECK_WITHOUT_EXCEPTION") + else if (_command == "SendAndReceive_CHECK_WITHOUT_EXCEPTION") { try { var request = new Request(_command, _sequence++, _caller); - var response = (Response)_port.SendSync(_port.PortName, 5000, request); + var response = (Response)_task.Port.SendAndReceive(_task.Port.PortName, 5000, request); SendMessage(0); } catch @@ -130,12 +160,13 @@ namespace ServicePort SendMessage(-1); } } - else if (_command == "OnSyncRequestEvent_CHECK") + else if (_command == "SendAndReceiveAsync_CHECK_WITHOUT_EXCEPTION") { try { var request = new Request(_command, _sequence++, _caller); - var response = (Response)_port.SendSync(_port.PortName, 5000, request); + await _task.Port.SendAndReceiveAsync(_task.Port.PortName, 5000, request); + SendMessage(0); } catch { @@ -143,12 +174,12 @@ namespace ServicePort SendMessage(-1); } } - else if (_command == "OnRequestEvent_CHECK") + else if (_command == "RequestReceived_CHECK") { try { var request = new Request(_command, _sequence++, _caller); - _port.Send(_port.PortName, 5000, request); + var response = (Response)_task.Port.SendAndReceive(_task.Port.PortName, 5000, request); } catch { @@ -161,7 +192,7 @@ namespace ServicePort try { var request = new Request(_command, _sequence++, _caller); - _port.Send(_dummyPort.PortName, 5000, request); + _task.Port.Send(_dummyTask.Port.PortName, 5000, request); SendMessage(-1); } catch (UnauthorizedAccessException) @@ -170,12 +201,54 @@ namespace ServicePort SendMessage(0); } } - else if (_command == "SendSync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION") + else if (_command == "Send_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION") + { + try + { + var request = new Request(_command, _sequence++, _caller); + _task.Port.Send("", 5000, request); + SendMessage(-1); + } + catch (ArgumentException) + { + Log.Error("Failed to send request"); + SendMessage(0); + } + } + else if (_command == "SendAndReceive_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION") + { + try + { + var request = new Request(_command, _sequence++, _caller); + var response = (Response)_task.Port.SendAndReceive(_dummyTask.Port.PortName, 5000, request); + SendMessage(-1); + } + catch (UnauthorizedAccessException) + { + Log.Error("Failed to send request"); + SendMessage(0); + } + } + else if (_command == "SendAndReceive_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION") + { + try + { + var request = new Request(_command, _sequence++, _caller); + var response = (Response)_task.Port.SendAndReceive("", 5000, request); + SendMessage(-1); + } + catch (ArgumentException) + { + Log.Error("Failed to send request"); + SendMessage(0); + } + } + else if (_command == "SendAndReceiveAsync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION") { try { var request = new Request(_command, _sequence++, _caller); - var response = (Response)_port.SendSync(_dummyPort.PortName, 5000, request); + await _task.Port.SendAndReceiveAsync(_dummyTask.Port.PortName, 5000, request); SendMessage(-1); } catch (UnauthorizedAccessException) @@ -184,6 +257,46 @@ namespace ServicePort SendMessage(0); } } + else if (_command == "SendAndReceiveAsync_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION") + { + try + { + var request = new Request(_command, _sequence++, _caller); + await _task.Port.SendAndReceiveAsync("", 5000, request); + SendMessage(-1); + } + catch (ArgumentException) + { + Log.Error("Failed to send request"); + SendMessage(0); + } + } + else if (_command == "Sender_GET" || _command == "Request_GET") + { + try + { + var request = new Request(_command, _sequence++, _caller); + _task.Port.Send(_task.Port.PortName, 5000, request); + } + catch + { + Log.Error("Failed to send request"); + SendMessage(-1); + } + } + else if (_command == "IsReplyRequested_CHECK" || _command == "Reply_SET_AND_GET") + { + try + { + var request = new Request(_command, _sequence++, _caller); + var response = (Response)_task.Port.SendAndReceive(_task.Port.PortName, 5000, request); + } + catch + { + Log.Error("Failed to send request"); + SendMessage(-1); + } + } Log.Info("END"); } @@ -214,10 +327,31 @@ namespace ServicePort { Log.Info("OnDestroy()"); base.OnDestroy(); - _port.Cancel(); - _thread.Join(); - _dummyPort.Cancel(); - _dummyThread.Join(); + if (_dummyTask != null) + { + _dummyTask.Stop(); + _dummyTask.Port?.Dispose(); + _dummyTask = null; + } + + if (_task != null) + { + _task.Stop(); + if (_task.Port != null) + { + _task.Port.RequestReceived -= OnRequestReceived; + _task.Port.Dispose(); + } + _task = null; + } + + if (_messagePort != null) + { + _messagePort.StopListening(); + _messagePort.MessageReceived -= OnMessageRecevied; + _messagePort.Dispose(); + _messagePort = null; + } } } } diff --git a/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/org.tizen.example.ComponentPortTest-1.0.0.tpk b/tct-suite-vs/Resource/Tizen.Applications.ComponentBased.ComponentPort.Tests/org.tizen.example.ComponentPortTest-1.0.0.tpk index 4f67d24b2d8b545f5e906e485c0dbd4f54a973d4..ed128b897c2fd1e9628802fc617b0d307a11a480 100755 GIT binary patch literal 23559 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

ikM;@~4B|*stg(=gRo+qO6#c&TrfbAn-}{-_x>< zSMiN2S-%f2St#(ida@c3xF{ys;?(?X5@8R~^2bIspbO#iHbY!n?*B5bMoczd{6Sm+thdBQ=xHMe>Vn*GEpvFU5v7cnZ01t&*g1?xbpOUvnP zF)qI&S?hfHQ2OX$S^nVh2#*oU@dTxf9Uydpks%P{w?D(oxu;DIb1WMf;O<2p3OB{r z$i|XuYGi6*V*)TUWm`fI0bnhw9^XdgA;R!z;aK7DTo6WLvCv|=sIvF<5xKAc0_dvf ztO?PxyO@zlm+grM_kN}AO>(vanZt$z606A_G!Vy=iZ{eV)=@IkG^U%XrYs*zI7S~7 zm^GWSAhHIHg%It4lZsO)HzWoU3@xrWhbM;KTDSD$R&4GK{(6BferPrAqeV}M@34uY z4806j@NK(pATThnIjRDLXlVA7L=1i!aL3{g1~9pQYrjm)YCu)U|1dv_iC{MUtxwLp zR89D8#O#L4Pa&dzOj+Y|QlZh3?*_H*)5i2()|_orKhvSp!@8Y@5XNA9PjW^J$(=jK z=y-U0>y~wWNeg*&sahfH{z1X_(qQ(L{a7NZW*jIa_Vd>jJB-$Oz_aiRT08b!C3U34 zwS5Sl@muB@R+@zYe;)wM^6S`Wck(?C1jxgS-!WwzdtYN~=Pom3pxuO;Co?!Rx!PP+?pda2LNfSLHmH}MsbTiTEH?N*J>j4xEP z17ZmKd)+Hny&DLggT%fq2Dcd~21);3$KTl(6tqgl;rQ#!dN=NFf=E`w$B>8o1`!K6 zz?g+xX4CBm43S>z668v?<09cRl7(s@?hz5i<*-hj5fqh-|2}gn?C?&X9X~!pS?AYZ zga8Lk)OMOR@V~}yld}Gn7{}xK!G2$-gScg&XR$Yvzm#+~1-aXPG-X?YqZ43z*?4)C z2vz^cNDq61Ut2a`5Q~E6yiB$xCSP5q2qpS^*sY?b!99p*aCx1t((0ca`E3vtUUxh5 z*YJJ_Y2GzyVpSnvm@=Nxn&L)z{s@lkm;qg?VW3r>JEl9i?N@Etu;Yb_*m0%~hHAZJb?%?>T_7O?){?w;+WxJJXipDNs&#!NKTJtH-^Gwb{&s5&rH`*x0#RGdQR zX!xSc38g@x@`&9Qn^-0?hF{_JK)|%3B&N{1hAZcPbr`Q~!aHlgDy2N6Q2N}{M;1tl z=7GN_XaYXvcK%swOtkv(;jv2Bd5v>+ODUhCkyy8Q=6ivjaBXFVf@98P5xGJ${N7Y~~-L zQKHJ{i*Z>u!>axAbk@(`01G!Q@zScWO5snBI}?e&QvF*{-}9y9tH`JHy|xWcEs=mW zHNQ7<#DMSs2zJxDn+?=W`XtP2+vx`V{OsKX4LhZ=djiNC%t|^k!`OgO6*^Vm1l<|rfQ`RhO_mhT zf#IXc+JS!N^i-gC)C(4rK=tPpx>u&O^|eKrUMbdBP8Oz)Yo_ma{;avD5Ro~ZVRHp} zlzMxXL#spN4s*_)t~O6BK40FQ`}}FoZ|-e#j(E=;Z+kl8)L5=jN j-ZG|ig##y` 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 Nzp^GfUx#5}{uki0;d%f7 literal 32510 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 A&j0`b diff --git a/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/Tizen.Applications.ComponentBased.ComponentPort.Tests.csproj b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/Tizen.Applications.ComponentBased.ComponentPort.Tests.csproj index 717469e..c21fb5d 100755 --- a/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/Tizen.Applications.ComponentBased.ComponentPort.Tests.csproj +++ b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/Tizen.Applications.ComponentBased.ComponentPort.Tests.csproj @@ -27,7 +27,7 @@ - + Runtime diff --git a/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentPort.cs b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentPort.cs index f4f1948..fe0fdbb 100755 --- a/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentPort.cs +++ b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentPort.cs @@ -19,11 +19,11 @@ using System; using System.Threading; using System.Threading.Tasks; using System.Timers; -using Tizen.Applications; using Tizen.Applications.Messages; using Timer = System.Timers.Timer; -namespace Tizen.Applications.ComponentBased.Tests { +namespace Tizen.Applications.ComponentBased.Tests +{ [TestFixture] [Description("Tizen.Applications.ComponentBased.ComponentPort Tests")] @@ -31,7 +31,7 @@ namespace Tizen.Applications.ComponentBased.Tests { { private const string LogTag = "ComponentPort.Tests"; private MessagePort _messagePort; - private TestPort _port; + private ComponentPort _port; private Timer _timer; private Thread _thread; private uint _count; @@ -39,22 +39,6 @@ namespace Tizen.Applications.ComponentBased.Tests { private int _receivedResult; private bool _received; - public class TestPort : ComponentPort - { - public TestPort(string portName) : base(portName) - { - } - - protected override void OnRequestEvent(string sender, object request) - { - } - - protected override object OnSyncRequestEvent(string sender, object request) - { - return null; - } - } - void OnMessageReceived(object sender, MessageReceivedEventArgs e) { Log.Info(LogTag, "START sender: " + sender); @@ -90,7 +74,7 @@ namespace Tizen.Applications.ComponentBased.Tests { _receivedResult = -1; _received = false; - _port = new TestPort("Test"); + _port = new ComponentPort("Test"); _count = 0; } @@ -104,9 +88,13 @@ namespace Tizen.Applications.ComponentBased.Tests { _port?.Dispose(); _port = null; - _messagePort?.StopListening(); - _messagePort?.Dispose(); - _messagePort = null; + if (_messagePort != null) + { + _messagePort.MessageReceived -= OnMessageReceived; + _messagePort.StopListening(); + _messagePort.Dispose(); + _messagePort = null; + } } private void SendLaunchRequest(string command) @@ -147,7 +135,7 @@ namespace Tizen.Applications.ComponentBased.Tests { public void ComponentPort_INIT() { Log.Info(LogTag, "START"); - var testPort = new TestPort("Test2"); + var testPort = new ComponentPort("Test2"); Assert.IsInstanceOf(testPort, "Should be an instance of ComponentPort"); Assert.IsNotNull(testPort, "testPort should not be null"); testPort?.Dispose(); @@ -164,14 +152,14 @@ namespace Tizen.Applications.ComponentBased.Tests { public void ComponentPort_INIT_WITH_NULL_AND_CHECK_ARGUMENTEXCEPTION() { Log.Info(LogTag, "START"); - try - { - var testPort = new TestPort(null); - Assert.Fail("Should throw ArgumentException"); + try + { + var testPort = new ComponentPort(null); + Assert.Fail("Should throw ArgumentException"); } catch (ArgumentException) - { - Assert.Pass("ArgumentException: Pass"); + { + Assert.Pass("ArgumentException: Pass"); } Log.Info(LogTag, "END"); } @@ -186,14 +174,14 @@ namespace Tizen.Applications.ComponentBased.Tests { public void ComponentPort_INIT_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION() { Log.Info(LogTag, "START"); - try - { - var testPort = new TestPort(""); - Assert.Fail("Should throw ArgumentException"); + try + { + var testPort = new ComponentPort(""); + Assert.Fail("Should throw ArgumentException"); } catch (ArgumentException) - { - Assert.Pass("ArgumentException: Pass"); + { + Assert.Pass("ArgumentException: Pass"); } Log.Info(LogTag, "END"); } @@ -208,15 +196,15 @@ namespace Tizen.Applications.ComponentBased.Tests { public void ComponentPort_INIT_AND_CHECK_IOEXCEPTION() { Log.Info(LogTag, "START"); - try - { - var testPort = new TestPort("Test"); - Assert.Fail("Should throw IOException"); + try + { + var testPort = new ComponentPort("Test"); + Assert.Fail("Should throw IOException"); + } + catch (global::System.IO.IOException) + { + Assert.Pass("IOException: Pass"); } - catch (global::System.IO.IOException) - { - Assert.Pass("IOException: Pass"); - } Log.Info(LogTag, "END"); } @@ -289,19 +277,35 @@ namespace Tizen.Applications.ComponentBased.Tests { public void AddPrivilege_CHECK_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION() { Log.Info(LogTag, "START"); - try - { + try + { _port.AddPrivilege(""); - Assert.Fail("Should throw ArgumentException"); + Assert.Fail("Should throw ArgumentException"); } catch (ArgumentException) - { + { Log.Error(LogTag, "ArgumentException occurs"); - Assert.Pass("ArgumentException: Pass"); + Assert.Pass("ArgumentException: Pass"); } Log.Info(LogTag, "END"); } + [Test] + [Category("P1")] + [Description("Test : Wait for port")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.WaitForPort M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task WaitForPort_CHECK() + { + Log.Info(LogTag, "START"); + /// If the target port is not ready, WaitForPort() will not be finished until the port is ready. + await ComponentPort.WaitForPort("Test"); + Assert.Pass("Test Port exists"); + Log.Info(LogTag, "END"); + } + private void Timeout(object sender, ElapsedEventArgs args) { _count++; @@ -443,119 +447,237 @@ namespace Tizen.Applications.ComponentBased.Tests { } [Test] + [Category("P2")] + [Description("Test : Send a request asynchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.Send M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MEX")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task Send_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("Send_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "Send_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION", "Recevied Command should be 'Send_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] [Category("P1")] - [Description("Test : Send a request synchronously")] - [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendSync M")] + [Description("Test : Send a request and receive a response synchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceive M")] [Property("SPEC_URL", "-")] [Property("CRITERIA", "MR")] [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] - public async Task SendSync_CHECK_WITHOUT_EXCEPTION() + public async Task SendAndReceive_CHECK_WITHOUT_EXCEPTION() { Log.Info(LogTag, "START"); _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); _thread.Start(); - SendLaunchRequest("SendSync_CHECK_WITHOUT_EXCEPTION"); + SendLaunchRequest("SendAndReceive_CHECK_WITHOUT_EXCEPTION"); await Task.Delay(8000); _timer.Stop(); _thread.Join(); - Assert.AreEqual(_receivedCommand, "SendSync_CHECK_WITHOUT_EXCEPTION", "Recevied Command should be 'SendSync_CHECK_WITHOUT_EXCEPTION'"); + Assert.AreEqual(_receivedCommand, "SendAndReceive_CHECK_WITHOUT_EXCEPTION", "Recevied Command should be 'SendAndReceive_CHECK_WITHOUT_EXCEPTION'"); Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); Log.Info(LogTag, "END"); } [Test] [Category("P1")] - [Description("Test : Send a request synchronously")] - [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendSync M")] + [Description("Test : Send a request and receive a response synchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceive M")] [Property("SPEC_URL", "-")] [Property("CRITERIA", "MEX")] [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] - public void SendSync_CHECK_WITH_ARUMENTEXCEPTION() + public void SendAndReceive_CHECK_WITH_ARUMENTEXCEPTION() { Log.Info(LogTag, "START"); try { - var res = _port.SendSync("ServicePort", 5000, null); - Assert.Fail(); + var res = _port.SendAndReceive("ServicePort", 5000, null); + Assert.Fail("DO NOT COME HERE"); } catch (ArgumentException) { - Assert.Pass(); + Assert.Pass("ArgumentException: Pass"); } Log.Info(LogTag, "END"); } [Test] [Category("P2")] - [Description("Test : Send a request synchronously")] - [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendSync M")] + [Description("Test : Send a request and receive a response synchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceive M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MEX")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task SendAndReceive_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("SendAndReceive_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "SendAndReceive_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION", "Recevied Command should be 'SendAndReceive_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P2")] + [Description("Test : Send a request and receive a response synchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceive M")] [Property("SPEC_URL", "-")] [Property("CRITERIA", "MEX")] [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] - public async Task SendSync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION() + public async Task SendAndReceive_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION() { Log.Info(LogTag, "START"); _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); _thread.Start(); - SendLaunchRequest("SendSync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION"); + SendLaunchRequest("SendAndReceive_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION"); await Task.Delay(4000); _timer.Stop(); _thread.Join(); - Assert.AreEqual(_receivedCommand, "SendSync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION", "Recevied Command should be 'SendSync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION'"); + Assert.AreEqual(_receivedCommand, "SendAndReceive_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION", "Recevied Command should be 'SendAndReceive_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION'"); Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); Log.Info(LogTag, "END"); } [Test] [Category("P1")] - [Description("Test : OnSyncRequestEvent")] - [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.OnSyncRequestEvent E")] + [Description("Test : Send a request and receive a response asynchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceiveAsync M")] [Property("SPEC_URL", "-")] - [Property("CRITERIA", "EVL")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task SendAndReceiveAsync_CHECK_WITHOUT_EXCEPTION() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("SendAndReceiveAsync_CHECK_WITHOUT_EXCEPTION"); + await Task.Delay(8000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "SendAndReceiveAsync_CHECK_WITHOUT_EXCEPTION", "Recevied Command should be 'SendAndReceiveAsync_CHECK_WITHOUT_EXCEPTION'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : Send a request and receive a response asynchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceiveAsync M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MEX")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task SendAndReceiveAsync_CHECK_WITH_ARUMENTEXCEPTION() + { + Log.Info(LogTag, "START"); + try + { + var result = await _port.SendAndReceiveAsync(null, 0, null); + Assert.Fail("DO NOT COME HERE"); + } + catch (ArgumentException) + { + Assert.Pass("ArgumentException: Pass"); + } + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P2")] + [Description("Test : Send a request and receive a response asynchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceiveAsync M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MEX")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task SendAndReceiveAsync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("SendAndReceiveAsync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "SendAndReceiveAsync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION", "Recevied Command should be 'SendAndReceiveAsync_CHECK_WITH_UNAUTHORIZEDACCESSEXCEPTION'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P2")] + [Description("Test : Send a request and receive a response asynchronously")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.SendAndReceiveAsync M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MEX")] [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] - public async Task OnSyncRequestEvent_CHECK() + public async Task SendAndReceiveAsync_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION() { Log.Info(LogTag, "START"); _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); _thread.Start(); - SendLaunchRequest("OnSyncRequestEvent_CHECK"); + SendLaunchRequest("SendAndReceiveAsync_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION"); await Task.Delay(4000); _timer.Stop(); _thread.Join(); - Assert.AreEqual(_receivedCommand, "OnSyncRequestEvent_CHECK", "Recevied Command should be 'OnSyncRequestEvent_CHECK'"); + Assert.AreEqual(_receivedCommand, "SendAndReceiveAsync_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION", "Recevied Command should be 'SendAndReceiveAsync_WITH_EMPTYSTRING_AND_CHECK_ARGUMENTEXCEPTION'"); Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); Log.Info(LogTag, "END"); } [Test] [Category("P1")] - [Description("Test : OnRequestEvent")] - [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.OnRequestEvent E")] + [Description("Test : RequestReceived event handler")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentPort.RequestReceived E")] [Property("SPEC_URL", "-")] [Property("CRITERIA", "EVL")] [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] - public async Task OnRequestEvent_CHECK() + public async Task RequestReceived_CHECK() { Log.Info(LogTag, "START"); _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); _thread.Start(); - SendLaunchRequest("OnRequestEvent_CHECK"); + SendLaunchRequest("RequestReceived_CHECK"); await Task.Delay(4000); _timer.Stop(); _thread.Join(); - Assert.AreEqual(_receivedCommand, "OnRequestEvent_CHECK", "Recevied Command should be 'OnRequestEvent_CHECK'"); + Assert.AreEqual(_receivedCommand, "RequestReceived_CHECK", "Recevied Command should be 'RequestReceived_CHECK'"); Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); Log.Info(LogTag, "END"); } diff --git a/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentTask.cs b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentTask.cs new file mode 100755 index 0000000..a444c8e --- /dev/null +++ b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSComponentTask.cs @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +using NUnit.Framework; +using System.Threading.Tasks; +using Tizen.Applications; +using Tizen.Applications.ComponentBased; + +namespace Tizen.Applications.ComponentBased.Tests +{ + [TestFixture] + [Description("Tizen.Applications.ComponentBased.ComponentTask Tests")] + public class ComponentTaskTests + { + private static string LogTag = "ComponentPort.Tests"; + private ComponentTask _task; + private ComponentPort _port; + + private void OnRequestReceived(object sender, RequestEventArgs args) + { + } + + [SetUp] + public void Init() + { + Log.Info(LogTag, "Preconditions for each TEST"); + _port = new ComponentPort("TestTask"); + _port.RequestReceived += OnRequestReceived; + _task = new ComponentTask(_port); + } + + [TearDown] + public void Destroy() + { + Log.Info(LogTag, "Postconditions for each TEST"); + if (_task != null) + { + if (_task.IsRunning) + _task.Stop(); + + _task = null; + } + + if (_port != null) + { + _port.RequestReceived -= OnRequestReceived; + _port.Dispose(); + _port = null; + } + } + + [Test] + [Category("P1")] + [Description("Test : ComponentTask method initialization")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentTask.ComponentTask C")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "CONSTR")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public void ComponentTask_INIT() + { + Log.Info(LogTag, "START"); + var testTask = new ComponentTask(new ComponentPort("Task")); + Assert.IsInstanceOf(testTask, "Should be an instance of ComponentTask"); + Assert.IsNotNull(testTask, "testPort should not be null"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : Starts the task.")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentTask.Start M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task Start_CHECK_RUNNING() + { + Log.Info(LogTag, "START"); + _task.Start(); + // To wait until the main loop is running properly, the delay is needed. + await Task.Delay(1000); + + Assert.AreEqual(true, _task.IsRunning, "task should be running"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : Stops the task.")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentTask.Stop M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task Stop_CHECK_RUNNING() + { + Log.Info(LogTag, "START"); + _task.Start(); + // To wait until the main loop is running properly, the delay is needed. + await Task.Delay(1000); + + _task.Stop(); + Assert.AreEqual(false, _task.IsRunning, "task should not be running"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : property IsRunning of ComponentTask")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentTask.IsRunning A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task IsRunning_CHECK() + { + Log.Info(LogTag, "START"); + _task.Start(); + // To wait until the main loop is running properly, the delay is needed. + await Task.Delay(1000); + Assert.AreEqual(true, _task.IsRunning, "The task should be running"); + + _task.Stop(); + Assert.AreEqual(false, _task.IsRunning, "The task should not be running") ; + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : property Port of ComponentTask")] + [Property("SPEC", "Tizen.Applications.ComponentBased.ComponentTask.Port A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public void Port_GET() + { + Log.Info(LogTag, "START"); + var port = _task.Port; + Assert.IsInstanceOf(port, "Should be an instance of ComponentPort"); + Assert.IsNotNull(port, "testPort should not be null"); + Assert.AreEqual(port, _port, "Should be equal to port"); + Log.Info(LogTag, "END"); + } + } +} diff --git a/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSRequestEventArgs.cs b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSRequestEventArgs.cs new file mode 100755 index 0000000..a43fdec --- /dev/null +++ b/tct-suite-vs/Tizen.Applications.ComponentBased.ComponentPort.Tests/testcase/TSRequestEventArgs.cs @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +using NUnit.Framework; +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Timers; +using Timer = System.Timers.Timer; +using Tizen.Applications.Messages; + +namespace Tizen.Applications.ComponentBased.Tests +{ + + [TestFixture] + [Description("Tizen.Applications.ComponentBased.RequestEventArgs Tests")] + public class RequestEventArgsTests + { + private const string LogTag = "ComponentPort.Tests"; + private MessagePort _messagePort; + private string _receivedCommand; + private int _receivedResult; + private bool _received; + private Timer _timer; + private Thread _thread; + + void OnMessageReceived(object sender, MessageReceivedEventArgs e) + { + Log.Info(LogTag, "START sender: " + sender); + try + { + _receivedCommand = e.Message.GetItem("command"); + _receivedResult = int.Parse(e.Message.GetItem("result")); + Log.Info(LogTag, "Command: " + _receivedCommand + " Result: " + _receivedResult); + _received = true; + } + catch (ArgumentException) + { + Log.Error(LogTag, "ArgumentException occurs"); + } + catch (InvalidOperationException) + { + Log.Error(LogTag, "InvalidOperationException occurs"); + } + Log.Info(LogTag, "END"); + } + + [SetUp] + public void Init() + { + Log.Info(LogTag, "Preconditions for each TEST"); + SendLaunchRequest("wakeup"); + + _messagePort = new MessagePort("ComponentPort.Tests", false); + _messagePort.MessageReceived += OnMessageReceived; + _messagePort.Listen(); + + _receivedCommand = string.Empty; + _receivedResult = -1; + _received = false; + } + + [TearDown] + public void Destroy() + { + Log.Info(LogTag, "Postconditions for each TEST"); + _timer = null; + _thread = null; + + if (_messagePort != null) + { + _messagePort.MessageReceived -= OnMessageReceived; + _messagePort.StopListening(); + _messagePort.Dispose(); + _messagePort = null; + } + } + + private void SendLaunchRequest(string command) + { + Log.Info(LogTag, "START command: " + command); + AppControl appControl = new AppControl(); + appControl.ApplicationId = "org.tizen.example.ComponentPortTest"; + appControl.ComponentId = "Service"; + appControl.ExtraData.Add("command", command); + appControl.ExtraData.Add("caller", Application.Current.ApplicationInfo.ApplicationId); + appControl.ExtraData.Add("message-port", "ComponentPort.Tests"); + try + { + AppControl.SendLaunchRequest(appControl); + } + catch (ArgumentNullException) + { + Log.Error(LogTag, "ArgumentNullException occurs"); + } + catch (InvalidOperationException) + { + Log.Error(LogTag, "InvalidOperationException occurs"); + } + catch (TimeoutException) + { + Log.Error(LogTag, "TimeoutException occurs"); + } + Log.Info(LogTag, "END"); + } + + private void SetTimer(ElapsedEventHandler handler) + { + Log.Info(LogTag, "SetTimer()"); + _timer = new Timer(5 * 100); + _timer.Elapsed += handler; + _timer.Start(); + } + + private void CheckReceivedMessage(object sender, ElapsedEventArgs args) + { + Log.Info(LogTag, "START"); + if (_received) + { + Log.Info(LogTag, "MessageReceived"); + _timer.Stop(); + } + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : property Sender of RequestEventArgs")] + [Property("SPEC", "Tizen.Applications.ComponentBased.RequestEventArgs.Sender A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task Sender_GET() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("Sender_GET"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "Sender_GET", "Recevied Command should be 'Sender_GET'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : property Request of RequestEventArgs")] + [Property("SPEC", "Tizen.Applications.ComponentBased.RequestEventArgs.Request A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task Request_GET() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("Request_GET"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "Request_GET", "Recevied Command should be 'Request_GET'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : property IsReplyRequested of RequestEventArgs")] + [Property("SPEC", "Tizen.Applications.ComponentBased.RequestEventArgs.IsReplyRequested A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task IsReplyRequested_CHECK() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("IsReplyRequested_CHECK"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "IsReplyRequested_CHECK", "Recevied Command should be 'IsReplyRequested_CHECK'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + + [Test] + [Category("P1")] + [Description("Test : property Reply of RequestEventArgs")] + [Property("SPEC", "Tizen.Applications.ComponentBased.RequestEventArgs.Reply A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW")] + [Property("AUTHOR", "Hwankyu Jhun, h.jhun@samsung.com")] + public async Task Reply_SET_AND_GET() + { + Log.Info(LogTag, "START"); + _thread = new Thread(() => SetTimer(new ElapsedEventHandler(CheckReceivedMessage))); + _thread.Start(); + + SendLaunchRequest("Reply_SET_AND_GET"); + await Task.Delay(4000); + + _timer.Stop(); + _thread.Join(); + + Assert.AreEqual(_receivedCommand, "Reply_SET_AND_GET", "Recevied Command should be 'Reply_SET_AND_GET'"); + Assert.AreEqual(_receivedResult, 0, "Recevied Result should be '0'"); + Log.Info(LogTag, "END"); + } + } +} -- 2.7.4