Пример #1
0
        public void EnqueuesAtScheduledTime()
        {
            var job = new Job1();

            FakeClock.Setup();
            FakeClock.Now = new DateTimeOffset(2018, 1, 1, 0, 0, 0, TimeSpan.Zero);
            var enqueueAt = FakeClock.Now + TimeSpan.FromMilliseconds(10);

            Action <IJob, Exception> errorHandler = (j, e) => { };

            sut.OnApplicationStarted();
            sut.ScheduleJob(job, enqueueAt, errorHandler);

            bool enqueued = false;

            workerProcess.When(x => x.EnqueueJob(job, errorHandler)).Do(ci => enqueued = true);

            enqueued.Should().BeFalse();

            FakeClock.Now = new DateTimeOffset(2018, 1, 1, 0, 0, 0, 10, TimeSpan.Zero);

            while (!enqueued)
            {
                Thread.Yield();
            }

            enqueued.Should().BeTrue();
            sut.OnApplicationStopping();
        }
    public void AtomicDataResource_Allocate_Deallocate_InJob()
    {
        const int MAX      = 5000;
        var       resource = new AtomicFloatResource(MAX, Allocator.Persistent);
        var       holder   = new NativeArray <AtomicFloat>(MAX, Allocator.Persistent);
        var       job0     = new Job0()
        {
            resource = resource,
            holder   = holder,
        };

        job0.Schedule(MAX, 32).Complete();
        Assert.AreEqual(MAX, resource.getCountInUse());

        var job1 = new Job1()
        {
            resource = resource,
            holder   = holder,
        };

        job1.Schedule(MAX, 32).Complete();
        Assert.AreEqual(0, resource.getCountInUse());

        holder.Dispose();
        resource.Dispose();
    }
Пример #3
0
        public async Task EnqeueJobAsync_Immediate()
        {
            var job = new Job1();
            await sut.EnqeueJobAsync(job, null);

            workerProcess.Received(1).EnqueueJob(job, Arg.Any <Action <IJob, Exception> >());
        }
Пример #4
0
        public void EnqueueJob_RunsTask()
        {
            var job = new Job1();

            sut.OnApplicationStarted();
            sut.EnqueueJob(job, (j, e) => { });
            sut.OnApplicationStopping();

            jobRunner.Received(1).RunJobAsync(job, CancellationToken.None);
        }
Пример #5
0
        public async Task EnqeueJobAsync_Delayed()
        {
            FakeClock.Setup();

            var job = new Job1();
            await sut.EnqeueJobAsync(job, TimeSpan.FromSeconds(5));

            var expectedScheduleTime = FakeClock.Now + TimeSpan.FromSeconds(5);

            schedulerProcess.Received(1).ScheduleJob(job, expectedScheduleTime, Arg.Any <Action <IJob, Exception> >());
        }
Пример #6
0
    public void NativeLimitedCounter_OverTheNumber()
    {
        const int MAX     = 1000;
        var       counter = new NativeLimitedCounter(Allocator.Persistent);
        var       job     = new Job1();

        job.counter = counter;
        job.maximum = MAX;
        job.Schedule(MAX * 2, 32).Complete();

        Assert.AreEqual(MAX, counter.Count);
        counter.Dispose();
    }
Пример #7
0
    void JobTest()
    {
        //NativeArray<int> nativeArray = new NativeArray<int>(1, Allocator.TempJob);
        //Job1 tempJob = new Job1() { i = 6, j = 7, result = nativeArray };
        Job1 tempJob = new Job1()
        {
            i = 6, j = 7
        };
        JobHandle jobHandle = tempJob.Schedule();

        jobHandle.Complete();

        Debug.Log(tempJob.result);
        //nativeArray.Dispose();
    }
Пример #8
0
        public void CallsErrorHandler()
        {
            var job = new Job1();

            var exception = new Exception("Test exception");

            jobRunner.RunJobAsync(job, CancellationToken.None).Throws(exception);

            var errorHandler = Substitute.For <Action <IJob, Exception> >();

            sut.OnApplicationStarted();
            sut.EnqueueJob(job, errorHandler);
            sut.OnApplicationStopping();

            errorHandler.Received(1).Invoke(job, exception);
        }
