From 1e612fca3062ea7f3a592ca7a411742a8863dfa1 Mon Sep 17 00:00:00 2001 From: "yh106.jung" Date: Fri, 7 Dec 2018 10:36:23 +0900 Subject: [PATCH] [WebView][Non-ACR] Adds auto TCT for Tizen.WebView Auto TCT for Tizen.WebView was applied on Tizen 4.0[1], but it was removed on Tizen 5.0. This patch adds again auto TCT for Tizen.WebView. Tizen.WebView has been already added as API level 4, so we don't need to ACR for this patch. [1] http://165.213.149.170/gerrit/#/c/162552/ Change-Id: I487cce3293d1c7cf0da1a0f51ea5880166dbb025 Signed-off-by: yh106.jung --- tct-suite-vs/Tizen.WebView.Tests/Program.cs | 55 ++ .../Tizen.WebView.Tests.csproj | 39 + .../Tizen.WebView.Tests.sln | 78 ++ .../res/add_js_interface_sample.html | 44 + .../Tizen.WebView.Tests/res/sample.html | 13 + .../Tizen.WebView.Tests/res/sample_1.html | 11 + .../Tizen.WebView.Tests/res/sample_2.html | 11 + .../shared/res/Tizen.WebView.Tests.png | Bin 0 -> 57662 bytes .../testcase/TSChromium.cs | 74 ++ .../Tizen.WebView.Tests/testcase/TSContext.cs | 102 ++ .../testcase/TSCookieManager.cs | 140 +++ .../testcase/TSJavaScriptMessage.cs | 271 ++++++ .../testcase/TSSettings.cs | 121 +++ .../testcase/TSSmartCallbackArgs.cs | 177 ++++ .../testcase/TSSmartCallbackLoadErrorArgs.cs | 181 ++++ .../Tizen.WebView.Tests/testcase/TSWebView.cs | 870 ++++++++++++++++++ .../testcase/support/WebViewCommon.cs | 46 + .../Tizen.WebView.Tests/tizen-manifest.xml | 15 + 18 files changed, 2248 insertions(+) create mode 100755 tct-suite-vs/Tizen.WebView.Tests/Program.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.csproj create mode 100755 tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.sln create mode 100755 tct-suite-vs/Tizen.WebView.Tests/res/add_js_interface_sample.html create mode 100755 tct-suite-vs/Tizen.WebView.Tests/res/sample.html create mode 100755 tct-suite-vs/Tizen.WebView.Tests/res/sample_1.html create mode 100755 tct-suite-vs/Tizen.WebView.Tests/res/sample_2.html create mode 100755 tct-suite-vs/Tizen.WebView.Tests/shared/res/Tizen.WebView.Tests.png create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSChromium.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSContext.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSCookieManager.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSJavaScriptMessage.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSSettings.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackArgs.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackLoadErrorArgs.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/TSWebView.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/testcase/support/WebViewCommon.cs create mode 100755 tct-suite-vs/Tizen.WebView.Tests/tizen-manifest.xml diff --git a/tct-suite-vs/Tizen.WebView.Tests/Program.cs b/tct-suite-vs/Tizen.WebView.Tests/Program.cs new file mode 100755 index 000000000..38f49125a --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/Program.cs @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018 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 System; +using NUnitLite.TUnit; +using AutoTemplate; +using Tizen.WebView; + +namespace XamarinForTizen.Tizen +{ + + class Program : global::Xamarin.Forms.Platform.Tizen.FormsApplication + { + private static App _app; + protected override void OnCreate() + { + base.OnCreate(); + + Console.WriteLine("TCT : OnCreate()"); + _app = new App(); + LoadApplication(_app); + + TRunner t = new TRunner(); + t.LoadTestsuite(); + t.Execute(); + } + + public static App getApp() + { + return _app; + } + static void Main(string[] args) + { + Console.WriteLine("TCT : Main()"); + var app = new Program(); + global::Xamarin.Forms.Platform.Tizen.Forms.Init(app); + Chromium.Initialize(); + app.Run(args); + Chromium.Shutdown(); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.csproj b/tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.csproj new file mode 100755 index 000000000..1c4ad04fc --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.csproj @@ -0,0 +1,39 @@ + + + + + Exe + tizen60 + + + + + true + + + + portable + + + None + + + + + + + + + + + Runtime + + + + + + + + + + diff --git a/tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.sln b/tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.sln new file mode 100755 index 000000000..c687114fb --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/Tizen.WebView.Tests.sln @@ -0,0 +1,78 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.15 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.WebView.Tests", "Tizen.WebView.Tests.csproj", "{D92BEEAC-3B2A-45F8-8C53-53B92550404A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "nunit.framework", "..\nunit.framework\nunit.framework.csproj", "{B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "nunitlite", "..\nunitlite\nunitlite.csproj", "{FDB8025A-C029-461F-895E-287B4C65939B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoTemplate", "..\Template\AutoTemplate\AutoTemplate.csproj", "{B11ABB0C-C3C1-4B5C-8251-A15628A775F3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Debug|x64.ActiveCfg = Debug|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Debug|x64.Build.0 = Debug|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Debug|x86.ActiveCfg = Debug|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Debug|x86.Build.0 = Debug|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Release|Any CPU.Build.0 = Release|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Release|x64.ActiveCfg = Release|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Release|x64.Build.0 = Release|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Release|x86.ActiveCfg = Release|Any CPU + {D92BEEAC-3B2A-45F8-8C53-53B92550404A}.Release|x86.Build.0 = Release|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Debug|x64.Build.0 = Debug|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Debug|x86.Build.0 = Debug|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Release|Any CPU.Build.0 = Release|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Release|x64.ActiveCfg = Release|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Release|x64.Build.0 = Release|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Release|x86.ActiveCfg = Release|Any CPU + {B9E7C1FD-CB38-42F7-AC43-7BD2E5B4D216}.Release|x86.Build.0 = Release|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Debug|x64.ActiveCfg = Debug|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Debug|x64.Build.0 = Debug|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Debug|x86.ActiveCfg = Debug|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Debug|x86.Build.0 = Debug|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Release|Any CPU.Build.0 = Release|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Release|x64.ActiveCfg = Release|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Release|x64.Build.0 = Release|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Release|x86.ActiveCfg = Release|Any CPU + {FDB8025A-C029-461F-895E-287B4C65939B}.Release|x86.Build.0 = Release|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Debug|x64.Build.0 = Debug|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Debug|x86.Build.0 = Debug|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Release|Any CPU.Build.0 = Release|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Release|x64.ActiveCfg = Release|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Release|x64.Build.0 = Release|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Release|x86.ActiveCfg = Release|Any CPU + {B11ABB0C-C3C1-4B5C-8251-A15628A775F3}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ED382B91-9930-40B6-B3D7-362304C78680} + EndGlobalSection +EndGlobal diff --git a/tct-suite-vs/Tizen.WebView.Tests/res/add_js_interface_sample.html b/tct-suite-vs/Tizen.WebView.Tests/res/add_js_interface_sample.html new file mode 100755 index 000000000..e175d42c7 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/res/add_js_interface_sample.html @@ -0,0 +1,44 @@ + + + + Testing Sample Page for Add JavaScript Interface + + + +

