public IEnumerable <InvokeRequest> IterateDataStreamCalls(string dataStreamFile) { using (StreamReader reader = new StreamReader(dataStreamFile)) { Dictionary <int, ReplaySession> sessions = new Dictionary <int, ReplaySession>(); ReplaySession currentSession = null; string line; while ((line = reader.ReadLine()) != null) { var invokeRequest = LoadStreamRow(sessions, ref currentSession, line); if (invokeRequest != null) { yield return(invokeRequest); } } } }
public InvokeRequest LoadStreamRow(Dictionary <int, ReplaySession> sessions, ref ReplaySession currentSession, string line) { if (!string.IsNullOrEmpty(line)) { string[] parts = line.Split('\t'); int remoteHostId; if (int.TryParse(parts[1], out remoteHostId)) { string timeStr = parts[0]; TimeSpan time = TimeSpan.Parse(timeStr); string direction = parts[2]; string message = parts[3]; if (message.StartsWith(DataStreamLogger.SessionCreatedTag)) { ReplaySession session = new ReplaySession(streamLogger.CommunicationSource, remoteHostId, $"Replay session {remoteHostId} - {time}"); sessions.Add(session.SessionId, session); currentSession = session; } else if (message.StartsWith(DataStreamLogger.SessionTerminatedTag)) { } else if (!message.StartsWith(DataStreamLogger.LoggerStoppedTag)) { if (currentSession == null) { if (!sessions.TryGetValue(remoteHostId, out currentSession)) { log.Error("ReplayError: Could not find session row in source stream file for session ID " + remoteHostId); } } else if (currentSession.SessionId != remoteHostId) { currentSession = sessions[remoteHostId]; } MessageType msgType = (MessageType)short.Parse(GetJsonSimpleStringValue(message, nameof(IGenericMessage.Type))); long requestId = long.Parse(GetJsonSimpleStringValue(message, nameof(IGenericMessage.RequestId))); string targetInterface = GetJsonSimpleStringValue(message, nameof(IGenericMessage.Target)); string methodName = GetJsonSimpleStringValue(message, nameof(IGenericMessage.Name)); //string payload = GetPayloadFromMessageString(message); bool isReceive = direction == ReceiveTag; if (isReceive) { if (msgType == MessageType.MethodInvokeRequest || msgType == MessageType.AsyncMethodInvokeRequest) { InvokeRequest invokeReq = new InvokeRequest { TargetInterfaceName = targetInterface, TargetMethodName = methodName, //Payload = payload, RequestId = requestId, Session = currentSession, MessageData = message }; return(invokeReq); } } // else: do not replay own sent calls } } else { log.Error($"ReplayError: invalid row error! Line: \"{line}\""); } } return(null); }