diff --git a/src/test/java/com/uber/cadence/internal/replay/StartChildWorkflowExecutionParametersTest.java b/src/test/java/com/uber/cadence/internal/replay/StartChildWorkflowExecutionParametersTest.java
new file mode 100644
index 000000000..6e0b36248
--- /dev/null
+++ b/src/test/java/com/uber/cadence/internal/replay/StartChildWorkflowExecutionParametersTest.java
@@ -0,0 +1,175 @@
+/**
+ * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ *
Modifications copyright (C) 2017 Uber Technologies, Inc.
+ *
+ *
Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file
+ * except in compliance with the License. A copy of the License is located at
+ *
+ *
http://aws.amazon.com/apache2.0
+ *
+ *
or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.uber.cadence.internal.replay;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+import static junit.framework.TestCase.assertTrue;
+
+import com.uber.cadence.ParentClosePolicy;
+import com.uber.cadence.WorkflowIdReusePolicy;
+import com.uber.cadence.WorkflowType;
+import com.uber.cadence.internal.common.RetryParameters;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Test;
+
+public class StartChildWorkflowExecutionParametersTest {
+
+ @Test
+ public void testBuilderAndGetters() {
+ String domain = "testDomain";
+ String control = "testControl";
+ long executionTimeout = 1000L;
+ byte[] input = {1, 2, 3};
+ String taskList = "testTaskList";
+ long taskTimeout = 2000L;
+ String workflowId = "testWorkflowId";
+ WorkflowType workflowType = new WorkflowType().setName("testWorkflowType");
+ WorkflowIdReusePolicy reusePolicy = WorkflowIdReusePolicy.AllowDuplicate;
+ RetryParameters retryParameters = new RetryParameters();
+ String cronSchedule = "* * * * *";
+ Map memo = new HashMap<>();
+ memo.put("key1", "value1");
+ Map searchAttributes = new HashMap<>();
+ searchAttributes.put("key2", "value2");
+ Map context = new HashMap<>();
+ context.put("key3", new byte[] {4, 5, 6});
+ ParentClosePolicy closePolicy = ParentClosePolicy.TERMINATE;
+
+ StartChildWorkflowExecutionParameters parameters =
+ new StartChildWorkflowExecutionParameters.Builder()
+ .setDomain(domain)
+ .setControl(control)
+ .setExecutionStartToCloseTimeoutSeconds(executionTimeout)
+ .setInput(input)
+ .setTaskList(taskList)
+ .setTaskStartToCloseTimeoutSeconds(taskTimeout)
+ .setWorkflowId(workflowId)
+ .setWorkflowType(workflowType)
+ .setWorkflowIdReusePolicy(reusePolicy)
+ .setRetryParameters(retryParameters)
+ .setCronSchedule(cronSchedule)
+ .setMemo(memo)
+ .setSearchAttributes(searchAttributes)
+ .setContext(context)
+ .setParentClosePolicy(closePolicy)
+ .build();
+
+ assertEquals(domain, parameters.getDomain());
+ assertEquals(control, parameters.getControl());
+ assertEquals(executionTimeout, parameters.getExecutionStartToCloseTimeoutSeconds());
+ assertEquals(taskList, parameters.getTaskList());
+ assertEquals(taskTimeout, parameters.getTaskStartToCloseTimeoutSeconds());
+ assertEquals(workflowId, parameters.getWorkflowId());
+ assertEquals(workflowType, parameters.getWorkflowType());
+ assertEquals(reusePolicy, parameters.getWorkflowIdReusePolicy());
+ assertEquals(retryParameters, parameters.getRetryParameters());
+ assertEquals(cronSchedule, parameters.getCronSchedule());
+ assertEquals(memo, parameters.getMemo());
+ assertEquals(searchAttributes, parameters.getSearchAttributes());
+ assertEquals(context, parameters.getContext());
+ assertEquals(closePolicy, parameters.getParentClosePolicy());
+ assertEquals(input, parameters.getInput());
+ }
+
+ @Test
+ public void testEqualsAndHashCode() {
+ Map memo = new HashMap<>();
+ memo.put("key1", "value1");
+
+ RetryParameters retryParameters = new RetryParameters();
+ retryParameters.setInitialIntervalInSeconds(10);
+ retryParameters.setBackoffCoefficient(2.0);
+ retryParameters.setMaximumIntervalInSeconds(100);
+ retryParameters.setMaximumAttempts(5);
+
+ String cronSchedule = "0 * * * *";
+
+ Map searchAttributes = new HashMap<>();
+ searchAttributes.put("attrKey1", "attrValue1");
+
+ Map context = new HashMap<>();
+ context.put("contextKey1", new byte[] {4, 5, 6});
+
+ StartChildWorkflowExecutionParameters parameters1 =
+ new StartChildWorkflowExecutionParameters.Builder()
+ .setDomain("domain1")
+ .setControl("control1")
+ .setExecutionStartToCloseTimeoutSeconds(1000L)
+ .setInput(new byte[] {1, 2, 3})
+ .setTaskList("taskList1")
+ .setTaskStartToCloseTimeoutSeconds(2000L)
+ .setWorkflowId("workflowId1")
+ .setWorkflowType(new WorkflowType().setName("workflowType1"))
+ .setWorkflowIdReusePolicy(WorkflowIdReusePolicy.AllowDuplicate)
+ .setRetryParameters(retryParameters)
+ .setCronSchedule(cronSchedule)
+ .setMemo(memo)
+ .setSearchAttributes(searchAttributes)
+ .setContext(context)
+ .setParentClosePolicy(ParentClosePolicy.TERMINATE)
+ .build();
+
+ StartChildWorkflowExecutionParameters parameters2 =
+ new StartChildWorkflowExecutionParameters.Builder()
+ .setDomain("domain1")
+ .setControl("control1")
+ .setExecutionStartToCloseTimeoutSeconds(1000L)
+ .setInput(new byte[] {1, 2, 3})
+ .setTaskList("taskList1")
+ .setTaskStartToCloseTimeoutSeconds(2000L)
+ .setWorkflowId("workflowId1")
+ .setWorkflowType(new WorkflowType().setName("workflowType1"))
+ .setWorkflowIdReusePolicy(WorkflowIdReusePolicy.AllowDuplicate)
+ .setRetryParameters(retryParameters)
+ .setCronSchedule(cronSchedule)
+ .setMemo(memo)
+ .setSearchAttributes(searchAttributes)
+ .setContext(context)
+ .setParentClosePolicy(ParentClosePolicy.TERMINATE)
+ .build();
+
+ assertEquals(parameters1, parameters2);
+ assertEquals(parameters1.hashCode(), parameters2.hashCode());
+ }
+
+ @Test
+ public void testToString() {
+ StartChildWorkflowExecutionParameters parameters =
+ new StartChildWorkflowExecutionParameters.Builder()
+ .setDomain("testDomain")
+ .setControl("testControl")
+ .setExecutionStartToCloseTimeoutSeconds(1000L)
+ .setInput(new byte[] {1, 2, 3})
+ .setTaskList("testTaskList")
+ .setTaskStartToCloseTimeoutSeconds(2000L)
+ .setWorkflowId("testWorkflowId")
+ .setWorkflowType(new WorkflowType().setName("testWorkflowType"))
+ .setWorkflowIdReusePolicy(WorkflowIdReusePolicy.AllowDuplicate)
+ .setRetryParameters(new RetryParameters())
+ .setCronSchedule("* * * * *")
+ .setMemo(new HashMap<>())
+ .setSearchAttributes(new HashMap<>())
+ .setContext(new HashMap<>())
+ .setParentClosePolicy(ParentClosePolicy.TERMINATE)
+ .build();
+
+ assertNotNull(parameters.toString());
+ assertTrue(parameters.toString().contains("testDomain"));
+ assertTrue(parameters.toString().contains("testControl"));
+ assertTrue(parameters.toString().contains("1000"));
+ }
+}