Пример #9
0
    void MultiJobTest()
    {
        float tempStart = Time.realtimeSinceStartup;

        NativeList <JobHandle> nativeList = new NativeList <JobHandle>(Allocator.TempJob);

        for (int i = 0; i < 10; ++i)
        {
            Job1 tempJob = new Job1()
            {
                i = 6, j = 7
            };
            nativeList.Add(tempJob.Schedule());
        }

        JobHandle.CompleteAll(nativeList);
        nativeList.Dispose();

        float tempSumTime = Time.realtimeSinceStartup - tempStart;

        Debug.Log("ThreadSumTime: " + tempSumTime);
    }
Пример #10
0
        public void ThrottlesTasks()
        {
            schedulerConfiguration.WorkerTaskParallelism = 2;

            bool job1Finish = false;
            bool job2Finish = false;

            var job1 = new Job1();
            var job2 = new Job1();
            var job3 = new Job1();

            async Task Job1()
            {
                while (!job1Finish)
                {
                    await Task.Yield();
                }
            }

            Lazy <Task> job1Task = new Lazy <Task>(Job1);

            async Task Job2()
            {
                while (!job2Finish)
                {
                    await Task.Yield();
                }
            }

            Lazy <Task> job2Task = new Lazy <Task>(Job2);

            async Task Job3()
            {
                job1Task.Value.IsCompleted.Should().BeTrue();
            }

            Lazy <Task> job3Task = new Lazy <Task>(Job3);

            jobRunner.RunJobAsync(job1, CancellationToken.None).Returns(ci => job1Task.Value);
            jobRunner.RunJobAsync(job2, CancellationToken.None).Returns(ci => job2Task.Value);
            jobRunner.RunJobAsync(job3, CancellationToken.None).Returns(ci => job3Task.Value);

            sut.OnApplicationStarted();
            sut.EnqueueJob(job1, (j, e) => { });
            sut.EnqueueJob(job2, (j, e) => { });

            while (!job1Task.IsValueCreated || !job2Task.IsValueCreated)
            {
                Thread.Yield();
            }

            sut.EnqueueJob(job3, (j, e) => { });

            Thread.Yield();

            job3Task.IsValueCreated.Should().BeFalse();

            job1Finish = true;
            job2Finish = true;
            sut.OnApplicationStopping();

            job3Task.Value.IsCompleted.Should().BeTrue();
        }
Пример #11
0
        public async Task ReschedulesOnError(int configMaxAttemptCount)
        {
            schedulerConfiguration.HandleAttemptCount = configMaxAttemptCount;

            FakeClock.Setup();
            FakeClock.Now = new DateTimeOffset(2019, 1, 1, 0, 0, 0, TimeSpan.Zero);

            var job = new Job1();

            Action <IJob, Exception> errorHandler = null;

            workerProcess.When(x => x.EnqueueJob(job, Arg.Any <Action <IJob, Exception> >()))
            .Do(ci =>
            {
                errorHandler = ci.ArgAt <Action <IJob, Exception> >(1);
            });

            DateTimeOffset scheduleTime = DateTimeOffset.MinValue;

            schedulerProcess.When(x => x.ScheduleJob(job, Arg.Any <DateTimeOffset>(), Arg.Any <Action <IJob, Exception> >()))
            .Do(ci =>
            {
                scheduleTime = ci.ArgAt <DateTimeOffset>(1);
                errorHandler = ci.ArgAt <Action <IJob, Exception> >(2);
            });

            await sut.EnqeueJobAsync(job, null);

            int Pow(int bas, int exp)
            {
                return(Enumerable
                       .Repeat(bas, exp)
                       .Aggregate(1, (a, b) => a * b));
            }

            for (int numberAttempts = 1; numberAttempts <= configMaxAttemptCount; numberAttempts++)
            {
                errorHandler.Should().NotBeNull();

                var currentErrorHandler = errorHandler;
                errorHandler = null;

                var exception = new Exception();
                currentErrorHandler(job, exception);

                schedulerProcess.Received(Math.Min(numberAttempts, configMaxAttemptCount - 1))
                .ScheduleJob(job, Arg.Any <DateTimeOffset>(), Arg.Any <Action <IJob, Exception> >());

                if (numberAttempts != configMaxAttemptCount) // should retry
                {
                    int  delayMultiplier = Pow(schedulerConfiguration.HandleRetryTimeoutMultiplier, numberAttempts - 1);
                    long minDelay        = schedulerConfiguration.MinHandleRetryTimeoutStep.Ticks * delayMultiplier;
                    long maxDelay        = schedulerConfiguration.MaxHandleRetryTimeoutStep.Ticks * delayMultiplier;

                    scheduleTime.Should().BeOnOrAfter(FakeClock.Now + TimeSpan.FromTicks(minDelay));
                    scheduleTime.Should().BeOnOrBefore(FakeClock.Now + TimeSpan.FromTicks(maxDelay));
                }
            }

            workerProcess.Received(1).EnqueueJob(job, Arg.Any <Action <IJob, Exception> >()); // only once
        }
