public async Task GetUploadSessionOnProgressingUpload()
        {
            // Arrange
            var responseHandler = new UploadResponseHandler();
            var hrm             = new HttpResponseMessage
            {
                Content    = new StringContent(@"{
                  ""expirationDateTime"": ""2015 - 01 - 29T09: 21:55.523Z"",
                  ""nextExpectedRanges"": [
                  ""12345-55232"",
                  ""77829-99375""
                  ]
                }", Encoding.UTF8, "application/json"),
                StatusCode = HttpStatusCode.OK//upload successful!
            };

            // Act
            var uploadResult = await responseHandler.HandleResponse <DriveItem>(hrm);

            var uploadSession = uploadResult.UploadSession;

            //Assert
            Assert.False(uploadResult.UploadSucceeded);
            Assert.NotNull(uploadSession);
            Assert.Null(uploadSession.UploadUrl);
            Assert.Equal(DateTimeOffset.Parse("2015 - 01 - 29T09: 21:55.523Z"), uploadSession.ExpirationDateTime);
            Assert.Equal("12345-55232", uploadSession.NextExpectedRanges.First());
            Assert.Equal("77829-99375", uploadSession.NextExpectedRanges.Last());
            Assert.Equal(2, uploadSession.NextExpectedRanges.Count());
        }
        public async Task GetDriveItemOnCompletedUpload(HttpStatusCode statusCode)
        {
            // Arrange
            var responseHandler = new UploadResponseHandler();
            var hrm             = new HttpResponseMessage
            {
                Content    = new StringContent(@"{
                    ""id"": ""912310013A123"",
                    ""name"": ""largeFile.vhd"",
                    ""size"": 33
                }", Encoding.UTF8, "application/json"),
                StatusCode = statusCode//upload successful!
            };

            // Act
            var uploadResult = await responseHandler.HandleResponse <DriveItem>(hrm);

            var driveItem = uploadResult.ItemResponse;

            //Assert
            Assert.True(uploadResult.UploadSucceeded);
            Assert.NotNull(driveItem);
            Assert.Equal("912310013A123", driveItem.Id);
            Assert.Equal("largeFile.vhd", driveItem.Name);
            Assert.Equal(33, driveItem.Size);
        }
        public async Task ThrowsSerializationErrorOnInvalidJson()
        {
            // Arrange
            var responseHandler = new UploadResponseHandler();
            //The message has a missing open brace in the json payload.
            string malformedResponse = @"
                  ""error"": {
                    ""code"": ""InvalidAuthenticationToken"",
                    ""message"": ""Access token is empty."",
                    ""innerError"": {
                                ""request-id"": ""0e4cbf06-018b-4596-8614-50d5f7eef218"",
                                ""date"": ""2019-11-21T13:57:37""
                            }
                        }
                    }";

            var hrm = new HttpResponseMessage
            {
                Content    = new StringContent(malformedResponse, Encoding.UTF8, "application/json"),
                StatusCode = HttpStatusCode.Unauthorized//error
            };

            // Act
            var serviceException = await Assert.ThrowsAsync <ServiceException>(() => responseHandler.HandleResponse <DriveItem>(hrm));

            //Assert
            Assert.NotNull(serviceException);
            Assert.Equal(ErrorConstants.Codes.GeneralException, serviceException.Error.Code);
            Assert.Equal(ErrorConstants.Messages.UnableToDeserializeContent, serviceException.Error.Message);
            Assert.Equal(malformedResponse, serviceException.RawResponseBody);
        }
        public async Task ThrowsServiceExceptionOnErrorResponse()
        {
            // Arrange
            var responseHandler = new UploadResponseHandler();
            var hrm             = new HttpResponseMessage
            {
                Content    = new StringContent(@"{
                  ""error"": {
                    ""code"": ""InvalidAuthenticationToken"",
                    ""message"": ""Access token is empty."",
                    ""innerError"": {
                                ""request-id"": ""0e4cbf06-018b-4596-8614-50d5f7eef218"",
                                ""date"": ""2019-11-21T13:57:37""
                            }
                        }
                    }", Encoding.UTF8, "application/json"),
                StatusCode = HttpStatusCode.Unauthorized//error
            };

            // Act
            var serviceException = await Assert.ThrowsAsync <ServiceException>(() => responseHandler.HandleResponse <DriveItem>(hrm));

            //Assert
            Assert.NotNull(serviceException);
            Assert.Equal("Access token is empty.", serviceException.Error.Message);
            Assert.Equal("InvalidAuthenticationToken", serviceException.Error.Code);
            Assert.Equal(HttpStatusCode.Unauthorized, serviceException.StatusCode);
        }
        public async Task GetFileAttachmentLocationItemOnCompletedUpload()
        {
            // Arrange
            var responseHandler = new UploadResponseHandler();
            var hrm             = new HttpResponseMessage()
            {
                Content = new StringContent("")
            };

            hrm.Headers.Location = new Uri("http://localhost");
            hrm.StatusCode       = HttpStatusCode.Created;//upload successful!

            // Act
            var uploadResult = await responseHandler.HandleResponse <DriveItem>(hrm);

            var fileAttachment = uploadResult.ItemResponse;

            //Assert
            Assert.True(uploadResult.UploadSucceeded);
            Assert.Null(fileAttachment);
            Assert.Equal("http://localhost", uploadResult.Location.OriginalString);
        }
    IEnumerator UploadDataForVerification(string data, UploadResponseHandler handler)
    {
        string          serverAddr = "http://" + myAuthServerAddr + ":" + myAuthServerPort + gcAuthPath;
        UnityWebRequest www        = UnityWebRequest.Put(serverAddr, data);

        yield return(www.Send());

        if (www.isError)
        {
            Debug.Log(www.error);
        }
        else
        {
            try {
                TokenData tokenData = JsonUtility.FromJson <TokenData>(www.downloadHandler.text);
                handler(tokenData);
            }
            catch (Exception e) {
                Debug.Log("parsed token failed:" + e);
                handler(null);
            }
        }
    }