private void ProcessQueue(TestEventsCollector collector)
        {
            if (!collector.DelayedEvents.Any())
            {
                return;
            }

            foreach (var myEvent in collector.DelayedEvents)
            {
                switch (myEvent.myType)
                {
                case EventType.RunFinished:
                    RunFinished(myUnitTestLaunch);
                    break;

                case EventType.TestFinished:
                    TestFinished(myUnitTestLaunch, GetTestResult(myEvent.Event));
                    break;

                case EventType.TestStarted:
                    var tResult = new TestResult(myEvent.Event.myID, string.Empty, 0, Status.Running, myEvent.Event.myParentID);
                    TestStarted(myUnitTestLaunch, tResult);
                    break;
                }
            }

            collector.Clear();
        }
        private static void ProcessQueue(Type data, UnitTestLaunch unitTestLaunch)
        {
            if (!unitTestLaunch.IsBound)
            {
                return;
            }

            var baseType = data.BaseType;

            if (baseType == null)
            {
                return;
            }
            var instance = baseType.GetProperty("instance");

            if (instance == null)
            {
                return;
            }
            var instanceVal = instance.GetValue(null, new object[] {});

            var listField = data.GetField("events");

            if (listField == null)
            {
                return;
            }
            var list = listField.GetValue(instanceVal);

            var events = (IEnumerable)list;

            foreach (var ev in events)
            {
                var type         = (int)ev.GetType().GetField("type").GetValue(ev);
                var id           = (string)ev.GetType().GetField("id").GetValue(ev);
                var assemblyName = (string)ev.GetType().GetField("assemblyName").GetValue(ev);
                var output       = (string)ev.GetType().GetField("output").GetValue(ev);
                var resultState  = (int)ev.GetType().GetField("testStatus").GetValue(ev);
                var duration     = (double)ev.GetType().GetField("duration").GetValue(ev);
                var parentId     = (string)ev.GetType().GetField("parentId").GetValue(ev);

                switch (type)
                {
                case 0: // TestStarted
                {
                    var tResult = new TestResult(id, assemblyName, string.Empty, 0, Status.Running, parentId);
                    TestStarted(unitTestLaunch, tResult);
                    break;
                }

                case 1: // TestFinished
                {
                    var status = GetStatus(new ResultState((TestStatus)resultState));

                    var testResult = new TestResult(id, assemblyName, output, (int)duration,
                                                    status, parentId);
                    TestFinished(unitTestLaunch, testResult);
                    break;
                }

                case 2: // RunFinished
                {
                    var runResult = new RunResult((TestStatus)resultState == TestStatus.Passed);
                    RunFinished(unitTestLaunch, runResult);
                    break;
                }

                case 3: // RunStarted
                {
                    unitTestLaunch.RunStarted.Value = true;
                    break;
                }

                default:
                {
                    ourLogger.Error("Unexpected TestEvent type.");
                    break;
                }
                }
            }

            var clearMethod = data.GetMethod("Clear");

            clearMethod?.Invoke(instanceVal, new object[] {});
        }
 public static void TestFinished(UnitTestLaunch launch, TestResult testResult)
 {
     launch.TestResult(testResult);
 }
 public static void TestStarted(UnitTestLaunch launch, TestResult testResult)
 {
     launch.TestResult(testResult);
 }
