csharp: fix some unit tests that rely on garbage collection

Summary:
Fix unit tests `TestEoInherit.inherited_collected` and
`TestFunctionPointers.set_callback_inherited_called_from_c`.

Iterate through garbage collection and EFL main loop more times to ensure that
allocated objects are really collected.

Also expand the test utility method `CollectAndIterate` to receive the number of
times to call the whole cleaning iteration process (not only the garbage
collection).

Test Plan: `meson test`

Reviewers: lauromoura

Reviewed By: lauromoura

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D9271
This commit is contained in:
Vitor Sousa 2019-07-12 17:09:41 -03:00
parent b799ba1a10
commit c3c81263fd
3 changed files with 10 additions and 9 deletions

View File

@ -120,7 +120,7 @@ class TestEoInherit
public static void inherited_collected() public static void inherited_collected()
{ {
var wref = CreateCollectableInherited(); var wref = CreateCollectableInherited();
Test.CollectAndIterate(); Test.CollectAndIterate(300, 10);
Test.AssertNull(wref.Target); Test.AssertNull(wref.Target);
} }

View File

@ -171,9 +171,7 @@ class TestFunctionPointers
// Should release the handle to the wrapper allocated when calling set_callback from C. // Should release the handle to the wrapper allocated when calling set_callback from C.
obj.SetCallback(twice); obj.SetCallback(twice);
GC.Collect(); Test.CollectAndIterate(300, 10);
GC.WaitForPendingFinalizers();
Efl.App.AppMain.Iterate();
Test.Assert(obj.set_called, "set_callback override must have been called"); Test.Assert(obj.set_called, "set_callback override must have been called");
Test.Assert(!obj.invoke_called, "invoke_callback must not have been called"); Test.Assert(!obj.invoke_called, "invoke_callback must not have been called");

View File

@ -200,14 +200,17 @@ public static class Test
/// <summary>Runs a number of garbage collections and iterate the main loop. /// <summary>Runs a number of garbage collections and iterate the main loop.
/// The iteration is needed to make sure objects collected in the GC thread /// The iteration is needed to make sure objects collected in the GC thread
/// are efl_unref'd in the main thread.</summary> /// are efl_unref'd in the main thread.</summary>
public static void CollectAndIterate(int iterations=1000) public static void CollectAndIterate(int iterations=1000, int global_iterations=1)
{ {
for (int i = 0; i < iterations; i++) for (int g = 0; g < global_iterations; ++g)
{ {
System.GC.Collect(); for (int i = 0; i < iterations; ++i)
{
System.GC.Collect();
}
System.GC.WaitForPendingFinalizers();
Efl.App.AppMain.Iterate();
} }
System.GC.WaitForPendingFinalizers();
Efl.App.AppMain.Iterate();
} }
} }