public static void Cleanup()
        {
            var deprecateWorkflowRequest = new DeprecateWorkflowTypeRequest()
            {
                Domain       = DOMAIN,
                WorkflowType = WORKFLOW_TYPE
            };
            var deprecateWorkflowTypeResponse = Client.DeprecateWorkflowType(deprecateWorkflowRequest);

            Assert.IsNotNull(deprecateWorkflowTypeResponse.ResponseMetadata.RequestId);

            var deprecateDomainRequest = new DeprecateDomainRequest()
            {
                Name = DOMAIN
            };
            var deprecateDomainResponse = Client.DeprecateDomain(deprecateDomainRequest);

            Assert.IsNotNull(deprecateDomainResponse.ResponseMetadata.RequestId);

            BaseClean();
        }
        public void CRUDTest()
        {
            var domainName = "sdk-dotnet-crud-" + DateTime.Now.Ticks;
            var regRequest = new RegisterDomainRequest()
            {
                Name        = domainName,
                Description = "A Description",
                WorkflowExecutionRetentionPeriodInDays = "3"
            };

            var regResponse = Client.RegisterDomain(regRequest);

            try
            {
                Sleep(); // Sleep for the eventual consistency
                Assert.IsNotNull(regResponse.ResponseMetadata.RequestId);
                var descRequest = new DescribeDomainRequest()
                {
                    Name = domainName
                };
                var descResponse = Client.DescribeDomain(descRequest);

                Assert.AreEqual(domainName, descResponse.DomainDetail.DomainInfo.Name);
                Assert.AreEqual("A Description", descResponse.DomainDetail.DomainInfo.Description);
                Assert.AreEqual("3", descResponse.DomainDetail.Configuration.WorkflowExecutionRetentionPeriodInDays);
                Assert.IsNotNull(descResponse.DomainDetail.DomainInfo.Status);


                DomainInfo info = null;
                for (int i = 0; i < MaxRetries; i++)
                {
                    Sleep(); // Sleep for the eventual consistency
                    var listDomainResponse = Client.ListDomains(
                        new ListDomainsRequest()
                    {
                        RegistrationStatus = descResponse.DomainDetail.DomainInfo.Status
                    });

                    Assert.IsTrue(listDomainResponse.DomainInfos.Infos.Count > 0);
                    info = listDomainResponse.DomainInfos.Infos.FirstOrDefault(x => string.Equals(x.Name, domainName));
                    if (info != null)
                    {
                        break;
                    }
                }
                Assert.IsNotNull(info);
                Assert.IsNotNull(info.Status);


                var activityDescription = "My Description Activity" + DateTime.Now.Ticks;
                var regActivityRequest  = new RegisterActivityTypeRequest()
                {
                    Name            = "My Activity",
                    Domain          = domainName,
                    Description     = activityDescription,
                    Version         = "1.0",
                    DefaultTaskList = new TaskList()
                    {
                        Name = "ImportantTasks"
                    },
                    DefaultTaskHeartbeatTimeout       = ONE_HOUR_DURATION,
                    DefaultTaskScheduleToCloseTimeout = TWO_HOUR_DURATION,
                    DefaultTaskScheduleToStartTimeout = THREE_HOUR_DURATION,
                    DefaultTaskStartToCloseTimeout    = FOUR_HOUR_DURATION
                };

                var regActivityResponse = Client.RegisterActivityType(regActivityRequest);
                Assert.IsNotNull(regActivityResponse.ResponseMetadata.RequestId);
                try
                {
                    Sleep(); // Sleep for the eventual consistency
                    var descActivityTypeRequest = new DescribeActivityTypeRequest()
                    {
                        Domain       = domainName,
                        ActivityType = new ActivityType()
                        {
                            Name    = "My Activity",
                            Version = "1.0"
                        }
                    };

                    var descActivityTypeResponse = Client.DescribeActivityType(descActivityTypeRequest);

                    Assert.AreEqual(ONE_HOUR_DURATION, descActivityTypeResponse.ActivityTypeDetail.Configuration.DefaultTaskHeartbeatTimeout);
                    Assert.AreEqual(TWO_HOUR_DURATION, descActivityTypeResponse.ActivityTypeDetail.Configuration.DefaultTaskScheduleToCloseTimeout);
                    Assert.AreEqual(THREE_HOUR_DURATION, descActivityTypeResponse.ActivityTypeDetail.Configuration.DefaultTaskScheduleToStartTimeout);
                    Assert.AreEqual(FOUR_HOUR_DURATION, descActivityTypeResponse.ActivityTypeDetail.Configuration.DefaultTaskStartToCloseTimeout);

                    ListActivityTypesResponse listActivityResponse = null;
                    for (int i = 0; i < MaxRetries; i++)
                    {
                        Sleep(); // Sleep for the eventual consistency
                        listActivityResponse = Client.ListActivityTypes(
                            new ListActivityTypesRequest()
                        {
                            Domain             = domainName,
                            RegistrationStatus = descActivityTypeResponse.ActivityTypeDetail.TypeInfo.Status
                        });
                        if (listActivityResponse.ActivityTypeInfos.TypeInfos.Count > 0)
                        {
                            break;
                        }
                    }
                    Assert.IsNotNull(listActivityResponse);
                    Assert.IsTrue(listActivityResponse.ActivityTypeInfos.TypeInfos.Count > 0);
                    var acInfo = listActivityResponse.ActivityTypeInfos.TypeInfos.FirstOrDefault(x => x.Description == activityDescription);
                    Assert.IsNotNull(acInfo);
                }
                finally
                {
                    var depActivityRequest = new DeprecateActivityTypeRequest()
                    {
                        Domain       = domainName,
                        ActivityType = new ActivityType()
                        {
                            Name    = "My Activity",
                            Version = "1.0"
                        }
                    };

                    var depActivityTypeResponse = Client.DeprecateActivityType(depActivityRequest);
                }

                var workflowDescription = "My Workflow Description" + DateTime.Now.Ticks;
                var regWorkflowRequest  = new RegisterWorkflowTypeRequest()
                {
                    Name            = "My Workflow",
                    Domain          = domainName,
                    Description     = workflowDescription,
                    Version         = "1.0",
                    DefaultTaskList = new TaskList()
                    {
                        Name = "ImportantTasks"
                    },
                    DefaultExecutionStartToCloseTimeout = THREE_HOUR_DURATION,
                    DefaultTaskStartToCloseTimeout      = FOUR_HOUR_DURATION
                };

                var regWorkflowResponse = Client.RegisterWorkflowType(regWorkflowRequest);
                try
                {
                    Sleep(); // Sleep for the eventual consistency
                    var descWorkFlowRequest = new DescribeWorkflowTypeRequest()
                    {
                        Domain       = domainName,
                        WorkflowType = new WorkflowType()
                        {
                            Name    = "My Workflow",
                            Version = "1.0"
                        }
                    };
                    var descWorkflowResponse = Client.DescribeWorkflowType(descWorkFlowRequest);

                    Assert.AreEqual("My Workflow", descWorkflowResponse.WorkflowTypeDetail.TypeInfo.WorkflowType.Name);
                    Assert.AreEqual("1.0", descWorkflowResponse.WorkflowTypeDetail.TypeInfo.WorkflowType.Version);
                    Assert.AreEqual(THREE_HOUR_DURATION, descWorkflowResponse.WorkflowTypeDetail.Configuration.DefaultExecutionStartToCloseTimeout);
                    Assert.AreEqual(FOUR_HOUR_DURATION, descWorkflowResponse.WorkflowTypeDetail.Configuration.DefaultTaskStartToCloseTimeout);
                    Assert.AreEqual("ImportantTasks", descWorkflowResponse.WorkflowTypeDetail.Configuration.DefaultTaskList.Name);

                    ListWorkflowTypesResponse listWorkflowResponse = null;
                    for (int retries = 0; retries < 5; retries++)
                    {
                        Thread.Sleep(1000 * retries);
                        listWorkflowResponse = Client.ListWorkflowTypes(
                            new ListWorkflowTypesRequest()
                        {
                            Domain             = domainName,
                            RegistrationStatus = descWorkflowResponse.WorkflowTypeDetail.TypeInfo.Status
                        });

                        if (listWorkflowResponse.WorkflowTypeInfos.TypeInfos.Count > 0)
                        {
                            break;
                        }
                    }

                    Assert.IsTrue(listWorkflowResponse.WorkflowTypeInfos.TypeInfos.Count > 0);
                    var wfInfo = listWorkflowResponse.WorkflowTypeInfos.TypeInfos.FirstOrDefault(x => x.Description == workflowDescription);
                    Assert.IsNotNull(wfInfo);
                }
                finally
                {
                    var depWorkflowRequest = new DeprecateWorkflowTypeRequest()
                    {
                        Domain       = domainName,
                        WorkflowType = new WorkflowType()
                        {
                            Name    = "My Workflow",
                            Version = "1.0"
                        }
                    };
                    var depWorkflowTypeResponse = Client.DeprecateWorkflowType(depWorkflowRequest);
                    Assert.IsNotNull(depWorkflowTypeResponse.ResponseMetadata.RequestId);
                }
            }
            finally
            {
                var depRequest = new DeprecateDomainRequest()
                {
                    Name = domainName
                };
                var depResponse = Client.DeprecateDomain(depRequest);
                Assert.IsNotNull(depResponse.ResponseMetadata.RequestId);
            }
        }