private string GetJsonTextForNewDeviceDataForPostUpload()
        {
            /** BEGIN: Snippet to Update RAW Json Request with Base 64 String that was set from file **/
            APIBuiltInTestCase selectedBuiltInTest = (
                from i in BuiltInTestCaseRepo.Instance.AllTestCases
                where i.Name.Equals(cBBuiltInTests.Text)
                select i).FirstOrDefault();

            if (chkBxUseFile.Checked && selectedBuiltInTest != null &&
                selectedBuiltInTest.GetType().Equals(typeof(PostUploadTest)) &&
                !string.IsNullOrEmpty(base64String))
            {
                try
                {
                    PostUploadDTO postUploadDTO = Newtonsoft.Json.JsonConvert.DeserializeObject <PostUploadDTO>(new Regex("(\r\n|\r|\n)").Replace(txtBxRequest.Text, ""));
                    postUploadDTO.ActivityFiles.FirstOrDefault().DeviceData = base64String;

                    JsonSerializerSettings jsonFormatter = new JsonSerializerSettings
                    {
                        Formatting           = Newtonsoft.Json.Formatting.Indented,
                        DateFormatHandling   = DateFormatHandling.IsoDateFormat,
                        DateTimeZoneHandling = DateTimeZoneHandling.Utc
                    };
                    return(JsonConvert.SerializeObject(postUploadDTO, jsonFormatter));
                }
                catch { }
            }
            /** END: Snippet to Update Json Request with Base 64 String **/
            return(null);
        }
        /// <summary>
        /// Updated 'Device Data' field in request text box
        /// </summary>
        /// <param name="value"></param>
        private void UpdateDeviceDataInRequestTextBoxForPostUpload(string value)
        {
            APIBuiltInTestCase apiTest = (
                from i in BuiltInTestCaseRepo.Instance.AllTestCases
                where i.Name.Equals(cBBuiltInTests.Text)
                select i).FirstOrDefault();

            if (apiTest.GetType().Equals(typeof(PostUploadTest)))
            {
                PostUploadDTO postUploadDTO = Newtonsoft.Json.JsonConvert.DeserializeObject <PostUploadDTO>(new Regex("(\r\n|\r|\n)").Replace(txtBxRequest.Text, ""));
                postUploadDTO.ActivityFiles.FirstOrDefault().DeviceData = value;

                JsonSerializerSettings jsonFormatter = new JsonSerializerSettings {
                    Formatting           = Newtonsoft.Json.Formatting.Indented,
                    DateFormatHandling   = DateFormatHandling.IsoDateFormat,
                    DateTimeZoneHandling = DateTimeZoneHandling.Utc
                };
                txtBxRequest.Text = JsonConvert.SerializeObject(postUploadDTO, jsonFormatter);
            }
        }
        private async Task SendRequest(long requestNumber, long totalRequests)
        {
            APIEndpointExecuter       apiEndpointExecuter       = null;
            APIEndpointExecuterResult apiEndpointExecuterResult = null;
            string         jsonResponse   = string.Empty;
            string         jsonRequestRaw = txtBxRequest.Text;
            DateTimeOffset requestTime;
            DateTime       responseTime;

            try
            {
                // Clear Status Code label
                lblStatusCode.Text         = String.Empty;
                btnCompareResponse.Enabled = false;

                // remove trailing '/' from baseURI
                if (txtBaseURI.Text.EndsWith("/"))
                {
                    txtBaseURI.Text = txtBaseURI.Text.Remove(txtBaseURI.Text.Length - 1, 1);
                }
                if (!txtBxURI.Text.StartsWith("/"))
                {
                    txtBxURI.Text = "/" + txtBxURI.Text;                                                 // add trailing '/' to uri if it doesnt exist
                }
                // Updating Client State Before Execution
                ClientState.BaseURI   = txtBaseURI.Text;
                ClientState.AccessKey = txtBxAccessKey.Text;
                ClientState.SecretKey = txtBxSecretKey.Text;

                // Create Endpoint Executer
                apiEndpointExecuter = new APIEndpointExecuter(ClientState.BaseURI + txtBxURI.Text, (HttpMethod)cbHttpMethod.SelectedItem);

                // Hide "Waiting For Response..." label
                lblStatus.Text    = "[ " + requestNumber + " / " + totalRequests + " ] Waiting For Response...";
                lblStatus.Visible = true;

                // disable send request button while text is running
                btnSendRequest.Enabled = false;



                /** BEGIN: Snippet to Update RAW Json Request with Base 64 String that was set from file **/
                APIBuiltInTestCase selectedBuiltInTest = (
                    from i in BuiltInTestCaseRepo.Instance.AllTestCases
                    where i.Name.Equals(cBBuiltInTests.Text)
                    select i).FirstOrDefault();

                if (chkBxUseFile.Checked && selectedBuiltInTest != null &&
                    selectedBuiltInTest.GetType().Equals(typeof(PostUploadTest)) && !string.IsNullOrEmpty(base64String))
                {
                    try
                    {
                        jsonRequestRaw = GetJsonTextForNewDeviceDataForPostUpload();
                    }
                    catch { }
                }
                /** END: Snippet to Update Json Request with Base 64 String **/

                // await for async method to finish
                apiEndpointExecuterResult = await apiEndpointExecuter.Run(new Regex("(\r\n|\r|\n)").Replace(jsonRequestRaw, ""));

                jsonResponse = apiEndpointExecuterResult.ResponseContent;

                // Set last Json response for tool
                lastJsonResponse = jsonResponse;

                // Hide status label
                lblStatus.Visible = false;

                // Enable Compare Button
                btnCompareResponse.Enabled = true;

                // Update Response Status Code
                if (apiEndpointExecuterResult.Response.StatusCode.Equals(System.Net.HttpStatusCode.OK) || apiEndpointExecuterResult.Response.StatusCode.Equals(System.Net.HttpStatusCode.Created))
                {
                    lblStatusCode.ForeColor = Color.Green;
                    lblStatusCode.Image     = StudyAdminAPITester.Properties.Resources.check_smaller;
                }
                else
                {
                    lblStatusCode.ForeColor = Color.Red;
                    lblStatusCode.Image     = StudyAdminAPITester.Properties.Resources.cancel_small;
                }

                lblStatusCode.ImageAlign = ContentAlignment.MiddleLeft;
                lblStatusCode.Text       = string.Format("      HTTP Status Code {0} {1}",
                                                         (int)apiEndpointExecuterResult.Response.StatusCode, (string)apiEndpointExecuterResult.Response.StatusCode.ToString());

                // Update Log
                lblStatus.Text    = "[ " + requestNumber + " / " + totalRequests + " ] Updating Response Log...";
                lblStatus.Visible = true;
                this.Refresh();

                InsertResposneToLog(jsonResponse, apiEndpointExecuterResult.Response.StatusCode);
                InsertRequestToLog(apiEndpointExecuter, apiEndpointExecuterResult, txtBxRequest.Text);

                txtBxResponse.Text = await Task.Run(() =>
                {
                    return(sbLog.ToString());
                });

                // Hide status label
                lblStatus.Visible = false;

                // Focus on Response text box
                txtBxResponse.Focus();
            }
            catch (HttpRequestException)
            {
                lblError.Text = string.Format("A problem occured while sending request to {0}", apiEndpointExecuter._Uri);
            }
            catch (Exception)             // Catch Everything else
            {
                lblError.Text = "A problem has occured. Please contact the Study Admin Team.";
            }
            finally
            {
                lblStatus.Visible = false;
            }
        }
        public TestForm()
        {
            InitializeComponent();
            sbLog = new StringBuilder();

            System.Version current = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
            //Major.Minor.Build.Revision
            //Show as many decimals as we need to for the version (ie: 2.0 instead of 2.0.0.0)
            this.Text += " v" + current.ToString(current.Revision != 0 ? 4 : current.Build != 0 ? 3 : 2);

            lblRequestCount.Visible   = false;
            txtBxRequestCount.Visible = false;

            // Add items to Base URI combo box
            ClientState.BaseURI = "https://studyadmin-api-dev.actigraphcorp.com"; // defaults to dev
            txtBaseURI.Text     = ClientState.BaseURI;

            // Populate HttpMethod Dropdown list and default it to "GET" request type
            cbHttpMethod.Items.Add(HttpMethod.Get);
            cbHttpMethod.Items.Add(HttpMethod.Post);
            cbHttpMethod.Items.Add(HttpMethod.Put);
            cbHttpMethod.SelectedIndex = 0;
            txtBxRequest.Enabled       = false;

            // Populdate File Type Combo Box for Upload
            cmBxFileType.Items.Add("EPOCH");
            cmBxFileType.SelectedIndex = 0;

            lblStatusCode.Text        = string.Empty;
            btnSendRequest.Enabled    = false;
            lblError.Text             = string.Empty;
            lblAccessKeyRequired.Text = string.Empty;
            lblSecretKeyRequired.Text = string.Empty;
            lblError.Text             = string.Empty;
            lblBaseURIRequired.Text   = string.Empty;

            // Populate Built-In Tests Combo Box
            cBBuiltInTests.Items.Add("--------------- Subject Endpoints ---------------");
            foreach (var i in BuiltInTestCaseRepo.Instance.SubjectTestCases)
            {
                cBBuiltInTests.Items.Add(i);
            }

            cBBuiltInTests.Items.Add("--------------- Site Endpoints ---------------");
            foreach (var i in BuiltInTestCaseRepo.Instance.SiteTestCases)
            {
                cBBuiltInTests.Items.Add(i);
            }

            cBBuiltInTests.Items.Add("--------------- Study Endpoints ---------------");
            foreach (var i in BuiltInTestCaseRepo.Instance.StudyTestCases)
            {
                cBBuiltInTests.Items.Add(i);
            }

            cBBuiltInTests.Items.Add("--------------- Upload Endpoints ---------------");
            foreach (var i in BuiltInTestCaseRepo.Instance.UploadTestCases)
            {
                cBBuiltInTests.Items.Add(i);
            }

            cBBuiltInTests.Items.Add("--------------- WebHooks Endpoints ---------------");
            foreach (var i in BuiltInTestCaseRepo.Instance.WebHooksTestCases)
            {
                cBBuiltInTests.Items.Add(i);
            }

            cBBuiltInTests.Items.Insert(0, "");

            // Setting Help LInk
            linkLabelHelp.Click += (o, e) => { Process.Start("https://github.com/actigraph/StudyAdminAPIDocumentation"); };

            // Set defaults for access and secret keys
            defaultAccessKeyText       = "<Enter Access Key>";
            txtBxAccessKey.Text        = defaultAccessKeyText;
            txtBxAccessKey.MouseClick += (o, e) =>
            {
                if (txtBxAccessKey.Text.Equals(defaultAccessKeyText))
                {
                    txtBxAccessKey.Text = string.Empty;
                }
            };

            defaultSecretKeyText       = "<Enter Secret Key>";
            txtBxSecretKey.Text        = defaultSecretKeyText;
            txtBxSecretKey.MouseClick += (o, e) =>
            {
                if (txtBxSecretKey.Text.Equals(defaultSecretKeyText))
                {
                    txtBxSecretKey.Text = string.Empty;
                }
            };


            cbHttpMethod.SelectedIndexChanged += (o, e) =>
            {
                txtBxRequest.Enabled = true;
                if (((HttpMethod)cbHttpMethod.SelectedItem).Equals(HttpMethod.Get))
                {
                    txtBxRequest.Clear();
                    txtBxRequest.Enabled = false;
                }
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            btnSelectActivityFile.Click += (o, e) =>
            {
                using (var openFileDialog = new OpenFileDialog())
                {
                    DialogResult result = openFileDialog.ShowDialog();

                    if (!string.IsNullOrEmpty(openFileDialog.FileName))
                    {
                        using (var fileStream = new System.IO.FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read))
                        {
                            byte[] filebytes = new byte[fileStream.Length];
                            fileStream.Read(filebytes, 0, Convert.ToInt32(fileStream.Length));

                            APIBuiltInTestCase apiTest = (
                                from i in BuiltInTestCaseRepo.Instance.AllTestCases
                                where i.Name.Equals(cBBuiltInTests.Text)
                                select i).FirstOrDefault();

                            if (apiTest.GetType().Equals(typeof(PostUploadTest)))
                            {
                                PostUploadTest test = ((PostUploadTest)apiTest);
                                base64String = Convert.ToBase64String(filebytes);

                                // Put placeholder here
                                test.SetDeviceData("<" + new FileInfo(openFileDialog.FileName).Name + ">");

                                test.SetFileType(cmBxFileType.SelectedItem.ToString());
                                btnPopualte.PerformClick();
                            }
                        }
                    }
                    else
                    {
                        UpdateDeviceDataInRequestTextBoxForPostUpload(string.Empty);
                    }
                }
            };

            // btnPopulate click action for button
            btnPopualte.Click += (o, e) =>
            {
                // clear response box when selecting new built in test
                lblStatusCode.Text         = string.Empty;
                btnCompareResponse.Enabled = false;

                APIBuiltInTestCase apiTest = (
                    from i in BuiltInTestCaseRepo.Instance.AllTestCases
                    where i.Name.Equals(cBBuiltInTests.Text)
                    select i).FirstOrDefault();

                if (apiTest != null)
                {
                    txtBxURI.Text             = apiTest.DefaultResourceURI;
                    cbHttpMethod.SelectedItem = apiTest.HttpVerb;
                    pnlActivityFile.Enabled   = apiTest.AllowActivityFilePanal;

                    if (((HttpMethod)cbHttpMethod.SelectedItem).Equals(HttpMethod.Get))
                    {
                        btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
                        txtBxRequest.Enabled   = false;
                        txtBxRequest.Clear();
                    }
                    else
                    {
                        txtBxRequest.Enabled = true;
                        txtBxRequest.Text    = "Loading Request Content...";
                        txtBxRequest.Text    = apiTest.GetJsonRequestText();
                    }
                }
                else
                {
                    txtBxRequest.Clear();
                }
            };


            // Open Compare Response Form in Dialog Box
            btnCompareResponse.Click += (o, e) =>
            {
                CompareResponse compareResponse = new CompareResponse(lastJsonResponse);
                compareResponse.ShowDialog();
            };

            txtBxAccessKey.TextChanged += (o, e) =>
            {
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            txtBxSecretKey.TextChanged += (o, e) =>
            {
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            txtBaseURI.TextChanged += (o, e) =>
            {
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            txtBxRequest.TextChanged += (o, e) =>
            {
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            txtBxURI.TextChanged += (o, e) =>
            {
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            int previousSplitterDisatnace = splitContainerRequest.SplitterDistance;

            splitContainerRequest.SplitterMoved += (o, e) =>
            {
                if (grpBxResponse.Height <= 20)
                {
                    splitContainerRequest.SplitterDistance = previousSplitterDisatnace;
                }
                else
                {
                    previousSplitterDisatnace = splitContainerRequest.SplitterDistance;
                }
            };

            rdBtnPerformMultipleReqTrue.CheckedChanged += (o, e) =>
            {
                lblRequestCount.Visible   = rdBtnPerformMultipleReqTrue.Checked;
                txtBxRequestCount.Visible = rdBtnPerformMultipleReqTrue.Checked;
                if (txtBxRequestCount.Visible && string.IsNullOrEmpty(txtBxRequestCount.Text))
                {
                    txtBxRequestCount.Text = "10000";
                }
            };

            // setting click action for execute button
            btnSendRequest.Click += async(o, e) =>
            {
                // represents the number of request to make to single endpoint
                long totalRequestNumber = 1;

                // check for multiple requests
                lblError.Text = "";
                if (rdBtnPerformMultipleReqTrue.Checked)
                {
                    if (!long.TryParse(txtBxRequestCount.Text, out totalRequestNumber))
                    {
                        lblError.Text = "Request count is invalid";
                        return;
                    }
                    multipleRequestsRunning = true;
                }

                for (int i = 0; i < totalRequestNumber; i++)
                {
                    await SendRequest(i + 1, totalRequestNumber);
                }

                multipleRequestsRunning = false;

                // re-enable send request button after request is complete
                btnSendRequest.Enabled = this.ShouldSendRequestButtonBeEnabled;
            };

            #region response right click menu

            toolStripMenuItemClearLog.Click += (obj, sender) =>
            {
                txtBxResponse.Clear();
                sbLog.Clear();
                lblStatusCode.Text        = string.Empty;
                lblError.Text             = string.Empty;
                lblAccessKeyRequired.Text = string.Empty;
                lblSecretKeyRequired.Text = string.Empty;
                lblBaseURIRequired.Text   = string.Empty;
            };

            toolStripMenuItemSaveLog.Click += (obj, sender) =>
            {
                using (var saveFileDialog = new SaveFileDialog())
                {
                    saveFileDialog.Filter = "TXT Files (*.txt)|*.txt";
                    saveFileDialog.Title  = "Save to a text File";
                    var result = saveFileDialog.ShowDialog();
                    if (result != DialogResult.OK)
                    {
                        return;
                    }

                    using (StreamWriter s = new StreamWriter(saveFileDialog.FileName))
                        s.Write(txtBxResponse.Text);

                    Process.Start(saveFileDialog.FileName);
                }
            };

            #endregion response right click menu
        }