Example #1
0
    private void animatePaths(IterationContext itCtx)
    {
        int    tmp, tmp1;
        double width, prev;


        for (int i = 0; i < itCtx.pheromoneMatrix.size; ++i)
        {
            tmp = cityControler.activeCitysIndex[i];
            for (int j = i + 1; j < itCtx.pheromoneMatrix.size; ++j)
            {
                tmp1 = cityControler.activeCitysIndex[j];

                if (!pathControler.pathMatrix[tmp, tmp1])
                {
                    continue;
                }

                if (pheromons != null)
                {
                    prev = pheromons[i, j];
                }
                else
                {
                    prev = 0;
                }

                width = Mathf.Lerp((float)prev, (float)itCtx.pheromoneMatrix[i, j],
                                   (lengthOfAnimation - timeLeft) / lengthOfAnimation);

                pathControler.pathMatrix[tmp, tmp1].startWidth = (float)width;
                pathControler.pathMatrix[tmp, tmp1].endWidth   = (float)width;
            }
        }
    }
 private static Dictionary <string, string> BuildResponse(
     IterationContext context,
     string description,
     HttpRequestMessage request,
     DateTime startTime,
     DateTime endTime,
     Stopwatch timer,
     string statusCode,
     string content,
     string errorMessage = "")
 {
     return(new Dictionary <string, string>
     {
         { "WorkerIndex", context.WorkerIndex.ToString() },
         { "IterationIndex", context.IterationIndex.ToString() },
         { "Description", description },
         { "StartTime", startTime.ToLongTimeString() },
         { "EndTime", endTime.ToLongTimeString() },
         { "RequestUrl", request.RequestUri.AbsoluteUri },
         { "StatusCode", statusCode },
         { "ResponseTime", timer.ElapsedMilliseconds.ToString() },
         { "Content", content },
         { "ErrorMessage", errorMessage }
     });
 }
        public static void Run(
            IterationContext context,
            Step step,
            CancellationToken cancellationToken)
        {
            var client          = context.Environment["HttpClient"] as HttpClient;
            var httpRequestStep = step as HttpRequestsStep;
            var requestTasks    = httpRequestStep.Requests
                                  .Select(r => Task.Run(
                                              () =>
            {
                var response = HttpRequestsStepRunner.RunHttpRequest(
                    context,
                    client,
                    r.Description,
                    r.GetHttpRequest(context),
                    cancellationToken);
                var extractedContent = r.ExtractContentToEnvironment(context, response);

                return(new
                {
                    Response = response,
                    ExtractedContent = extractedContent
                });
            }))
                                  .ToArray();

            Task.WaitAll(requestTasks);

            AddContentExtractsToEnvironment(
                context,
                requestTasks
                .Select(r => r.Result.ExtractedContent));
        }
Example #4
0
 public override string GetComponentVariableName(IIteratorStackModel query, TypeHandle componentVariableType)
 {
     // TODO forward to parent if necessary
     return(query == IterationContext.Query
         ? IterationContext.GetComponentDataName(componentVariableType.Resolve(IterationContext.Stencil))
         : Parent.GetComponentVariableName(query, componentVariableType));
 }
        protected override IDictionary <string, string> GetFormParameters(IterationContext context)
        {
            var formParameters = base.GetFormParameters(context);

            formParameters.SafeAdd(RequestVerificationTokenName,
                                   context.Environment[LoadTestEnvironmentKeys.RequestVerificationToken] as string);

            return(formParameters);
        }
 private static void AddContentExtractsToEnvironment(IterationContext context, IEnumerable <IDictionary <string, object> > contentExtracts)
 {
     foreach (var contentExtract in contentExtracts)
     {
         foreach (var key in contentExtract.Keys)
         {
             context.Environment.SafeAdd(key, contentExtract[key]);
         }
     }
 }
        public override HttpRequestMessage GetHttpRequest(IterationContext context)
        {
            var request = new HttpRequestMessage
            {
                Method     = HttpMethod.Post,
                RequestUri = this.GetRequestUri(context),
                Content    = this.GetContent(context)
            };

            ModifyRequestBeforeSending(request);

            return(request);
        }
        private static HttpClient BuildClient(IterationContext context)
        {
            var handler = new HttpClientHandler
            {
                CookieContainer = new CookieContainer()
            };

            var client = new HttpClient(handler)
            {
                Timeout     = new TimeSpan(0, 20, 0),
                BaseAddress = new Uri(context.Environment[LoadTestEnvironmentKeys.BaseUrl] as string, UriKind.Absolute)
            };

            client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Firefox", "33"));
            client.DefaultRequestHeaders.Add("X-MK6LoadTest", "1");

            return(client);
        }