Sample HTML for Add JavaScript Interface

+
+

+ + diff --git a/tct-suite-vs/Tizen.WebView.Tests/res/sample.html b/tct-suite-vs/Tizen.WebView.Tests/res/sample.html new file mode 100755 index 000000000..abdaacd5c --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/res/sample.html @@ -0,0 +1,13 @@ + + + + Testing Sample Page + + +

Sample HTML

+

This is sample html page to be used in test suite when loading of a page is required.

+

test content

+ + diff --git a/tct-suite-vs/Tizen.WebView.Tests/res/sample_1.html b/tct-suite-vs/Tizen.WebView.Tests/res/sample_1.html new file mode 100755 index 000000000..d407ab12f --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/res/sample_1.html @@ -0,0 +1,11 @@ + + + + Testing Sample Page 1 + + +

Sample HTML 1

+ + diff --git a/tct-suite-vs/Tizen.WebView.Tests/res/sample_2.html b/tct-suite-vs/Tizen.WebView.Tests/res/sample_2.html new file mode 100755 index 000000000..c11b4ba2a --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/res/sample_2.html @@ -0,0 +1,11 @@ + + + + Testing Sample Page 2 + + +

Sample HTML 2

+ + diff --git a/tct-suite-vs/Tizen.WebView.Tests/shared/res/Tizen.WebView.Tests.png b/tct-suite-vs/Tizen.WebView.Tests/shared/res/Tizen.WebView.Tests.png new file mode 100755 index 0000000000000000000000000000000000000000..9765b1bda7e5bddf0925555ab204b887a873bf24 GIT binary patch literal 57662 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 kZ}gYfNaCF}xV$|1>H6z0+kD 0, "Initialize method failed, reference count: " + _init); + + _shutdown = Chromium.Shutdown(); + Assert.AreEqual(_shutdown, _init - 1, "Shutdown method failed, Initialize: " + _init + " Shutdown: " + _shutdown); + } + + [Test] + [Category("P1")] + [Description("Shutdown Chromium's instance")] + [Property("SPEC", "Tizen.WebView.Chromium.Shutdown M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void Shutdown_RETURN_VALUE() + { + /* TEST CODE */ + _init = Chromium.Initialize(); + Assert.IsTrue(_init > 0, "Initialize method failed, reference count: " + _init); + + _shutdown = Chromium.Shutdown(); + Assert.AreEqual(_shutdown, _init - 1, "Shutdown method failed, Initialize: " + _init + " Shutdown: " + _shutdown); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSContext.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSContext.cs new file mode 100755 index 000000000..ad106bb6e --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSContext.cs @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; + +namespace Tizen.WebView.Tests +{ + + [TestFixture] + [Description("Tizen.WebView.Context Tests")] + public class ContextTests { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.Context Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions for Tizen.WebView.Context Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Checks default cache model for the context")] + [Property("SPEC", "Tizen.WebView.Context.CacheModel A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PDV")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void CacheModel_CHECK_DEFAULT() + { + /* TEST CODE */ + var context = _webView.GetContext(); + Assert.IsInstanceOf(context, "GetContext method failed"); + + Assert.IsInstanceOf(context.CacheModel); + Assert.AreEqual((int)CacheModel.DocumentViewer, (int)context.CacheModel, "Default cache model should be DocumentViewer"); + } + + [Test] + [Category("P1")] + [Description("Gets and sets cache model for the context")] + [Property("SPEC", "Tizen.WebView.Context.CacheModel A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW, PRE")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void CacheModel_GET_SET_ALL() + { + /* TEST CODE */ + var context = _webView.GetContext(); + Assert.IsInstanceOf(context, "GetContext method failed"); + + context.CacheModel = CacheModel.DocumentViewer; + Assert.IsInstanceOf(context.CacheModel); + Assert.AreEqual((int)CacheModel.DocumentViewer, (int)context.CacheModel, "CacheModel should be DocumentViewer"); + + context.CacheModel = CacheModel.DocumentBrowser; + Assert.IsInstanceOf(context.CacheModel); + Assert.AreEqual((int)CacheModel.DocumentBrowser, (int)context.CacheModel, "CacheModel should be DocumentBrowser"); + + context.CacheModel = CacheModel.PrimaryWebBrowser; + Assert.IsInstanceOf(context.CacheModel); + Assert.AreEqual((int)CacheModel.PrimaryWebBrowser, (int)context.CacheModel, "CacheModel should be PrimaryWebBrowser"); + } + + [Test] + [Category("P1")] + [Description("Gets cookie manager instance for the context")] + [Property("SPEC", "Tizen.WebView.Context.GetCookieManager M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void GetCookieManager_RETURN_VALUE() + { + /* TEST CODE */ + var context = _webView.GetContext(); + Assert.IsInstanceOf(context, "GetContext method failed"); + + var cookieManager = context.GetCookieManager(); + Assert.IsInstanceOf(cookieManager, "GetCookieManager method failed"); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSCookieManager.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSCookieManager.cs new file mode 100755 index 000000000..1a4e8c5e7 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSCookieManager.cs @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; +using System; +using System.Threading.Tasks; + +namespace Tizen.WebView.Tests +{ + [TestFixture] + [Description("Tizen.WebView.CookieManager Tests")] + public class CookieManagerTests + { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.CookieManager Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions for Tizen.WebView.CookieManager Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Sets the cookie acceptance policy")] + [Property("SPEC", "Tizen.WebView.CookieManager.SetCookieAcceptPolicy M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MAE")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void SetCookieAcceptPolicy_ENUM_ALL() + { + /* TEST CODE */ + var cookieManager = _webView.GetContext().GetCookieManager(); + Assert.IsNotNull(cookieManager, "GetCookieManager returns NULL"); + Assert.IsInstanceOf(cookieManager, "GetCookieManager method failed"); + + // TODO: GetCookieAcceptPolicyAsync is not implemented yet. + // Need verification after we've implemented it. + try + { + cookieManager.SetCookieAcceptPolicy(CookieAcceptPolicy.Always); + + cookieManager.SetCookieAcceptPolicy(CookieAcceptPolicy.Never); + + cookieManager.SetCookieAcceptPolicy(CookieAcceptPolicy.NoThirdParty); + } + catch (Exception e) + { + Assert.True(false, e.Message); + } + } + + [Test] + [Category("P1")] + [Description("Deletes all the cookies of a manager")] + [Property("SPEC", "Tizen.WebView.CookieManager.ClearCookies M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task ClearCookies_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrl); + await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(tcs.Task.Result, "LoadUrl method failed"); + + /* TEST CODE */ + var cookieManager = _webView.GetContext().GetCookieManager(); + Assert.IsNotNull(cookieManager, "GetCookieManager returns NULL"); + Assert.IsInstanceOf(cookieManager, "GetCookieManager method failed"); + + try + { + cookieManager.ClearCookies(); + } + catch (Exception e) + { + Assert.True(false, e.Message); + } + } + + [Test] + [Category("P1")] + [Description("Sets the storage where non-session cookies are stored persistently")] + [Property("SPEC", "Tizen.WebView.CookieManager.SetPersistentStorage M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MAE")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void SetPersistentStorage_ENUM_ALL() + { + /* TEST CODE */ + var cookieManager = _webView.GetContext().GetCookieManager(); + Assert.IsInstanceOf(cookieManager, "GetCookieManager method failed"); + string path = Applications.Application.Current.DirectoryInfo.Data + "mycookiestoragedir"; + + try + { + cookieManager.SetPersistentStorage(path, CookiePersistentStorage.Text); + + cookieManager.SetPersistentStorage(path, CookiePersistentStorage.SqlLite); + } + catch (Exception e) + { + Assert.True(false, e.Message); + } + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSJavaScriptMessage.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSJavaScriptMessage.cs new file mode 100755 index 000000000..6fb14cc92 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSJavaScriptMessage.cs @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; +using System; +using System.Threading.Tasks; + +namespace Tizen.WebView.Tests +{ + + [TestFixture] + [Description("Tizen.WebView.JavaScriptMessage Tests")] + public class JavaScriptMessageTests + { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.JavaScriptMessage Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions for Tizen.WebView.JavaScriptMessage Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Gets the name of JavaScript message")] + [Property("SPEC", "Tizen.WebView.JavaScriptMessage.Name A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Name_READ_ONLY() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + TaskCompletionSource tcsForCallback = new TaskCompletionSource(false); + JavaScriptMessageHandler handler = (message) => + { + if (message.Name is string && message.Name.Equals("MyJavaScriptInterfaceForName")) + { + tcsForCallback.TrySetResult(true); + } + tcsForCallback.TrySetResult(false); + }; + _webView.AddJavaScriptMessageHandler("MyJavaScriptInterfaceForName", handler); + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + _webView.Eval("callForName();"); + result = await tcsForCallback.Task; + + Assert.IsTrue(result, "JavaScript handler should be invoked with valid name"); + } + + [Test] + [Category("P1")] + [Description("Gets the body of JavaScript message as integer type")] + [Property("SPEC", "Tizen.WebView.JavaScriptMessage.GetBodyAsInteger M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetBodyAsInteger_RETURN_VALUE() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + TaskCompletionSource tcsForCallback = new TaskCompletionSource(false); + JavaScriptMessageHandler handler = (message) => + { + if (message.Name.Equals("MyJavaScriptInterfaceWithInteger")) + { + var body = message.GetBodyAsInteger(); + if (body.GetType() == typeof(int) && body == 10) + { + tcsForCallback.TrySetResult(true); + } + } + tcsForCallback.TrySetResult(false); + }; + _webView.AddJavaScriptMessageHandler("MyJavaScriptInterfaceWithInteger", handler); + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + _webView.Eval("callWithInteger();"); + result = await tcsForCallback.Task; + + Assert.IsTrue(result, "GetBodyAsInteger should return valid body value"); + } + + [Test] + [Category("P1")] + [Description("Gets the body of JavaScript message as double type")] + [Property("SPEC", "Tizen.WebView.JavaScriptMessage.GetBodyAsDouble M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetBodyAsDouble_RETURN_VALUE() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + TaskCompletionSource tcsForCallback = new TaskCompletionSource(false); + JavaScriptMessageHandler handler = (message) => + { + if (message.Name.Equals("MyJavaScriptInterfaceWithDouble")) + { + var body = message.GetBodyAsDouble(); + if (body.GetType() == typeof(double) && body == 0.1) + { + tcsForCallback.TrySetResult(true); + } + } + tcsForCallback.TrySetResult(false); + }; + _webView.AddJavaScriptMessageHandler("MyJavaScriptInterfaceWithDouble", handler); + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + _webView.Eval("callWithDouble();"); + result = await tcsForCallback.Task; + + Assert.IsTrue(result, "GetBodyAsDouble should return valid body value"); + } + + [Test] + [Category("P1")] + [Description("Gets the body of JavaScript message as boolean type")] + [Property("SPEC", "Tizen.WebView.JavaScriptMessage.GetBodyAsBoolean M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetBodyAsBoolean_RETURN_VALUE() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + TaskCompletionSource tcsForCallback = new TaskCompletionSource(false); + JavaScriptMessageHandler handler = (message) => + { + if (message.Name.Equals("MyJavaScriptInterfaceWithBoolean")) + { + var body = message.GetBodyAsBoolean(); + if (body.GetType() == typeof(bool) && body == true) + { + tcsForCallback.TrySetResult(true); + } + } + tcsForCallback.TrySetResult(false); + }; + _webView.AddJavaScriptMessageHandler("MyJavaScriptInterfaceWithBoolean", handler); + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + _webView.Eval("callWithBoolean();"); + result = await tcsForCallback.Task; + + Assert.IsTrue(result, "GetBodyAsBoolean should return valid body value"); + } + + [Test] + [Category("P1")] + [Description("Gets the body of JavaScript message as string type")] + [Property("SPEC", "Tizen.WebView.JavaScriptMessage.GetBodyAsString M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetBodyAsString_RETURN_VALUE() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + TaskCompletionSource tcsForCallback = new TaskCompletionSource(false); + JavaScriptMessageHandler handler = (message) => + { + if (message.Name.Equals("MyJavaScriptInterfaceWithString")) + { + var body = message.GetBodyAsString(); + if (body.GetType() == typeof(string) && body.Equals("Test message")) + { + tcsForCallback.TrySetResult(true); + } + } + tcsForCallback.TrySetResult(false); + }; + _webView.AddJavaScriptMessageHandler("MyJavaScriptInterfaceWithString", handler); + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + _webView.Eval("callWithString();"); + result = await tcsForCallback.Task; + + Assert.IsTrue(result, "GetBodyAsString should return valid body value"); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSettings.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSettings.cs new file mode 100755 index 000000000..4f5c85c01 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSettings.cs @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; + +namespace Tizen.WebView.Tests +{ + + [TestFixture] + [Description("Tizen.WebView.Settings Tests")] + public class SettingsTests + { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.Settings Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions for Tizen.WebView.Settings Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Gets and sets whether JavaScript can be executable")] + [Property("SPEC", "Tizen.WebView.Settings.JavaScriptEnabled A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void JavaScriptEnabled_READ_WRITE() + { + /* TEST CODE */ + var settings = _webView.GetSettings(); + Assert.IsInstanceOf(settings, "GetSettings method failed"); + + + settings.JavaScriptEnabled = false; + Assert.IsFalse(settings.JavaScriptEnabled, "Fail to get/set JavaScriptEnabled as false"); + + settings.JavaScriptEnabled = true; + Assert.IsTrue(settings.JavaScriptEnabled, "Fail to get/set JavaScriptEnabled as true"); + } + + [Test] + [Category("P1")] + [Description("Gets and sets whether images can be loaded automatically")] + [Property("SPEC", "Tizen.WebView.Settings.LoadImageAutomatically A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void LoadImageAutomatically_READ_WRITE() + { + /* TEST CODE */ + var settings = _webView.GetSettings(); + Assert.IsInstanceOf(settings, "GetSettings method failed"); + + settings.LoadImageAutomatically = true; + Assert.IsTrue(settings.LoadImageAutomatically, "Fail to get/set LoadImageAutomatically"); + + settings.LoadImageAutomatically = false; + Assert.IsFalse(settings.LoadImageAutomatically, "Fail to get/set LoadImageAutomatically"); + } + + [Test] + [Category("P1")] + [Description("Gets and sets default text encoding name")] + [Property("SPEC", "Tizen.WebView.Settings.DefaultTextEncodingName A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void DefaultTextEncodingName_READ_WRITE() + { + /* TEST CODE */ + var settings = _webView.GetSettings(); + Assert.IsInstanceOf(settings, "GetSettings method failed"); + + const string encodingName = "utf-8"; + settings.DefaultTextEncodingName = encodingName; + Assert.True(settings.DefaultTextEncodingName.Length > 0, "Fail to get/set DefaultTextEncodingName"); + Assert.AreEqual(encodingName, settings.DefaultTextEncodingName, "Fail to get/set DefaultTextEncodingName"); + } + + [Test] + [Category("P1")] + [Description("Gets and sets default font size of a pixel")] + [Property("SPEC", "Tizen.WebView.Settings.DefaultFontSize A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void DefaultFontSize_READ_WRITE() + { + /* TEST CODE */ + var settings = _webView.GetSettings(); + Assert.IsInstanceOf(settings, "GetSettings method failed"); + + const int fontSize = 10; + settings.DefaultFontSize = fontSize; + Assert.AreEqual(fontSize, settings.DefaultFontSize, "Fail to get/set DefaultFontSize"); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackArgs.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackArgs.cs new file mode 100755 index 000000000..6438ee179 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackArgs.cs @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; +using System; +using System.Threading.Tasks; + +namespace Tizen.WebView.Tests +{ + + [TestFixture] + [Description("Tizen.WebView.SmartCallbackArgs Tests")] + public class SmartCallbackArgsTests + { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.SmartCallbackArgs Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions for Tizen.WebView.SmartCallbackArgs Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Gets the parameter of callback as boolean type")] + [Property("SPEC", "Tizen.WebView.SmartCallbackArgs.GetAsBoolean M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetAsBoolean_RETURN_VALUE() + { + /* TEST CODE */ + bool arg = false; + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onTitleChanged = (s, e) => { + arg = e.GetAsBoolean(); + }; + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.TitleChanged += onTitleChanged; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.TitleChanged -= onTitleChanged; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + Assert.IsTrue(arg, "GetAsBoolean should return valid value"); + } + + [Test] + [Category("P1")] + [Description("Gets the parameter of callback as double type")] + [Property("SPEC", "Tizen.WebView.SmartCallbackArgs.GetAsDouble M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetAsDouble_RETURN_VALUE() + { + /* TEST CODE */ + double arg = 0d; + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onTitleChanged = (s, e) => { + arg = e.GetAsDouble(); + }; + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.TitleChanged += onTitleChanged; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.TitleChanged -= onTitleChanged; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + Assert.AreNotEqual(0d, arg, "GetAsDouble should return valid value"); + } + + [Test] + [Category("P1")] + [Description("Gets the parameter of callback as integer type")] + [Property("SPEC", "Tizen.WebView.SmartCallbackArgs.GetAsInteger M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetAsInteger_RETURN_VALUE() + { + /* TEST CODE */ + int arg = 0; + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onTitleChanged = (s, e) => { + arg = e.GetAsInteger(); + }; + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.TitleChanged += onTitleChanged; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.TitleChanged -= onTitleChanged; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + Assert.AreNotEqual(0, arg, "GetAsInteger should return valid value"); + } + + [Test] + [Category("P1")] + [Description("Gets the parameter of callback as string type")] + [Property("SPEC", "Tizen.WebView.SmartCallbackArgs.GetAsString M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GetAsString_RETURN_VALUE() + { + /* TEST CODE */ + string arg = string.Empty; + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onTitleChanged = (s, e) => { + arg = e.GetAsString(); + }; + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.TitleChanged += onTitleChanged; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.TitleChanged -= onTitleChanged; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + Assert.AreEqual(WebViewCommon.SampleHtmlTitle, arg, "GetAsString should return valid value"); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackLoadErrorArgs.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackLoadErrorArgs.cs new file mode 100755 index 000000000..28d4da55a --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSSmartCallbackLoadErrorArgs.cs @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; +using System; +using System.Threading.Tasks; + +namespace Tizen.WebView.Tests +{ + + [TestFixture] + [Description("Tizen.WebView.SmartCallbackLoadErrorArgs Tests")] + public class SmartCallbackLoadErrorArgsTests + { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.SmartCallbackLoadErrorArgs Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions for Tizen.WebView.SmartCallbackLoadErrorArgs Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Gets the URL of load error callback")] + [Property("SPEC", "Tizen.WebView.SmartCallbackLoadErrorArgs.Url A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Url_READ_ONLY() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => + { + var url = e.Url; + if (url is string && url.Equals(WebViewCommon.TestUrlForError)) + { + tcs.TrySetResult(true); + } + tcs.TrySetResult(false); + }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrlForError); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "Url should be valid value"); + } + + [Test] + [Category("P1")] + [Description("Gets the error code of load error callback")] + [Property("SPEC", "Tizen.WebView.SmartCallbackLoadErrorArgs.Code A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Code_READ_ONLY() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => + { + var code = e.Code; + if (code.GetType() == typeof(LoadErrorCode) && code.Equals(LoadErrorCode.CantLookupHost)) + { + tcs.TrySetResult(true); + } + tcs.TrySetResult(false); + }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrlForError); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "Code should be valid value"); + } + + [Test] + [Category("P1")] + [Description("Gets the description of load error callback")] + [Property("SPEC", "Tizen.WebView.SmartCallbackLoadErrorArgs.Description A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Description_READ_ONLY() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => + { + var description = e.Description; + if (description is string) + { + tcs.TrySetResult(true); + } + tcs.TrySetResult(false); + }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrlForError); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "Description should be valid value"); + } + + [Test] + [Category("P1")] + [Description("Gets the cancellation or not of load error callback")] + [Property("SPEC", "Tizen.WebView.SmartCallbackLoadErrorArgs.Cancellation A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Cancellation_READ_ONLY() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => + { + var cancellation = e.Cancellation; + if (cancellation.GetType() == typeof(bool)) + { + tcs.TrySetResult(true); + } + tcs.TrySetResult(false); + }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrlForError); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "Cancellation should be valid value"); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/TSWebView.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSWebView.cs new file mode 100755 index 000000000..6f5a948a9 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/TSWebView.cs @@ -0,0 +1,870 @@ +/* + * Copyright (c) 2018 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 NUnit.Framework.TUnit; +using System; +using System.Threading.Tasks; + +namespace Tizen.WebView.Tests +{ + [TestFixture] + [Description("Tizen.WebView.WebView Tests")] + public class WebViewTests + { + private WebView _webView; + + [SetUp] + public void Init() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Preconditions for Tizen.WebView.WebView Tests"); + _webView = new WebView(WebViewCommon.GetMainWindow()); + } + + [TearDown] + public void Destroy() + { + LogUtils.Write(LogUtils.DEBUG, LogUtils.TAG, "Postconditions forTizen.WebView.WebView Tests"); + _webView = null; + } + + [Test] + [Category("P1")] + [Description("Event that occurs when load started")] + [Property("SPEC", "Tizen.WebView.WebView.LoadStarted E")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "EVL")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task LoadStarted_CHECK_EVENT() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadStarted = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadStarted += onLoadStarted; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadStarted -= onLoadStarted; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadStarted event should be invoked"); + } + + [Test] + [Category("P1")] + [Description("Event that occurs when load finished")] + [Property("SPEC", "Tizen.WebView.WebView.LoadFinished E")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "EVL")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task LoadFinished_CHECK_EVENT() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadFinished event should be invoked"); + } + + [Test] + [Category("P1")] + [Description("Event that occurs when load error")] + [Property("SPEC", "Tizen.WebView.WebView.LoadError E")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "EVL")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task LoadError_CHECK_EVENT() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(true); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrlForError); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadError event should be invoked"); + } + + [Test] + [Category("P1")] + [Description("Event that occurs when title of main frame was changed")] + [Property("SPEC", "Tizen.WebView.WebView.TitleChanged E")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "EVL")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task TitleChanged_CHECK_EVENT() + { + /* TEST CODE */ + string title = string.Empty; + EventHandler onTitleChanged = (s, e) => { + title = e.GetAsString(); + }; + + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.TitleChanged += onTitleChanged; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.TitleChanged -= onTitleChanged; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + Assert.AreEqual(_webView.Title, title, "Received title should be same with WebView.Title"); + } + + [Test] + [Category("P1")] + [Description("Event that occurs when URL of main frame was changed")] + [Property("SPEC", "Tizen.WebView.WebView.UrlChanged E")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "EVL")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task UrlChanged_CHECK_EVENT() + { + /* TEST CODE */ + string url = string.Empty; + EventHandler onUrlChanged = (s, e) => { + url = e.GetAsString(); + }; + + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.UrlChanged += onUrlChanged; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.UrlChanged -= onUrlChanged; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + Assert.AreEqual(_webView.Url, url, "Received URL should be same with WebView.Url"); + } + + [Test] + [Category("P1")] + [Description("Gets current URL of the main frame")] + [Property("SPEC", "Tizen.WebView.WebView.Url A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Url_READ_ONLY() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + /* TEST CODE */ + var url = _webView.Url; + Assert.IsInstanceOf(url, "Get Url should return object string"); + Assert.AreEqual(WebViewCommon.SampleHtml, url, "Fail to get Url should return valid url"); + } + + [Test] + [Category("P1")] + [Description("Gets current title of the main frame")] + [Property("SPEC", "Tizen.WebView.WebView.Title A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Title_READ_ONLY() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + /* TEST CODE */ + var title = _webView.Title; + Assert.IsInstanceOf(title, "Get Title should return object string"); + Assert.AreEqual(WebViewCommon.SampleHtmlTitle, title, "Get Title should return valid title"); + } + + [Test] + [Category("P1")] + [Description("Gets and sets user agent string of this view")] + [Property("SPEC", "Tizen.WebView.WebView.UserAgent A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRW")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void UserAgent_READ_WRITE() + { + /* TEST CODE */ + _webView.UserAgent = WebViewCommon.TestUserAgent; + var userAgent = _webView.UserAgent; + Assert.IsInstanceOf(userAgent, "Get UserAgent should return object string"); + Assert.AreEqual(WebViewCommon.TestUserAgent, userAgent, "Get UserAgent should return valid user agent"); + } + + [Test] + [Category("P1")] + [Description("Checks whether a view has the focus")] + [Property("SPEC", "Tizen.WebView.WebView.HasFocus A")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "PRO")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task HasFocus_READ_ONLY() + { + /* PRECONDITION */ + + + /* TEST CODE */ + var hasFocus = _webView.HasFocus; + Assert.IsInstanceOf(hasFocus, "Get HasFocus should return object bool"); + Assert.IsFalse(hasFocus, "HasFocus should be false before load content"); + + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => + { + _webView.SetFocus(true); + tcs.TrySetResult(true); + }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + hasFocus = _webView.HasFocus; + Assert.IsInstanceOf(hasFocus, "Get HasFocus should return object bool"); + Assert.IsTrue(hasFocus, "HasFocus should be true after load content"); + } + + [Test] + [Category("P1")] + [Description("Create a WebView object")] + [Property("SPEC", "Tizen.WebView.WebView.WebView C")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "CONSTR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void WebView_INIT_WITH_PARENT() + { + /* TEST CODE */ + var webView = new WebView(WebViewCommon.GetMainWindow()); + Assert.IsNotNull(webView, "WebView object is null after initialization"); + Assert.IsInstanceOf(webView, "Should return WebView instance"); + } + + [Test] + [Category("P1")] + [Description("Gets the Context object of this view")] + [Property("SPEC", "Tizen.WebView.WebView.GetContext M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void GetContext_RETURN_VALUE() + { + /* TEST CODE */ + var context = _webView.GetContext(); + Assert.IsInstanceOf(context, "GetContext method failed"); + } + + [Test] + [Category("P1")] + [Description("Gets the Settings object of this view")] + [Property("SPEC", "Tizen.WebView.WebView.GetSettings M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public void GetSettings_RETURN_VALUE() + { + /* TEST CODE */ + var settings = _webView.GetSettings(); + Assert.IsInstanceOf(settings, "GetSettings method failed"); + } + + [Test] + [Category("P1")] + [Description("Asks the object to load the given URL")] + [Property("SPEC", "Tizen.WebView.WebView.LoadUrl M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task LoadUrl_CHANGE_STATUS() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + } + + [Test] + [Category("P1")] + [Description("Loads the specified html string as the content of the view")] + [Property("SPEC", "Tizen.WebView.WebView.LoadHtml M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task LoadHtml_CHANGE_STATUS() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadHtml(WebViewCommon.TestHtml, WebViewCommon.TestUrl); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadHtml method failed"); + Assert.AreEqual(WebViewCommon.TestUrl, _webView.Title, "Title should be same with base URL"); + } + + [Test] + [Category("P1")] + [Description("Asks the main frame to stop loading")] + [Property("SPEC", "Tizen.WebView.WebView.StopLoading M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task StopLoading_CHANGE_STATUS() + { + /* TEST CODE */ + var isCancellation = false; + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadStarted = (s, e) => { _webView.StopLoading(); }; + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(false); }; + EventHandler onLoadError = (s, e) => { + isCancellation = e.Cancellation; + tcs.TrySetResult(true); + }; + + _webView.LoadStarted += onLoadStarted; + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.TestUrl); + var result = await tcs.Task; + + _webView.LoadStarted -= onLoadStarted; + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadError should be invoked"); + Assert.IsTrue(isCancellation, "Cancellation should be true"); + } + + [Test] + [Category("P1")] + [Description("Asks the main frame to reload the current document")] + [Property("SPEC", "Tizen.WebView.WebView.Reload M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Reload_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + /* TEST CODE */ + TaskCompletionSource tcsReload = new TaskCompletionSource(false); + EventHandler onLoadFinishedReload = (s, e) => { tcsReload.TrySetResult(true); }; + EventHandler onLoadErrorReload = (s, e) => { tcsReload.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedReload; + _webView.LoadError += onLoadErrorReload; + + _webView.Reload(); + result = await tcsReload.Task; + + _webView.LoadFinished -= onLoadFinishedReload; + _webView.LoadError -= onLoadErrorReload; + + Assert.IsTrue(result, "Reload method failed"); + } + + [Test] + [Category("P1")] + [Description("Asks the main frame to navigate back in history")] + [Property("SPEC", "Tizen.WebView.WebView.GoBack M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GoBack_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcsFisrt = new TaskCompletionSource(false); + EventHandler onLoadFinishedFirst = (s, e) => { tcsFisrt.TrySetResult(true); }; + EventHandler onLoadErrorFirst = (s, e) => { tcsFisrt.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedFirst; + _webView.LoadError += onLoadErrorFirst; + + _webView.LoadUrl(WebViewCommon.SampleHtml1); + var result = await tcsFisrt.Task; + + _webView.LoadFinished -= onLoadFinishedFirst; + _webView.LoadError -= onLoadErrorFirst; + + Assert.IsTrue(result, "LoadUrl method failed for the first page"); + + TaskCompletionSource tcsSecond = new TaskCompletionSource(false); + EventHandler onLoadFinishedSecond = (s, e) => { tcsSecond.TrySetResult(true); }; + EventHandler onLoadErrorSecond = (s, e) => { tcsSecond.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedSecond; + _webView.LoadError += onLoadErrorSecond; + + _webView.LoadUrl(WebViewCommon.SampleHtml2); + result = await tcsSecond.Task; + + _webView.LoadFinished -= onLoadFinishedSecond; + _webView.LoadError -= onLoadErrorSecond; + + Assert.IsTrue(result, "LoadUrl method failed for the second page"); + + /* TEST CODE */ + TaskCompletionSource tcsGoBack = new TaskCompletionSource(false); + EventHandler onLoadFinishedGoBack = (s, e) => { tcsGoBack.TrySetResult(true); }; + EventHandler onLoadErrorGoBack = (s, e) => { tcsGoBack.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedGoBack; + _webView.LoadError += onLoadErrorGoBack; + + _webView.GoBack(); + result = await tcsGoBack.Task; + + _webView.LoadFinished -= onLoadFinishedGoBack; + _webView.LoadError -= onLoadErrorGoBack; + + Assert.IsTrue(result, "GoBack method failed"); + Assert.AreEqual(WebViewCommon.SampleHtml1, _webView.Url, "URL should be same with the first page"); + } + + [Test] + [Category("P1")] + [Description("Asks the main frame to navigate forward in history")] + [Property("SPEC", "Tizen.WebView.WebView.GoForward M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task GoForward_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcsFisrt = new TaskCompletionSource(false); + EventHandler onLoadFinishedFirst = (s, e) => { tcsFisrt.TrySetResult(true); }; + EventHandler onLoadErrorFirst = (s, e) => { tcsFisrt.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedFirst; + _webView.LoadError += onLoadErrorFirst; + + _webView.LoadUrl(WebViewCommon.SampleHtml1); + var result = await tcsFisrt.Task; + + _webView.LoadFinished -= onLoadFinishedFirst; + _webView.LoadError -= onLoadErrorFirst; + + Assert.IsTrue(result, "LoadUrl method failed for the first page"); + + TaskCompletionSource tcsSecond = new TaskCompletionSource(false); + EventHandler onLoadFinishedSecond = (s, e) => { tcsSecond.TrySetResult(true); }; + EventHandler onLoadErrorSecond = (s, e) => { tcsSecond.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedSecond; + _webView.LoadError += onLoadErrorSecond; + + _webView.LoadUrl(WebViewCommon.SampleHtml2); + result = await tcsSecond.Task; + + _webView.LoadFinished -= onLoadFinishedSecond; + _webView.LoadError -= onLoadErrorSecond; + + Assert.IsTrue(result, "LoadUrl method failed for the second page"); + + TaskCompletionSource tcsGoBack = new TaskCompletionSource(false); + EventHandler onLoadFinishedGoBack = (s, e) => { tcsGoBack.TrySetResult(true); }; + EventHandler onLoadErrorGoBack = (s, e) => { tcsGoBack.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedGoBack; + _webView.LoadError += onLoadErrorGoBack; + + _webView.GoBack(); + result = await tcsGoBack.Task; + + _webView.LoadFinished -= onLoadFinishedGoBack; + _webView.LoadError -= onLoadErrorGoBack; + + Assert.IsTrue(result, "GoBack method failed"); + + /* TEST CODE */ + TaskCompletionSource tcsGoForward = new TaskCompletionSource(false); + EventHandler onLoadFinishedGoForward = (s, e) => { tcsGoForward.TrySetResult(true); }; + EventHandler onLoadErrorGoForward = (s, e) => { tcsGoForward.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedGoForward; + _webView.LoadError += onLoadErrorGoForward; + + _webView.GoForward(); + result = await tcsGoForward.Task; + + _webView.LoadFinished -= onLoadFinishedGoForward; + _webView.LoadError -= onLoadErrorGoForward; + + Assert.IsTrue(result, "GoForward method failed"); + Assert.AreEqual(WebViewCommon.SampleHtml2, _webView.Url, "URL should be same with the second page"); + } + + [Test] + [Category("P1")] + [Description("Checks whether it is possible to navigate backwards one item in history")] + [Property("SPEC", "Tizen.WebView.WebView.CanGoBack M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task CanGoBack_RETURN_VALUE() + { + /* PRECONDITION */ + TaskCompletionSource tcsFisrt = new TaskCompletionSource(false); + EventHandler onLoadFinishedFirst = (s, e) => { tcsFisrt.TrySetResult(true); }; + EventHandler onLoadErrorFirst = (s, e) => { tcsFisrt.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedFirst; + _webView.LoadError += onLoadErrorFirst; + + _webView.LoadUrl(WebViewCommon.SampleHtml1); + var result = await tcsFisrt.Task; + + _webView.LoadFinished -= onLoadFinishedFirst; + _webView.LoadError -= onLoadErrorFirst; + + Assert.IsTrue(result, "LoadUrl method failed for the first page"); + + TaskCompletionSource tcsSecond = new TaskCompletionSource(false); + EventHandler onLoadFinishedSecond = (s, e) => { tcsSecond.TrySetResult(true); }; + EventHandler onLoadErrorSecond = (s, e) => { tcsSecond.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedSecond; + _webView.LoadError += onLoadErrorSecond; + + _webView.LoadUrl(WebViewCommon.SampleHtml2); + result = await tcsSecond.Task; + + _webView.LoadFinished -= onLoadFinishedSecond; + _webView.LoadError -= onLoadErrorSecond; + + Assert.IsTrue(result, "LoadUrl method failed for the second page"); + + /* TEST CODE */ + var canGoBack = _webView.CanGoBack(); + Assert.IsInstanceOf(canGoBack, "CanGoBack should return object boolean"); + Assert.IsTrue(canGoBack, "CanGoBack should return valid value"); + } + + [Test] + [Category("P1")] + [Description("Checks whether it is possible to navigate forwards one item in history")] + [Property("SPEC", "Tizen.WebView.WebView.CanGoForward M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task CanGoForward_RETURN_VALUE() + { + /* PRECONDITION */ + TaskCompletionSource tcsFisrt = new TaskCompletionSource(false); + EventHandler onLoadFinishedFirst = (s, e) => { tcsFisrt.TrySetResult(true); }; + EventHandler onLoadErrorFirst = (s, e) => { tcsFisrt.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedFirst; + _webView.LoadError += onLoadErrorFirst; + + _webView.LoadUrl(WebViewCommon.SampleHtml1); + var result = await tcsFisrt.Task; + + _webView.LoadFinished -= onLoadFinishedFirst; + _webView.LoadError -= onLoadErrorFirst; + + Assert.IsTrue(result, "LoadUrl method failed for the first page"); + + TaskCompletionSource tcsSecond = new TaskCompletionSource(false); + EventHandler onLoadFinishedSecond = (s, e) => { tcsSecond.TrySetResult(true); }; + EventHandler onLoadErrorSecond = (s, e) => { tcsSecond.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedSecond; + _webView.LoadError += onLoadErrorSecond; + + _webView.LoadUrl(WebViewCommon.SampleHtml2); + result = await tcsSecond.Task; + + _webView.LoadFinished -= onLoadFinishedSecond; + _webView.LoadError -= onLoadErrorSecond; + + Assert.IsTrue(result, "LoadUrl method failed for the second page"); + + TaskCompletionSource tcsGoBack = new TaskCompletionSource(false); + EventHandler onLoadFinishedGoBack = (s, e) => { tcsGoBack.TrySetResult(true); }; + EventHandler onLoadErrorGoBack = (s, e) => { tcsGoBack.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinishedGoBack; + _webView.LoadError += onLoadErrorGoBack; + + _webView.GoBack(); + result = await tcsGoBack.Task; + + _webView.LoadFinished -= onLoadFinishedGoBack; + _webView.LoadError -= onLoadErrorGoBack; + + Assert.IsTrue(result, "GoBack method failed"); + + /* TEST CODE */ + var canGoForward = _webView.CanGoForward(); + Assert.IsInstanceOf(canGoForward, "CanGoForward should return object boolean"); + Assert.IsTrue(canGoForward, "CanGoForward should return valid value"); + } + + [Test] + [Category("P1")] + [Description("Injects the supplied javascript message handler into the view")] + [Property("SPEC", "Tizen.WebView.WebView.AddJavaScriptMessageHandler M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MR, MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task AddJavaScriptMessageHandler_RETURN_VALUE_CHANGE_STATUS() + { + /* TEST CODE */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + TaskCompletionSource tcsForCallback = new TaskCompletionSource(false); + JavaScriptMessageHandler handler = (message) => + { + if (message.Name.Equals("MyJavaScriptInterfaceForCommon") && message.GetBodyAsString().Equals("Test message")) + { + tcsForCallback.TrySetResult(true); + } + tcsForCallback.TrySetResult(false); + }; + var ret = _webView.AddJavaScriptMessageHandler("MyJavaScriptInterfaceForCommon", handler); + Assert.IsInstanceOf(ret, "AddJavaScriptMessageHandler should return object bool"); + Assert.IsTrue(ret, "AddJavaScriptMessageHandler method failed"); + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + _webView.Eval("callForCommon();"); + result = await tcsForCallback.Task; + + Assert.IsTrue(result, "JavaScript handler should be invoked with valid name"); + } + + [Test] + [Category("P1")] + [Description("Requests the execution of given name and result to the JavaScript runtime")] + [Property("SPEC", "Tizen.WebView.WebView.EvalWithResult M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task EvalWithResult_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.AddJavaScriptInterfaceSampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + /* TEST CODE */ + try + { + _webView.EvalWithResult("sendResult", "Result"); + } + catch (Exception e) + { + Assert.True(false, e.Message); + } + } + + [Test] + [Category("P1")] + [Description("Requests the execution of the given script")] + [Property("SPEC", "Tizen.WebView.WebView.Eval M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task Eval_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + /* TEST CODE */ + try + { + _webView.Eval(WebViewCommon.TestScript); + } + catch (Exception e) + { + Assert.True(false, e.Message); + } + } + + [Test] + [Category("P1")] + [Description("Requests to set or unset a view as the currently focused one")] + [Property("SPEC", "Tizen.WebView.WebView.SetFocus M")] + [Property("SPEC_URL", "-")] + [Property("CRITERIA", "MCST")] + [Property("AUTHOR", "Youngha Jung, yh106.jung@samsung.com")] + public async Task SetFocus_CHANGE_STATUS() + { + /* PRECONDITION */ + TaskCompletionSource tcs = new TaskCompletionSource(false); + EventHandler onLoadFinished = (s, e) => { tcs.TrySetResult(true); }; + EventHandler onLoadError = (s, e) => { tcs.TrySetResult(false); }; + + _webView.LoadFinished += onLoadFinished; + _webView.LoadError += onLoadError; + + _webView.LoadUrl(WebViewCommon.SampleHtml); + var result = await tcs.Task; + + _webView.LoadFinished -= onLoadFinished; + _webView.LoadError -= onLoadError; + + Assert.IsTrue(result, "LoadUrl method failed"); + + /* TEST CODE */ + _webView.SetFocus(true); + Assert.IsTrue(_webView.HasFocus, "Fail to set focus as true"); + _webView.SetFocus(false); + Assert.IsFalse(_webView.HasFocus, "Fail to set focus as false"); + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/testcase/support/WebViewCommon.cs b/tct-suite-vs/Tizen.WebView.Tests/testcase/support/WebViewCommon.cs new file mode 100755 index 000000000..93599c387 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/testcase/support/WebViewCommon.cs @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018 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 ElmSharp; + +namespace Tizen.WebView.Tests +{ + internal static class WebViewCommon + { + public const string SampleHtml = "file:///opt/usr/home/owner/share/res/sample.html"; + public const string SampleHtml1 = "file:///opt/usr/home/owner/share/res/sample_1.html"; + public const string SampleHtml2 = "file:///opt/usr/home/owner/share/res/sample_2.html"; + public const string AddJavaScriptInterfaceSampleHtml = "file:///opt/usr/home/owner/share/res/add_js_interface_sample.html"; + public const string SampleHtmlTitle = "Testing Sample Page"; + + public const string TestUrl = "https://www.tizen.org/"; + public const string TestUrlForError = "http://page_that_does_not_exist/"; + public const string TestUserAgent = "Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/538.1 (KHTML, like Gecko) Version/5.0 Safari/538.1"; + public const string TestHtml = ""; + public const string TestScript = "document.getElementById('getParaContent').innerHTML"; + + private static Window _instance; + + public static Window GetMainWindow() + { + if (_instance == null) + { + _instance = new Window("WebView Auto Tests"); + } + return _instance; + } + } +} diff --git a/tct-suite-vs/Tizen.WebView.Tests/tizen-manifest.xml b/tct-suite-vs/Tizen.WebView.Tests/tizen-manifest.xml new file mode 100755 index 000000000..0be9c5fa4 --- /dev/null +++ b/tct-suite-vs/Tizen.WebView.Tests/tizen-manifest.xml @@ -0,0 +1,15 @@ + + + + + Tizen.WebView.Tests.png + + + + + + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/internet + + + -- 2.34.1