Beispiel #5
0
        private void TryLaunchUnitTestsInAssembly(string[] testNames)
        {
            try
            {
                var assemblies         = AppDomain.CurrentDomain.GetAssemblies();
                var testEditorAssembly = assemblies
                                         .FirstOrDefault(assembly => assembly.GetName().Name.Equals("UnityEditor.TestRunner"));
                var testEngineAssembly = assemblies
                                         .FirstOrDefault(assembly => assembly.GetName().Name.Equals("UnityEngine.TestRunner"));

                if (testEditorAssembly == null || testEngineAssembly == null)
                {
                    ourLogger.Verbose(
                        "Could not find UnityEditor.TestRunner or UnityEngine.TestRunner assemblies in current AppDomain");
                    return;
                }

                var launcherTypeString = "UnityEditor.TestTools.TestRunner.EditModeLauncher";
                var launcherType       = testEditorAssembly.GetType(launcherTypeString);
                if (launcherType == null)
                {
                    string testEditorAssemblyProperties = testEditorAssembly.GetTypes().Select(a => a.Name).Aggregate((a, b) => a + ", " + b);
                    throw new NullReferenceException($"Could not find {launcherTypeString} among {testEditorAssemblyProperties}");
                }

                var filterType = testEngineAssembly.GetType("UnityEngine.TestTools.TestRunner.GUI.TestRunnerFilter");
                if (filterType == null)
                {
                    string testEngineAssemblyProperties = testEngineAssembly.GetTypes().Select(a => a.Name).Aggregate((a, b) => a + ", " + b);
                    throw new NullReferenceException($"Could not find \"UnityEngine.TestTools.TestRunner.GUI.TestRunnerFilter\" among {testEngineAssemblyProperties}");
                }

                var filter    = Activator.CreateInstance(filterType);
                var fieldInfo = filter.GetType().GetField("testNames", BindingFlags.Instance | BindingFlags.Public);
                fieldInfo = fieldInfo ?? filter.GetType().GetField("names", BindingFlags.Instance | BindingFlags.Public);
                if (fieldInfo == null)
                {
                    ourLogger.Verbose("Could not find testNames field via reflection");
                    return;
                }
                fieldInfo.SetValue(filter, testNames);

                object launcher;
                if (UnityUtils.UnityVersion >= new Version(2018, 1))
                {
                    var enumType = testEngineAssembly.GetType("UnityEngine.TestTools.TestPlatform");
                    if (enumType == null)
                    {
                        ourLogger.Verbose("Could not find TestPlatform field via reflection");
                        return;
                    }

                    var assemblyProviderType = testEditorAssembly.GetType("UnityEditor.TestTools.TestRunner.TestInEditorTestAssemblyProvider");
                    var testPlatformVal      = 2; // All = 255, // 0xFF, EditMode = 2, PlayMode = 4,
                    if (assemblyProviderType != null)
                    {
                        var assemblyProvider = Activator.CreateInstance(assemblyProviderType,
                                                                        BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null,
                                                                        new[] { Enum.ToObject(enumType, testPlatformVal) }, null);
                        ourLogger.Log(LoggingLevel.INFO, assemblyProvider.ToString());
                        launcher = Activator.CreateInstance(launcherType,
                                                            BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                                                            null, new[] { filter, assemblyProvider },
                                                            null);
                    }
                    else
                    {
                        try
                        {
                            launcher = Activator.CreateInstance(launcherType,
                                                                BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                                                                null, new[] { filter, Enum.ToObject(enumType, testPlatformVal) },
                                                                null);
                        }
                        catch (Exception) // Unity 2019.2+ with package com.unity.test-framework v 1.0.18 and 1.1.0 ctor was changed. in v 1.1.1 it was added back for compatibility
                        {
                            var apiFilterType      = testEditorAssembly.GetType("UnityEditor.TestTools.TestRunner.Api.Filter");
                            var apiFilter          = Activator.CreateInstance(apiFilterType);
                            var testNamesFieldInfo = apiFilter.GetType().GetField("testNames");
                            testNamesFieldInfo.SetValue(apiFilter, testNames);
                            var array = Array.CreateInstance(apiFilterType, 1);
                            array.SetValue(apiFilter, 0);
                            launcher = Activator.CreateInstance(launcherType, array, Enum.ToObject(enumType, testPlatformVal));
                        }
                    }
                }
                else
                {
                    launcher = Activator.CreateInstance(launcherType,
                                                        BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                                                        null, new[] { filter },
                                                        null);
                }

                var runnerField = launcherType.GetField("m_EditModeRunner", BindingFlags.Instance | BindingFlags.NonPublic);
                if (runnerField == null)
                {
                    ourLogger.Verbose("Could not find runnerField via reflection");
                    return;
                }

                var runner = runnerField.GetValue(launcher);
                SupportAbort(runner);

                if (!AdviseTestStarted(runner, "m_TestStartedEvent", test =>
                {
                    if (!(test is TestMethod))
                    {
                        return;
                    }
                    ourLogger.Verbose("TestStarted : {0}", test.FullName);
                    var tResult = new TestResult(TestEventsSender.GetIdFromNUnitTest(test), test.Method.TypeInfo.Assembly.GetName().Name, string.Empty, 0, Status.Running,
                                                 TestEventsSender.GetIdFromNUnitTest(test.Parent));
                    TestEventsSender.TestStarted(myLaunch, tResult);
                }))
                {
                    return;
                }

                if (!AdviseTestFinished(runner, "m_TestFinishedEvent", result =>
                {
                    if (!(result.Test is TestMethod))
                    {
                        return;
                    }

                    TestEventsSender.TestFinished(myLaunch, TestEventsSender.GetTestResult(result));
                }))
                {
                    return;
                }

                if (!AdviseSessionFinished(runner, "m_RunFinishedEvent", result =>
                {
                    TestEventsSender.RunFinished(myLaunch);
                }))
                {
                    return;
                }

                var runMethod = launcherType.GetMethod("Run", BindingFlags.Instance | BindingFlags.Public);
                if (runMethod == null)
                {
                    ourLogger.Verbose("Could not find runMethod via reflection");
                    return;
                }

                //run!
                runMethod.Invoke(launcher, null);
            }
            catch (Exception e)
            {
                ourLogger.Error(e, "Exception while launching Unity Editor tests.");
            }
        }