Example #9
0
        // TODO: Redesign validator so it uses actual handlers.

        /// <summary>
        /// Validates ILoadTest scenario correctness by executing single test iteration
        /// from ScenarioSetup to ScenarioTearDown on the same thread.
        /// Exceptions are not handled on purpose to ease problem identification while developing.
        /// </summary>
        /// <param name="scenario">ILoadTestScenario object</param>
        /// <param name="threadId">TheardId to set in TestContext</param>
        /// <param name="threadIterationId">ThreadIterationId to set in TestContext</param>
        /// <param name="globalIterationId">GlobalIterationId to set in TestContext</param>
        /// <returns>Raw result from single iteration</returns>
        public static IterationResult Validate(this IScenario scenario, int threadId = 0, int threadIterationId = 0, int globalIterationId = 0)
        {
            ExecutionTimer    timer          = new ExecutionTimer();
            ThreadSafeCounter errorsCounter  = new ThreadSafeCounter();
            GlobalCounters    globalCounters = new GlobalCounters(errorsCounter, new MockedIdGenerator(globalIterationId));
            IIterationControl context        = new IterationContext(threadId, timer);

            ScenarioHandler handler = new ScenarioHandler(globalCounters, new MockedIdGenerator(threadIterationId), scenario, context);

            timer.Start();

            handler.Init();
            handler.PrepareNext();
            handler.Execute();

            IterationResult result = new IterationResult(context, new WorkerThreadStats());

            handler.Cleanup();

            timer.Stop();

            return(result);
        }
Example #10
0
    public IEnumerator waitForIterCtx()
    {
        IterationContext iterCtx = null;

        while (true)
        {
            lock (iterations)
            {
                if (iterations.Count > 0)
                {
                    iterCtx = iterations.Dequeue();
                }
            }

            if (iterCtx != null)
            {
                StartCoroutine(animationControler.animateIterCtx(iterCtx));
                yield break;
            }

            yield return(new WaitForSeconds(5));
        }
    }
Example #11
0
        public static IterationResult Validate <TData>(this IReplayScenario <TData> scenario, DataItem data, int threadId = 0, int threadIterationId = 0, int globalIterationId = 0)
        {
            ExecutionTimer    timer          = new ExecutionTimer();
            ThreadSafeCounter errorsCounter  = new ThreadSafeCounter();
            GlobalCounters    globalCounters = new GlobalCounters(errorsCounter, new MockedIdGenerator(globalIterationId));
            IIterationControl context        = new IterationContext(threadId, timer);

            ReplayScenarioHandler <TData> handler = new ReplayScenarioHandler <TData>(globalCounters, new MockedIdGenerator(threadIterationId), scenario, context);

            timer.Start();

            handler.Init();
            handler.PrepareNext();
            handler.SetData(data.Value, data.TimeStamp);
            handler.Execute();

            IterationResult result = new IterationResult(context, new WorkerThreadStats());

            handler.Cleanup();

            timer.Stop();

            return(result);
        }
