148 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			148 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								#if TEST_FRAMEWORK
							 | 
						||
| 
								 | 
							
								using System;
							 | 
						||
| 
								 | 
							
								using System.Reflection;
							 | 
						||
| 
								 | 
							
								using UnityEditor;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Packages.Rider.Editor.UnitTesting
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  internal class SyncTestRunEventsHandler : ScriptableSingleton<SyncTestRunEventsHandler>
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    [SerializeField] private string m_SessionId;
							 | 
						||
| 
								 | 
							
								    [SerializeField] private string m_HandlerCodeBase;
							 | 
						||
| 
								 | 
							
								    [SerializeField] private string m_HandlerTypeName;
							 | 
						||
| 
								 | 
							
								    [SerializeField] private string[] m_HandlerDependencies;
							 | 
						||
| 
								 | 
							
								    [SerializeField] private bool m_RunInitialized;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    private object m_Handler;
							 | 
						||
| 
								 | 
							
								    private MethodInfo m_OnSessionStartedMethodInfo;
							 | 
						||
| 
								 | 
							
								    private MethodInfo m_OnTestStartedMethodInfo;
							 | 
						||
| 
								 | 
							
								    private MethodInfo m_OnTestFinishedMethodInfo;
							 | 
						||
| 
								 | 
							
								    private MethodInfo m_OnSessionFinishedMethodInfo;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    internal void InitRun(string sessionId, string handlerCodeBase, string handlerTypeName, string[] handlerDependencies)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (PluginSettings.SelectedLoggingLevel >= LoggingLevel.TRACE)
							 | 
						||
| 
								 | 
							
								        Debug.Log("Rider Test Runner: initializing sync callbacks handler: " + 
							 | 
						||
| 
								 | 
							
								                  $"sessionId={sessionId}, " + 
							 | 
						||
| 
								 | 
							
								                  $"codeBase={handlerCodeBase}, " + 
							 | 
						||
| 
								 | 
							
								                  $"typeName={handlerTypeName}, " + 
							 | 
						||
| 
								 | 
							
								                  $"dependencies={(handlerDependencies == null ? "" : string.Join("; ", handlerDependencies))}");
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								      m_SessionId = sessionId;
							 | 
						||
| 
								 | 
							
								      m_HandlerCodeBase = handlerCodeBase;
							 | 
						||
| 
								 | 
							
								      m_HandlerTypeName = handlerTypeName;
							 | 
						||
| 
								 | 
							
								      m_HandlerDependencies = handlerDependencies;
							 | 
						||
| 
								 | 
							
								      m_RunInitialized = true;
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      CreateHandlerInstance();
							 | 
						||
| 
								 | 
							
								      SafeInvokeHandlerMethod(m_OnSessionStartedMethodInfo, Array.Empty<object>());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void OnEnable()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (m_RunInitialized)
							 | 
						||
| 
								 | 
							
								        CreateHandlerInstance();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    internal void OnTestStarted(string testId)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (m_RunInitialized)
							 | 
						||
| 
								 | 
							
								        SafeInvokeHandlerMethod(m_OnTestStartedMethodInfo, new object[] {testId});
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    internal void OnTestFinished()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (m_RunInitialized)
							 | 
						||
| 
								 | 
							
								        SafeInvokeHandlerMethod(m_OnTestFinishedMethodInfo, Array.Empty<object>());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    internal void OnRunFinished()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (!m_RunInitialized)
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      SafeInvokeHandlerMethod(m_OnSessionFinishedMethodInfo, Array.Empty<object>());
							 | 
						||
| 
								 | 
							
								      CleanUp();
							 | 
						||
| 
								 | 
							
								      m_RunInitialized = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void SafeInvokeHandlerMethod(MethodInfo methodInfo, object[] args)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        methodInfo?.Invoke(m_Handler, args);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch (Exception e)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        Debug.LogException(e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    private void CreateHandlerInstance()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        if (m_HandlerDependencies != null)
							 | 
						||
| 
								 | 
							
								          foreach (var dependency in m_HandlerDependencies)
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								            if (PluginSettings.SelectedLoggingLevel >= LoggingLevel.TRACE) 
							 | 
						||
| 
								 | 
							
								              Debug.Log($"Rider Test Runner: loading assembly from {dependency}");
							 | 
						||
| 
								 | 
							
								            Assembly.LoadFrom(dependency);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        if (PluginSettings.SelectedLoggingLevel >= LoggingLevel.TRACE)
							 | 
						||
| 
								 | 
							
								          Debug.Log($"Rider Test Runner: loading assembly from {m_HandlerCodeBase}");
							 | 
						||
| 
								 | 
							
								        var assembly = Assembly.LoadFrom(m_HandlerCodeBase);
							 | 
						||
| 
								 | 
							
								        var type = assembly.GetType(m_HandlerTypeName);
							 | 
						||
| 
								 | 
							
								        if (type == null)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          Debug.LogError($"Rider Test Runner: type '{m_HandlerTypeName}' not found in assembly '{assembly.FullName}'");
							 | 
						||
| 
								 | 
							
								          return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        if (PluginSettings.SelectedLoggingLevel >= LoggingLevel.TRACE) 
							 | 
						||
| 
								 | 
							
								          Debug.Log($"Rider Test Runner: creating instance of type '{type.AssemblyQualifiedName}'");
							 | 
						||
| 
								 | 
							
								        m_Handler = Activator.CreateInstance(type, m_SessionId);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        m_OnSessionStartedMethodInfo = type.GetMethod("OnSessionStarted", BindingFlags.Instance | BindingFlags.Public);
							 | 
						||
| 
								 | 
							
								        if (m_OnSessionStartedMethodInfo == null)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          Debug.LogError($"Rider Test Runner: OnSessionStarted method not found in type='{type.AssemblyQualifiedName}'");
							 | 
						||
| 
								 | 
							
								          return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        m_OnTestStartedMethodInfo = type.GetMethod("OnTestStarted", BindingFlags.Instance | BindingFlags.Public);
							 | 
						||
| 
								 | 
							
								        if (m_OnTestStartedMethodInfo == null)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          Debug.LogError($"Rider Test Runner: OnTestStarted method not found in type='{type.AssemblyQualifiedName}'");
							 | 
						||
| 
								 | 
							
								          return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        m_OnTestFinishedMethodInfo = type.GetMethod("OnTestFinished", BindingFlags.Instance | BindingFlags.Public);
							 | 
						||
| 
								 | 
							
								        if (m_OnTestFinishedMethodInfo == null)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          Debug.LogError($"Rider Test Runner: OnTestFinished method not found in type='{type.AssemblyQualifiedName}'");
							 | 
						||
| 
								 | 
							
								          return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        m_OnSessionFinishedMethodInfo = type.GetMethod("OnSessionFinished", BindingFlags.Instance | BindingFlags.Public);
							 | 
						||
| 
								 | 
							
								        if (m_OnSessionFinishedMethodInfo == null)
							 | 
						||
| 
								 | 
							
								          Debug.LogError($"Rider Test Runner: OnSessionFinished method not found in type='{type.AssemblyQualifiedName}'");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch (Exception e)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        Debug.LogException(e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void CleanUp()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      m_Handler = null;
							 | 
						||
| 
								 | 
							
								      m_OnSessionStartedMethodInfo = null;
							 | 
						||
| 
								 | 
							
								      m_OnSessionFinishedMethodInfo = null;
							 | 
						||
| 
								 | 
							
								      m_OnTestStartedMethodInfo = null;
							 | 
						||
| 
								 | 
							
								      m_OnTestFinishedMethodInfo = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 |