public void StartShallRunThrough()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();
            var job        = new Job
            {
                JobId     = "valid-job-id",
                PayloadId = "payloadid"
            };

            JobId.TryParse(job.JobId, out JobId jobId);

            mockClient.Setup(p => p.StartJob(It.IsAny <JobId>(), It.IsAny <List <KeyValuePair <string, string> > >()))
            .ReturnsAsync(new JobToken
            {
                JobId     = jobId,
                JobState  = JobState.Pending,
                JobStatus = Nvidia.Clara.Platform.JobStatus.Healthy
            });

            var service = new ClaraJobsApi(
                mockClient.Object, mockLogger.Object);

            service.Start(job).Wait();

            mockClient.Verify(
                p => p.StartJob(It.IsAny <JobId>(), It.IsAny <List <KeyValuePair <string, string> > >()),
                Times.Exactly(1));

            mockLogger.VerifyLogging(LogLevel.Error, Times.Never());
            mockLogger.VerifyLogging(LogLevel.Information, Times.Once());
        }
        public async Task Create_ShallReturnAJob()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            JobId.TryParse("jobid", out JobId jobId);
            PayloadId.TryParse("payloadid", out PayloadId payloadId);
            PipelineId.TryParse("pipelineid", out PipelineId pipelineId);

            mockClient.Setup(p => p.CreateJob(It.IsAny <PipelineId>(), It.IsAny <string>(), It.IsAny <JobPriority>()))
            .ReturnsAsync(new JobInfo
            {
                Name       = "bla bla job",
                JobId      = jobId,
                PayloadId  = payloadId,
                PipelineId = pipelineId
            });

            var service = new ClaraJobsApi(
                mockClient.Object, mockLogger.Object);

            var job = await service.Create(Guid.NewGuid().ToString(), "bla bla", JobPriority.Higher);

            Assert.Equal(jobId.ToString(), job.JobId);
            Assert.Equal(payloadId.ToString(), job.PayloadId);

            mockClient.Verify(
                p => p.CreateJob(It.IsAny <PipelineId>(), It.IsAny <string>(), JobPriority.Higher),
                Times.Exactly(1));

            mockLogger.VerifyLogging(LogLevel.Information, Times.Once());
            mockLogger.VerifyLogging(LogLevel.Error, Times.Never());
        }
        public void Start_ShallThrowOnBadPipelineId()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.StartJob(It.IsAny <JobId>(), It.IsAny <List <KeyValuePair <string, string> > >()));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var job = new Job
            {
                JobId     = "bad job id has spaces",
                PayloadId = "payloadid"
            };

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.Start(job).Wait();
            });

            Assert.IsType <ApplicationException>(exception.InnerException);
            mockClient.Verify(
                p => p.StartJob(It.IsAny <JobId>(), It.IsAny <List <KeyValuePair <string, string> > >()),
                Times.Never());

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(3));
        }
        public void Start_ShallRespectRetryPolicyOnFailure()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.StartJob(It.IsAny <JobId>(), It.IsAny <List <KeyValuePair <string, string> > >()))
            .Throws(new RpcException(Status.DefaultCancelled));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var job = new Job
            {
                JobId     = "valid-job-id",
                PayloadId = "payloadid"
            };

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.Start(job).Wait();
            });

            Assert.IsType <RpcException>(exception.InnerException);
            mockClient.Verify(
                p => p.StartJob(It.IsAny <JobId>(), It.IsAny <List <KeyValuePair <string, string> > >()),
                Times.Exactly(4));

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(3));
        }
        public void AddMetadata_ShallRunThrough()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            var jobId   = Guid.NewGuid().ToString("N");
            var jobDate = DateTime.UtcNow;

            JobId.TryParse(jobId, out JobId jobIdObj);

            mockClient.Setup(p => p.AddMetadata(It.IsAny <JobId>(), It.IsAny <Dictionary <string, string> >()));

            var service = new ClaraJobsApi(
                mockClient.Object, mockLogger.Object);

            var job = new Job
            {
                JobId     = Guid.NewGuid().ToString("N"),
                PayloadId = Guid.NewGuid().ToString("N")
            };

            service.AddMetadata(job, new Dictionary <string, string>()).Wait();

            mockClient.Verify(
                p => p.AddMetadata(It.IsAny <JobId>(), It.IsAny <Dictionary <string, string> >()),
                Times.Exactly(1));

            mockLogger.VerifyLogging(LogLevel.Error, Times.Never());
            mockLogger.VerifyLogging(LogLevel.Information, Times.Once());
        }
        public void AddMetadata_ShallRespectRetryPolicyOnFailure()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.AddMetadata(It.IsAny <JobId>(), It.IsAny <Dictionary <string, string> >()))
            .Throws(new RpcException(Status.DefaultCancelled));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var job = new Job
            {
                JobId     = Guid.NewGuid().ToString("N"),
                PayloadId = Guid.NewGuid().ToString("N")
            };

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.AddMetadata(job, new Dictionary <string, string>()).Wait();
            });

            Assert.IsType <RpcException>(exception.InnerException);
            mockClient.Verify(
                p => p.AddMetadata(It.IsAny <JobId>(), It.IsAny <Dictionary <string, string> >()),
                Times.Exactly(2));

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(1));
        }
        public void AddMetadata_ShallThrowOnBadPipelineId()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.AddMetadata(It.IsAny <JobId>(), It.IsAny <Dictionary <string, string> >()));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var job = new Job
            {
                JobId     = "bad job id has spaces",
                PayloadId = "12345"
            };

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.AddMetadata(job, new Dictionary <string, string>()).Wait();
            });

            Assert.IsType <ArgumentException>(exception.InnerException);
            mockClient.Verify(
                p => p.AddMetadata(It.IsAny <JobId>(), It.IsAny <Dictionary <string, string> >()),
                Times.Never());

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(1));
        }
        public void StatusShallRunThrough()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            var jobId   = Guid.NewGuid().ToString("N");
            var jobDate = DateTime.UtcNow;

            JobId.TryParse(jobId, out JobId jobIdObj);

            mockClient.Setup(p => p.GetStatus(It.IsAny <JobId>()))
            .ReturnsAsync(new JobDetails
            {
                JobId       = jobIdObj,
                JobState    = JobState.Pending,
                JobStatus   = Nvidia.Clara.Platform.JobStatus.Healthy,
                DateCreated = jobDate,
                DateStarted = jobDate,
                DateStopped = jobDate,
                JobPriority = JobPriority.Higher,
                Name        = "name"
            });

            var service = new ClaraJobsApi(
                mockClient.Object, mockLogger.Object);

            service.Status(jobId).Wait();

            mockClient.Verify(
                p => p.GetStatus(It.IsAny <JobId>()),
                Times.Exactly(1));

            mockLogger.VerifyLogging(LogLevel.Error, Times.Never());
            mockLogger.VerifyLogging(LogLevel.Information, Times.Once());
        }
        public void Create_ShallThrowOnBadPipelineId()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.CreateJob(It.IsAny <PipelineId>(), It.IsAny <string>()));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.Create("bad pipeline id", "bla bla", JobPriority.Higher).Wait();
            });

            Assert.IsType <ConfigurationException>(exception.InnerException);
            mockClient.Verify(
                p => p.CreateJob(It.IsAny <PipelineId>(), It.IsAny <string>(), JobPriority.Higher),
                Times.Never());

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(3));
        }
        public void Create_ShallRespectRetryPolicyOnFailure()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.CreateJob(It.IsAny <PipelineId>(), It.IsAny <string>(), It.IsAny <JobPriority>()))
            .Throws(new RpcException(Status.DefaultCancelled));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.Create("valid-pipeline-id", "bla bla", JobPriority.Lower).Wait();
            });

            Assert.IsType <RpcException>(exception.InnerException);
            mockClient.Verify(
                p => p.CreateJob(It.IsAny <PipelineId>(), It.IsAny <string>(), JobPriority.Lower),
                Times.Exactly(4));

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(3));
        }
        public void Status_ShallThrowOnBadPipelineId()
        {
            var mockClient = new Mock <IJobsClient>();
            var mockLogger = new Mock <ILogger <ClaraJobsApi> >();

            mockClient.Setup(p => p.GetStatus(It.IsAny <JobId>()));

            var service = new ClaraJobsApi(mockClient.Object, mockLogger.Object);

            var jobId = "bad job id has spaces";

            var exception = Assert.Throws <AggregateException>(() =>
            {
                service.Status(jobId).Wait();
            });

            Assert.IsType <ArgumentException>(exception.InnerException);
            mockClient.Verify(
                p => p.GetStatus(It.IsAny <JobId>()),
                Times.Never());

            mockLogger.VerifyLogging(LogLevel.Error, Times.Exactly(1));
        }