efl/src/tests/efl_mono/Main.cs

124 lines
4.2 KiB
C#
Raw Normal View History

/*
* Copyright 2019 by its authors. See AUTHORS.
*
* 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 System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Linq;
class TestMain
{
static Type[] GetTestCases(String name="")
{
return Assembly.GetExecutingAssembly().GetTypes().Where(t => String.Equals(t.Namespace, "TestSuite", StringComparison.Ordinal) &&
t.Name.StartsWith("Test") &&
t.Name.Contains(name)).ToArray();
}
static int Main(string[] args)
{
if (Environment.GetEnvironmentVariable("ELM_ENGINE") == null)
Environment.SetEnvironmentVariable("ELM_ENGINE", "buffer");
Efl.All.Init(Efl.Csharp.Components.Ui);
bool pass = true;
String ckRunSuite = Environment.GetEnvironmentVariable("CK_RUN_SUITE");
String ckRunCase = Environment.GetEnvironmentVariable("CK_RUN_CASE");
if (ckRunSuite != null && !ckRunSuite.Equals("mono"))
return 0;
if (ckRunCase == null)
ckRunCase = String.Empty;
Console.WriteLine("[ START SUITE ] " + ckRunSuite);
var cases= GetTestCases(ckRunCase);
foreach(var testCase in cases)
{
var localTestCases = testCase.GetMethods(BindingFlags.Static | BindingFlags.Public);
var setUp = Array.Find(localTestCases, m => String.Equals(m.Name, "SetUp", StringComparison.Ordinal));
var tearDown = Array.Find(localTestCases, m => String.Equals(m.Name, "TearDown", StringComparison.Ordinal));
foreach(var localTestCase in localTestCases)
{
if (localTestCase == setUp || localTestCase == tearDown)
continue;
// Cleanup garbage collector and job queue
Test.CollectAndIterate(1);
Console.WriteLine("[ RUN ] " + testCase.Name + "." + localTestCase.Name);
bool caseResult = true;
if (setUp != null)
{
try
{
setUp.Invoke(null, null);
}
catch (Exception e)
{
pass = false;
caseResult = false;
Console.WriteLine("[ ERROR ] SetUp fail: " + e.InnerException.ToString());
}
}
if (caseResult)
{
try
{
localTestCase.Invoke(null, null);
}
catch (Exception e)
{
pass = false;
caseResult = false;
Console.WriteLine("[ ERROR ] " + e.InnerException.ToString());
}
}
if (caseResult && tearDown != null)
{
try
{
tearDown.Invoke(null, null);
}
catch (Exception e)
{
pass = false;
caseResult = false;
Console.WriteLine("[ ERROR ] TearDown failed: " + e.InnerException.ToString());
}
}
Console.WriteLine("[ " + (caseResult ? "PASS" : "FAIL") + " ] " + testCase.Name + "." + localTestCase.Name);
}
}
Console.WriteLine("[ END SUITE ] " + ckRunSuite);
efl-csharp: fix resource deallocation causing errors everywhere Summary: This commit mainly fixes errors caused by deallocating resources in the garbage collector thread. Using `ecore_main_loop_thread_safe_call_async` to queue resource deallocation in the main thread seems to solve it. Also, some `efl_ref` calls are added in places they were missing, mainly objects that unref in the destructor thus taking ownership if efl_ref is not called. Also fix improper resource deallocation in tests that were causing it to crash, enabling it to call Efl.All.Shutdown again. This allocation and the deallocation process was moved from the Eo class constructor to static class methods that are called in the test 'set up' and 'tear down' methods. Queuing resource deallocation in the main thread make it mandatory that tests call `Efl.App.AppMain.Iterate()` if they want to check proper resource deallocation (like TestFunctionPointers.set_callback_inherited_called_from_c). Extras: Remove duplicated declaration of 'eflcustomexportsmono' in meson in order to fix some linking problems. Remove some unused code around deallocation functions that had to be reworked. Object allocation is now supplied with the call site information it expects (file name and line for _efl_add_start). Depends on D8550 Test Plan: meson test Reviewers: felipealmeida, lauromoura, cedric, segfaultxavi Reviewed By: lauromoura Subscribers: segfaultxavi Tags: #efl_language_bindings, #do_not_merge Differential Revision: https://phab.enlightenment.org/D8431
2019-04-05 15:57:29 -07:00
Efl.All.Shutdown();
if (!pass)
return -1;
return 0;
}
}