Beispiel #6
0
        private void TryLaunchUnitTestsInAssembly(string[] testNames)
        {
            try
            {
                var assemblies         = AppDomain.CurrentDomain.GetAssemblies();
                var testEditorAssembly = assemblies
                                         .FirstOrDefault(assembly => assembly.GetName().Name.Equals("UnityEditor.TestRunner"));
                var testEngineAssembly = assemblies
                                         .FirstOrDefault(assembly => assembly.GetName().Name.Equals("UnityEngine.TestRunner"));

                if (testEditorAssembly == null || testEngineAssembly == null)
                {
                    ourLogger.Verbose(
                        "Could not find UnityEditor.TestRunner or UnityEngine.TestRunner assemblies in current AppDomain");
                    return;
                }

                var launcherTypeString = myLaunch.TestMode == TestMode.Edit ?
                                         "UnityEditor.TestTools.TestRunner.EditModeLauncher" :
                                         "UnityEditor.TestTools.TestRunner.PlaymodeLauncher";
                var launcherType = testEditorAssembly.GetType(launcherTypeString);
                if (launcherType == null)
                {
                    string testEditorAssemblyProperties = testEditorAssembly.GetTypes().Select(a => a.Name).Aggregate((a, b) => a + ", " + b);
                    throw new NullReferenceException($"Could not find {launcherTypeString} among {testEditorAssemblyProperties}");
                }

                var filterType = testEngineAssembly.GetType("UnityEngine.TestTools.TestRunner.GUI.TestRunnerFilter");
                if (filterType == null)
                {
                    string testEngineAssemblyProperties = testEngineAssembly.GetTypes().Select(a => a.Name).Aggregate((a, b) => a + ", " + b);
                    throw new NullReferenceException($"Could not find \"UnityEngine.TestTools.TestRunner.GUI.TestRunnerFilter\" among {testEngineAssemblyProperties}");
                }

                var filter    = Activator.CreateInstance(filterType);
                var fieldInfo = filter.GetType().GetField("testNames", BindingFlags.Instance | BindingFlags.Public);
                fieldInfo = fieldInfo ?? filter.GetType().GetField("names", BindingFlags.Instance | BindingFlags.Public);
                if (fieldInfo == null)
                {
                    ourLogger.Verbose("Could not find testNames field via reflection");
                    return;
                }
                fieldInfo.SetValue(filter, testNames);

                // todo: restore, once Unity fixes UnityEngine.TestTools.TestRunner.GUI.TestRunnerFilter.BuildNUnitFilter
                // Currently assemblyName filters are added with OR to testNames filers
//        var assemblyNamesFieldInfo = filter.GetType().GetField("assemblyNames", BindingFlags.Instance | BindingFlags.Public);
//        if (assemblyNamesFieldInfo == null)
//        {
//          ourLogger.Warn("Could not find assemblyNames field via reflection");
//          return;
//        }
//        assemblyNamesFieldInfo.SetValue(filter, new[] { assemblyName });

                if (myLaunch.TestMode == TestMode.Play)
                {
                    PlayModeSupport.PlayModeLauncherRun(filter, launcherType, testEditorAssembly, testEngineAssembly);
                }
                else
                {
                    object launcher;
                    if (UnityUtils.UnityVersion >= new Version(2018, 1))
                    {
                        var enumType = testEngineAssembly.GetType("UnityEngine.TestTools.TestPlatform");
                        if (enumType == null)
                        {
                            ourLogger.Verbose("Could not find TestPlatform field via reflection");
                            return;
                        }

                        var assemblyProviderType = testEditorAssembly.GetType("UnityEditor.TestTools.TestRunner.TestInEditorTestAssemblyProvider");
                        var testPlatformVal      = 2; // All = 255, // 0xFF, EditMode = 2, PlayMode = 4,
                        if (assemblyProviderType != null)
                        {
                            var assemblyProvider = Activator.CreateInstance(assemblyProviderType,
                                                                            BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null,
                                                                            new[] { Enum.ToObject(enumType, testPlatformVal) }, null);
                            ourLogger.Log(LoggingLevel.INFO, assemblyProvider.ToString());
                            launcher = Activator.CreateInstance(launcherType,
                                                                BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                                                                null, new[] { filter, assemblyProvider },
                                                                null);
                        }
                        else
                        {
                            launcher = Activator.CreateInstance(launcherType,
                                                                BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                                                                null, new[] { filter, Enum.ToObject(enumType, testPlatformVal) },
                                                                null);
                        }
                    }
                    else
                    {
                        launcher = Activator.CreateInstance(launcherType,
                                                            BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                                                            null, new[] { filter },
                                                            null);
                    }

                    var runnerField = launcherType.GetField("m_EditModeRunner", BindingFlags.Instance | BindingFlags.NonPublic);
                    if (runnerField == null)
                    {
                        ourLogger.Verbose("Could not find runnerField via reflection");
                        return;
                    }

                    var runner = runnerField.GetValue(launcher);
                    SupportAbort(runner);

                    if (!AdviseTestStarted(runner, "m_TestStartedEvent", test =>
                    {
                        if (!(test is TestMethod))
                        {
                            return;
                        }
                        ourLogger.Verbose("TestStarted : {0}", test.FullName);
                        var tResult = new TestResult(TestEventsSender.GetIdFromNUnitTest(test), test.Method.TypeInfo.Assembly.GetName().Name, string.Empty, 0, Status.Running,
                                                     TestEventsSender.GetIdFromNUnitTest(test.Parent));
                        TestEventsSender.TestStarted(myLaunch, tResult);
                    }))
                    {
                        return;
                    }

                    if (!AdviseTestFinished(runner, "m_TestFinishedEvent", result =>
                    {
                        if (!(result.Test is TestMethod))
                        {
                            return;
                        }
                        var res = TestEventsSender.GetTestResult(result);
                        TestEventsSender.TestFinished(myLaunch, TestEventsSender.GetTestResult(res));
                    }))
                    {
                        return;
                    }

                    if (!AdviseSessionFinished(runner, "m_RunFinishedEvent", result =>
                    {
                        TestEventsSender.RunFinished(myLaunch);
                    }))
                    {
                        return;
                    }

                    var runMethod = launcherType.GetMethod("Run", BindingFlags.Instance | BindingFlags.Public);
                    if (runMethod == null)
                    {
                        ourLogger.Verbose("Could not find runMethod via reflection");
                        return;
                    }

                    //run!
                    runMethod.Invoke(launcher, null);
                }
            }
            catch (Exception e)
            {
                ourLogger.Error(e, "Exception while launching Unity Editor tests.");
            }
        }