Example #12
0
        StatementSyntax BuildInner()
        {
            const string eventBufferName = "eventBuffer";
            Type         eventType       = IterationContext.UpdateMode == UpdateMode.OnEvent
                ? ((OnEventNodeModel)IterationContext.Query).EventTypeHandle.Resolve(IterationContext.Stencil)
                : null;

            List <ParameterSyntax> parameters = new List <ParameterSyntax>
            {
                Parameter(
                    Identifier(EntityName))
                .WithType(typeof(Entity).ToTypeSyntax())
            };

            var stateComponentName = IterationContext.UpdateMode == UpdateMode.OnUpdate || IterationContext.UpdateMode == UpdateMode.OnEvent
                ? null
                : IncludeTrackingSystemStateComponent(IterationContext.Query.ComponentQueryDeclarationModel, IterationContext.UpdateMode == UpdateMode.OnEnd);
            var stateComponentParameterName = stateComponentName?.ToLowerInvariant();

            switch (IterationContext.UpdateMode)
            {
            case UpdateMode.OnUpdate:
                break;

            case UpdateMode.OnEvent:
                // Add it at the end

                break;

            case UpdateMode.OnStart:
                m_UpdateStatements.AddRange(GetEntityManipulationTranslator().AddComponent(
                                                this,
                                                IdentifierName(EntityName),
                                                DefaultExpression(IdentifierName(stateComponentName)),
                                                IdentifierName(stateComponentName),
                                                false));
                break;

            case UpdateMode.OnEnd:
                parameters.Add(MakeLambdaParameter(
                                   stateComponentParameterName,
                                   IdentifierName(stateComponentName),
                                   false,
                                   false));

                m_UpdateStatements.AddRange(GetEntityManipulationTranslator().RemoveComponent(
                                                this,
                                                IdentifierName(EntityName),
                                                IdentifierName(stateComponentName)));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            // SharedComponents should be inserted first in ForEach
            var sortedComponents = IterationContext.FlattenedComponentDefinitions()
                                   .OrderBy(d =>
                                            !typeof(ISharedComponentData).IsAssignableFrom(d.TypeHandle.Resolve(IterationContext.Stencil)))
                                   .ToList();

            foreach (ComponentDefinition definition in sortedComponents)
            {
                if (!RoslynEcsTranslatorExtensions.ShouldGenerateComponentAccess(
                        definition.TypeHandle,
                        true,
                        out Type componentType,
                        IterationContext.Stencil,
                        out bool _,
                        out bool isGameObjectComponent))
                {
                    continue;
                }

                if (!m_WrittenComponents.TryGetValue(definition.TypeHandle, out RoslynEcsTranslator.AccessMode mode))
                {
                    mode = RoslynEcsTranslator.AccessMode.None;
                }

                if (mode == RoslynEcsTranslator.AccessMode.None)
                {
                    continue;
                }

                string componentDataName = IterationContext.GetComponentDataName(componentType);
                parameters.Add(MakeLambdaParameter(
                                   componentDataName,
                                   componentType.ToTypeSyntax(),
                                   isGameObjectComponent,
                                   typeof(ISharedComponentData).IsAssignableFrom(componentType)));
            }

            switch (IterationContext.UpdateMode)
            {
            case UpdateMode.OnEvent:
                parameters.Add(MakeLambdaParameter(
                                   eventBufferName,
                                   GenericName("DynamicBuffer").WithTypeArgumentList(TypeArgumentList(SingletonSeparatedList(eventType.ToTypeSyntax()))),
                                   false,
                                   true));
                break;
            }


            ExpressionSyntax baseQuery = InvocationExpression(
                MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    IdentifierName("Entities"),
                    IdentifierName("With")))
                                         .WithArgumentList(
                ArgumentList(
                    SingletonSeparatedList(
                        Argument(
                            IdentifierName(IterationContext.UpdateMode == UpdateMode.OnEvent
                                    ? SendEventTranslator.MakeQueryIncludingEventName(IterationContext, eventType)
                                    : IterationContext.GroupName)))));

            if (IterationContext.UpdateMode == UpdateMode.OnEnd)
            {
                // REPLACE query
                baseQuery = IdentifierName("Entities");
                m_UpdateStatements.Insert(0, IfStatement(
                                              MemberAccessExpression(
                                                  SyntaxKind.SimpleMemberAccessExpression,
                                                  IdentifierName(stateComponentParameterName),
                                                  IdentifierName("Processed")),
                                              ReturnStatement()));
            }

            BlockSyntax innerLambdaBody;

            if (IterationContext.UpdateMode == UpdateMode.OnEvent)
            {
                //for (int event_index = 0; event_index < eventBuffer.Length; event_index++) { T ev = eventBuffer[event_index]; ... }
                var eventIndexName = "event_index";
                m_UpdateStatements.Insert(0, RoslynBuilder.DeclareLocalVariable(eventType, "ev",
                                                                                ElementAccessExpression(
                                                                                    IdentifierName(eventBufferName))
                                                                                .WithArgumentList(
                                                                                    BracketedArgumentList(
                                                                                        SingletonSeparatedList(
                                                                                            Argument(
                                                                                                IdentifierName(eventIndexName)))))
                                                                                .NormalizeWhitespace()));
                innerLambdaBody = Block(ForStatement(
                                            Block(m_UpdateStatements))
                                        .WithDeclaration(
                                            VariableDeclaration(
                                                PredefinedType(
                                                    Token(SyntaxKind.IntKeyword)))
                                            .WithVariables(
                                                SingletonSeparatedList <VariableDeclaratorSyntax>(
                                                    VariableDeclarator(
                                                        Identifier(eventIndexName))
                                                    .WithInitializer(
                                                        EqualsValueClause(
                                                            LiteralExpression(
                                                                SyntaxKind.NumericLiteralExpression,
                                                                Literal(0)))))))
                                        .WithCondition(
                                            BinaryExpression(
                                                SyntaxKind.LessThanExpression,
                                                IdentifierName(eventIndexName),
                                                MemberAccessExpression(
                                                    SyntaxKind.SimpleMemberAccessExpression,
                                                    IdentifierName(eventBufferName),
                                                    IdentifierName("Length"))))
                                        .WithIncrementors(
                                            SingletonSeparatedList <ExpressionSyntax>(
                                                PostfixUnaryExpression(
                                                    SyntaxKind.PostIncrementExpression,
                                                    IdentifierName(eventIndexName))))
                                        .NormalizeWhitespace());
            }
            else
            {
                innerLambdaBody = Block(m_UpdateStatements);
            }

            var parenthesizedLambdaExpressionSyntax = ParenthesizedLambdaExpression(
                innerLambdaBody)
                                                      .WithParameterList(
                ParameterList().AddParameters(parameters.ToArray()));

            var updateCall = ExpressionStatement(
                InvocationExpression(
                    MemberAccessExpression(
                        SyntaxKind.SimpleMemberAccessExpression,
                        baseQuery,
                        IdentifierName("ForEach")))
                .WithArgumentList(
                    ArgumentList(
                        SingletonSeparatedList(
                            Argument(
                                parenthesizedLambdaExpressionSyntax)))));

            if (IterationContext.UpdateMode == UpdateMode.OnEnd)
            {
                var addMissingStateComponents = ExpressionStatement(
                    InvocationExpression(
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            IdentifierName("EntityManager"),
                            IdentifierName("AddComponent")))
                    .WithArgumentList(
                        ArgumentList(
                            SeparatedList(
                                new [] {
                    Argument(
                        IdentifierName(RootContext.GetQueryAddStateName(IterationContext.GroupName))),
                    Argument(
                        TypeOfExpression(
                            IdentifierName(stateComponentName)))
                }))));

                var foreachClearProcessed = ExpressionStatement(
                    InvocationExpression(
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            IdentifierName("Entities"),
                            IdentifierName("ForEach")))
                    .WithArgumentList(
                        ArgumentList(
                            SingletonSeparatedList(
                                Argument(
                                    ParenthesizedLambdaExpression(
                                        MakeProcessed(false))
                                    .WithParameterList(
                                        ParameterList(
                                            SingletonSeparatedList(
                                                Parameter(
                                                    Identifier(stateComponentParameterName))
                                                .WithModifiers(
                                                    TokenList(
                                                        Token(SyntaxKind.RefKeyword)))
                                                .WithType(
                                                    IdentifierName(stateComponentName))))))))));
                var foreachQueryMarkProcessed = ExpressionStatement(
                    InvocationExpression(
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            InvocationExpression(
                                MemberAccessExpression(
                                    SyntaxKind.SimpleMemberAccessExpression,
                                    IdentifierName("Entities"),
                                    IdentifierName("With")))
                            .WithArgumentList(
                                ArgumentList(
                                    SingletonSeparatedList(
                                        Argument(
                                            IdentifierName(IterationContext.GroupName))))),
                            IdentifierName("ForEach")))
                    .WithArgumentList(
                        ArgumentList(
                            SingletonSeparatedList(
                                Argument(
                                    ParenthesizedLambdaExpression(MakeProcessed(true))
                                    .WithParameterList(
                                        ParameterList(
                                            SeparatedList(parameters))))))));
                return(Block(
                           addMissingStateComponents,
                           foreachClearProcessed,
                           foreachQueryMarkProcessed,
                           updateCall
                           ));
            }

            return(updateCall);

            ParameterSyntax MakeLambdaParameter(string componentDataName, TypeSyntax typeSyntax,
                                                bool isGameObjectComponent, bool isSharedComponent)
            {
                var modifiers = new List <SyntaxToken>();

                if (!isSharedComponent)
                {
                    modifiers.Add(Token(SyntaxKind.RefKeyword));
                }

                var parameterSyntax = Parameter(
                    Identifier(componentDataName))
                                      .WithType(
                    typeSyntax);

                if (!isGameObjectComponent)
                {
                    parameterSyntax = parameterSyntax
                                      .WithModifiers(TokenList(modifiers));
                }
                return(parameterSyntax);
            }

            AssignmentExpressionSyntax MakeProcessed(bool processed)
            {
                return(AssignmentExpression(
                           SyntaxKind.SimpleAssignmentExpression,
                           MemberAccessExpression(
                               SyntaxKind.SimpleMemberAccessExpression,
                               IdentifierName(stateComponentParameterName),
                               IdentifierName("Processed")),
                           LiteralExpression(processed
                        ? SyntaxKind.TrueLiteralExpression
                        : SyntaxKind.FalseLiteralExpression)));
            }
        }