Пример #12
0
 private static void Main(string[] args)
 {
     IJob iJob = new Job1();                            // Valid
     IRepository <IJob> repo = new Repository <Job1>(); // Also valid
 }
Пример #13
0
        public async Task <ActionResult> Add(int?p1Count, int?p2Count, int?p3Count, int?p4Count, int?p5Count)
        {
            var appID = ConfigurationManager.AppSettings["ApplicationID"];

            if (string.IsNullOrWhiteSpace(appID))
            {
                appID = "Shift.Demo.MVC";
            }

            var message = "";

            if (p1Count > 0)
            {
                for (var i = 0; i < p1Count; i++)
                {
                    var job1        = new Job1();
                    var progress    = new SynchronousProgress <ProgressInfo>(); //placeholder to be replaced by Server progress object
                    var cancelToken = (new CancellationTokenSource()).Token;    //placeholder to be replaced by Server token
                    var pauseToken  = (new PauseTokenSource()).Token;
                    await jobClient.AddAsync(appID, () => job1.Start("Hello World!", progress, cancelToken, pauseToken));
                }

                message += p1Count + " - Job1 added to queue. <br/>";
            }

            if (p2Count > 0)
            {
                for (var i = 0; i < p2Count; i++)
                {
                    var job2        = new Job2();
                    var progress    = new SynchronousProgress <ProgressInfo>();
                    var cancelToken = (new CancellationTokenSource()).Token; //placeholder to be replaced by Server token
                    var pauseToken  = (new PauseTokenSource()).Token;
                    await jobClient.AddAsync(appID, () => job2.Start(progress, 1, cancelToken, pauseToken));
                }

                message += p2Count + " - Job2 added to queue. <br/>";
            }

            if (p3Count > 0)
            {
                var simpleList = new List <int>();
                for (var i = 1; i <= 100; i++)
                {
                    simpleList.Add(i);
                }

                for (var i = 0; i < p3Count; i++)
                {
                    var job3     = new Job3();
                    var progress = new SynchronousProgress <ProgressInfo>();
                    await jobClient.AddAsync(appID, () => job3.Start(progress, simpleList));
                }

                message += p3Count + " - Job3 added to queue. <br/>";
            }

            if (p4Count > 0)
            {
                var complexList = new List <TestData>();
                for (var i = 1; i <= 100; i++)
                {
                    var newData = new TestData();
                    newData.MyNumber = i;
                    newData.MyString = "mystring " + i;
                    complexList.Add(newData);
                }

                for (var i = 0; i < p4Count; i++)
                {
                    var job4        = new Job4();
                    var progress    = new SynchronousProgress <ProgressInfo>();
                    var cancelToken = (new CancellationTokenSource()).Token; //placeholder to be replaced by Server token
                    var pauseToken  = (new PauseTokenSource()).Token;
                    await jobClient.AddAsync(appID, () => job4.Start(progress, complexList, cancelToken, pauseToken));
                }

                message += p4Count + " - Job4 added to queue. <br/>";
            }

            if (p5Count > 0)
            {
                var simpleList = new List <int>();
                for (var i = 1; i <= 100; i++)
                {
                    simpleList.Add(i);
                }

                for (var i = 0; i < p5Count; i++)
                {
                    var job5        = new Job5();
                    var cancelToken = (new CancellationTokenSource()).Token; //placeholder to be replaced by Server token
                    var pauseToken  = (new PauseTokenSource()).Token;
                    var progress    = new SynchronousProgress <ProgressInfo>();
                    await jobClient.AddAsync(appID, () => job5.StartAsync(progress, simpleList, cancelToken, pauseToken));
                }

                message += p5Count + " - Job5 added to queue. <br/>";
            }

            ViewBag.Message = message;

            return(View("Index"));
        }