예제 #1
0
        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);
                    }
                }
            }
        }
예제 #2
0
        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);
        }