Example #13
0
 public override HttpRequestMessage GetHttpRequest(IterationContext context)
 {
     return(new HttpRequestMessage(HttpMethod.Get, this._mainRequestUrl));
 }
Example #14
0
 protected virtual IDictionary <string, string> GetFormParameters(IterationContext context)
 {
     return(new Dictionary <string, string>());
 }
Example #15
0
 protected override Uri GetRequestUri(IterationContext context)
 {
     return(new Uri(context.Environment[LoadTestEnvironmentKeys.FormAction] as string));
 }
Example #16
0
 protected override HttpContent GetContent(IterationContext context)
 {
     return(new FormUrlEncodedContent(GetFormParameters(context)));
 }
        private static IDictionary <string, string> RunHttpRequest(
            IterationContext context,
            HttpClient client,
            string description,
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            var requestId = Guid.NewGuid();

            request.Headers.Add("X-MK6LoadTest", "true");
            request.Headers.Add("X-MK6LoadTest-Description", description);
            request.Headers.Add("X-MK6LoadTest-RequestId", requestId.ToString());

            var originalUrl = request.RequestUri.ToString();

            var startTime = DateTime.Now;
            var timer     = new Stopwatch();

            try
            {
                timer.Start();
                Log.Information("Starting request {Data}",
                                new
                {
                    RequestId   = requestId,
                    WorkerId    = context.WorkerIndex,
                    WorkerCount = context.Environment["Workers"],
                    Iteration   = context.IterationIndex,
                    Description = description,
                    OriginalUrl = originalUrl
                });
                var response = client.SendAsync(request, cancellationToken).Result;

                timer.Stop();
                var endTime = DateTime.Now;

                Log.Information("Finished request {Data}",
                                new
                {
                    RequestId    = requestId,
                    WorkerId     = context.WorkerIndex,
                    WorkerCount  = context.Environment["Workers"],
                    Iteration    = context.IterationIndex,
                    Description  = description,
                    FinalUrl     = response.RequestMessage.RequestUri.AbsolutePath,
                    Status       = response.StatusCode,
                    ResponseTime = timer.ElapsedMilliseconds,
                    ResponseSize = response.Content.ReadAsByteArrayAsync().Result.Count()
                });

                return(BuildResponse(
                           context,
                           description,
                           request,
                           startTime,
                           endTime,
                           timer,
                           response.StatusCode.ToString(),
                           response.Content.ReadAsStringAsync().Result));
            }
            catch (AggregateException ex)
            {
                timer.Stop();
                Log.Information("Request was cancelled");
                return(BuildResponse(
                           context,
                           description,
                           request,
                           startTime,
                           DateTime.UtcNow,
                           timer,
                           "Cancelled",
                           string.Empty,
                           ex.Message));
            }
            catch (Exception ex)
            {
                timer.Stop();
                Log.Error(ex, "Error during timed request to '{0}'", request.RequestUri.ToString());

                return(BuildResponse(
                           context,
                           description,
                           request,
                           startTime,
                           DateTime.UtcNow,
                           timer,
                           "Error",
                           string.Empty,
                           ex.Message));
            }
        }
 protected abstract HttpContent GetContent(IterationContext context);
Example #19
0
    public IEnumerator animateIterCtx(IterationContext itCtx)
    {
        lengthOfAnimation = 5;
        timeLeft          = lengthOfAnimation;
        antsFinished      = false;
        numAntsFinished   = 0;

        if (itCtx.currIter == 0)
        {
            pheromons = null;
        }

        pathControler.color = pathControler.color;
        double min, max;

        findMinMax(itCtx.pheromoneMatrix, out min, out max);

        double a, b;

        findLinarScale(min, max, 0.01, 1, out a, out b);

        applyLinearScale(a, b, itCtx.pheromoneMatrix);

        List <AntData> ants = new List <AntData>();

        AntData antData;

        for (int i = 0; i < itCtx.antsRoutes.Count; ++i)
        {
            antData                = new AntData();
            antData.currentDest    = 0;
            antData.timePerPath    = lengthOfAnimation / itCtx.antsRoutes[i].Count;
            antData.timeLeftOnPath = 0;
            antData.antGameObject  = GameObject.Instantiate(antPefab, Vector3.zero, Quaternion.identity);
            antData.finished       = false;
            ants.Add(antData);
        }


        int tmp, tmp1;

        for (int i = 0; i + 1 < itCtx.iterShortestPath.Count; ++i)
        {
            tmp  = cityControler.activeCitysIndex[itCtx.iterShortestPath[i]];
            tmp1 = cityControler.activeCitysIndex[itCtx.iterShortestPath[i + 1]];
            if (pathControler.pathMatrix[tmp, tmp1])
            {
                pathControler.pathMatrix[tmp, tmp1].startColor = new Color(1, 1, 1, 1);
                pathControler.pathMatrix[tmp, tmp1].endColor   = new Color(1, 1, 1, 1);
            }
        }

        StartCoroutine(animateAllAnts(ants, itCtx.antsRoutes));
        while (timeLeft > 0)
        {
            timeLeft -= Time.deltaTime;


            animatePaths(itCtx);
            //animateAllAnts(ants, itCtx.antsRoutes);


            yield return(null);
        }

        pheromons = itCtx.pheromoneMatrix;

        while (!antsFinished)
        {
            yield return(null);
        }

        for (int i = 0; i < itCtx.antsRoutes.Count; ++i)
        {
            GameObject.Destroy(ants[i].antGameObject);
        }


        if (itCtx.currIter < itCtx.numOfIters - 1 && !acoControler.stoped)
        {
            StartCoroutine(acoControler.waitForIterCtx());
        }
        else
        {
            acoControler.stopAlgorithm();
            reset();
            if (!acoControler.stoped)
            {
                for (int i = 0; i + 1 < itCtx.iterShortestPath.Count; ++i)
                {
                    tmp  = cityControler.activeCitysIndex[itCtx.iterShortestPath[i]];
                    tmp1 = cityControler.activeCitysIndex[itCtx.iterShortestPath[i + 1]];
                    if (pathControler.pathMatrix[tmp, tmp1])
                    {
                        pathControler.pathMatrix[tmp, tmp1].startColor = new Color(1, 1, 1, 1);
                        pathControler.pathMatrix[tmp, tmp1].startWidth = 0.7f;
                        pathControler.pathMatrix[tmp, tmp1].endColor   = new Color(1, 1, 1, 1);
                        pathControler.pathMatrix[tmp, tmp1].endWidth   = 0.7f;
                    }
                }
            }
        }
        //	Debug.Log("animateItCtxt finished");
        yield break;
    }
Example #20
0
        protected override StatementSyntax OnPopContext()
        {
            BlockSyntax forBody = Block();

            var loopIndexName = IterationContext.IndexVariableName;
            List <StatementSyntax> reassignComponentDataArrays = new List <StatementSyntax>();


            BlockSyntax blockSyntax = Block();

            // foreach in a job: the entity array will be declared as a job field, initialized at job creation

            StatementSyntax initEntitiesArray = GetOrDeclareEntityArray(IterationContext, out var disposeEntitiesArray);

            foreach (ComponentDefinition definition in IterationContext.FlattenedComponentDefinitions())
            {
                if (!RoslynEcsTranslatorExtensions.ShouldGenerateComponentAccess(definition.TypeHandle, true, out var componentType, IterationContext.Stencil, out bool isShared, out bool isGameObjectComponent) ||
                    isGameObjectComponent)
                {
                    continue;
                }

                if (!m_WrittenComponents.TryGetValue(definition.TypeHandle, out var mode))
                {
                    mode = RoslynEcsTranslator.AccessMode.None;
                }

                if (mode == RoslynEcsTranslator.AccessMode.None)
                {
                    continue;
                }

                ExpressionSyntax initValue;
                if (isShared)
                {
                    initValue = InvocationExpression(
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            IdentifierName(nameof(EntityManager)),
                            GenericName(
                                Identifier(nameof(EntityManager.GetSharedComponentData)))
                            .WithTypeArgumentList(
                                TypeArgumentList(
                                    SingletonSeparatedList(
                                        TypeSystem.BuildTypeSyntax(componentType))))))
                                .WithArgumentList(
                        ArgumentList(
                            SingletonSeparatedList(
                                Argument(
                                    IdentifierName(EntityName)))));
                }
                else
                {
                    string compArrayName = GetOrDeclareComponentArray(IterationContext, definition,
                                                                      out var componentDataArrayInitialization,
                                                                      out var componentDataArrayDisposal);
                    if (componentDataArrayInitialization != null)
                    {
                        m_InitComponentDataArrays.Add(componentDataArrayInitialization);
                    }
                    if (componentDataArrayDisposal != null)
                    {
                        m_DisposeComponentDataArrays.Add(componentDataArrayDisposal);
                    }

                    initValue = ElementAccessExpression(IdentifierName(compArrayName))
                                .WithArgumentList(
                        BracketedArgumentList(
                            SingletonSeparatedList(
                                Argument(
                                    IdentifierName(loopIndexName)))));
                }


                // per-entity component variable
                StatementSyntax componentVarDeclaration = RoslynBuilder.DeclareLocalVariable(
                    componentType,
                    IterationContext.GetComponentDataName(componentType),
                    initValue,
                    RoslynBuilder.VariableDeclarationType.InferredType);
                forBody = forBody.AddStatements(componentVarDeclaration);

                if (mode == RoslynEcsTranslator.AccessMode.Write)
                {
                    reassignComponentDataArrays.Add(ExpressionStatement(
                                                        GetEntityManipulationTranslator().SetComponent(
                                                            this,
                                                            ElementAccessExpression(IdentifierName(IterationContext.EntitiesArrayName))
                                                            .WithArgumentList(
                                                                BracketedArgumentList(
                                                                    SingletonSeparatedList(
                                                                        Argument(
                                                                            IdentifierName(IterationContext.IndexVariableName))))),
                                                            componentType,
                                                            IdentifierName(IterationContext.GetComponentDataName(componentType)))
                                                        .Cast <ExpressionSyntax>()
                                                        .Single())
                                                    );
                }
            }

            forBody = forBody.AddStatements(m_UpdateStatements.ToArray());
            forBody = forBody.AddStatements(reassignComponentDataArrays.ToArray());

            if (forBody.Statements.Count != 0) // strip the iteration loop if empty
            {
                forBody = forBody.WithStatements(forBody.Statements.Insert(0, m_EntityDeclaration));

                if (initEntitiesArray != null)
                {
                    blockSyntax = blockSyntax.AddStatements(initEntitiesArray);
                }

                blockSyntax = blockSyntax
                              .AddStatements(m_InitComponentDataArrays.ToArray())
                              .AddStatements(RoslynEcsTranslatorExtensions.ComponentQueryForLoop(forBody, loopIndexName, IterationContext.EntitiesArrayName))
                              .AddStatements(m_DisposeComponentDataArrays.ToArray());

                if (disposeEntitiesArray != null)
                {
                    blockSyntax = blockSyntax.AddStatements(disposeEntitiesArray);
                }
            }

            return(AddMissingEventBuffers(IterationContext, blockSyntax));
        }
        public static void PostScriptHook(IterationContext context)
        {
            var client = context.Environment[LoadTestEnvironmentKeys.HttpClient] as HttpClient;

            client.Dispose();
        }
Example #22
0
 public virtual User Choose(IterationContext context)
 {
     return(this.Users[context.WorkerIndex % this.Users.Count]);
 }
 public static void PreScriptHook(IterationContext context)
 {
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
     context.Environment.Add(LoadTestEnvironmentKeys.HttpClient, BuildClient(context));
 }
 public abstract HttpRequestMessage GetHttpRequest(IterationContext context);
 protected abstract Uri GetRequestUri(IterationContext context);
 public virtual IDictionary <string, object> ExtractContentToEnvironment(
     IterationContext context,
     IDictionary <string, string> result)
 {
     return(new Dictionary <string, object>());
 }
 public virtual IEnumerable <ComponentDefinition> GetComponentDefinitions()
 {
     return(IterationContext.FlattenedComponentDefinitions());
 }
Example #28
0
 public override string GetComponentVariableName(IIteratorStackModel groupDeclaration, TypeHandle componentVariableType1)
 {
     Assert.AreEqual(groupDeclaration, IterationContext.Query);
     return(IterationContext.GetComponentDataName(componentVariableType1.Resolve(IterationContext.Stencil)));
 }