public void Builder_Throws_BuildFailureException_When_Source_POST_Returns_Fail_In_Body()
        {
            MockRepository repo = new MockRepository(MockBehavior.Loose);
            Mock<IHttpWebRequest> mockPostRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockPostResponse = repo.Create<HttpWebResponse>();
            Mock<HttpWebRequestFactory> mockFactory = repo.Create<HttpWebRequestFactory>();
            Mock<PlatformResources> mockResource = repo.Create<PlatformResources>();
            MemoryStream responseStream = new MemoryStream(Encoding.UTF8.GetBytes("{ \"result\": \"badstatus\", \"id\": \"" + Guid.NewGuid() + "\" }"));

            //mock up resources
            mockResource.Setup(p => p.AndroidKeystore).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSCertificate).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSProfile).Returns(new MemoryStream());

            //mock up first "POST" request it will make
            mockPostRequest.Setup(p => p.GetRequestStream()).Returns(new MemoryStream());
            mockPostRequest.Setup(p => p.GetResponse()).Returns(mockPostResponse.Object);
            mockPostResponse.Setup(p => p.StatusCode).Returns(HttpStatusCode.OK);
            mockPostResponse.Setup(p => p.GetResponseStream()).Returns(responseStream);

            //setup request factory
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "POST"), It.Is<string>(s => s == postURL))).Returns(mockPostRequest.Object);

            StandaloneHttpBuilder b = new StandaloneHttpBuilder(mockFactory.Object, postURL, monitorURL, email, password);
            try
            {
                b.BuildForPlatforms(BuildPlatform.iOS | BuildPlatform.Android, new MemoryStream(), mockResource.Object);
                Assert.Fail();
            }
            catch (BuildFailureException e)
            {
            }
        }
        public void Builder_Throws_BuildFailureException_When_Source_POST_Fail_StatusCode()
        {
            MockRepository repo = new MockRepository(MockBehavior.Loose);
            Mock<IHttpWebRequest> mockPostRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockPostResponse = repo.Create<HttpWebResponse>();
            Mock<HttpWebRequestFactory> mockFactory = repo.Create<HttpWebRequestFactory>();
            Mock<PlatformResources> mockResource = repo.Create<PlatformResources>();

            //mock up resources
            mockResource.Setup(p => p.AndroidKeystore).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSCertificate).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSProfile).Returns(new MemoryStream());

            //mock up first "POST" request it will make
            mockPostRequest.Setup(p => p.GetRequestStream()).Returns(new MemoryStream());
            mockPostRequest.Setup(p => p.GetResponse()).Returns(mockPostResponse.Object);
            mockPostResponse.Setup(p => p.StatusCode).Returns(HttpStatusCode.InternalServerError);

            //setup request factory
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "POST"), It.Is<string>(s => s == postURL))).Returns(mockPostRequest.Object);

            StandaloneHttpBuilder b = new StandaloneHttpBuilder(mockFactory.Object, postURL, monitorURL, email, password);
            try
            {
                b.BuildForPlatforms(BuildPlatform.iOS | BuildPlatform.Android, new MemoryStream(), mockResource.Object);
                Assert.Fail();
            }
            catch (BuildFailureException e)
            {
            }
        }
        public void Builder_Downloads_Returns_Android_Correctly()
        {
            MockRepository repo = new MockRepository(MockBehavior.Loose);
            Mock<IHttpWebRequest> mockPostRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockPostResponse = repo.Create<HttpWebResponse>();
            Mock<IHttpWebRequest> mockMonitorRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockMonitorResponse = repo.Create<HttpWebResponse>();
            Mock<IHttpWebRequest> mockAndroidDownloadRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockAndroidDownloadResponse = repo.Create<HttpWebResponse>();
            Mock<IHttpWebRequest> mockiosDownloadRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockiosDownloadResponse = repo.Create<HttpWebResponse>();
            Mock<HttpWebRequestFactory> mockFactory = repo.Create<HttpWebRequestFactory>();
            Mock<PlatformResources> mockResource = repo.Create<PlatformResources>();
            Guid monitorId = Guid.NewGuid();
            string androidurl = "androidurl", androidpackagecontents = "ANDROIDPACKAGE";
            MemoryStream postResponseStream = new MemoryStream(Encoding.UTF8.GetBytes("{ \"result\": \"ok\", \"id\": \"" + monitorId + "\" }"));
            MemoryStream monitorResponseStream = new MemoryStream(Encoding.UTF8.GetBytes("{ \"state\": \"success\", \"info\": { \"files\": { \"android\": \"" + androidurl + "\" } } }"));
            MemoryStream downloadStream = new MemoryStream(Encoding.UTF8.GetBytes(androidpackagecontents));

            //mock up resources
            mockResource.Setup(p => p.AndroidKeystore).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSCertificate).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSProfile).Returns(new MemoryStream());

            //mock up content "POST" request/response
            mockPostRequest.Setup(p => p.GetRequestStream()).Returns(new MemoryStream());
            mockPostRequest.Setup(p => p.GetResponse()).Returns(mockPostResponse.Object);
            mockPostResponse.Setup(p => p.StatusCode).Returns(HttpStatusCode.OK);
            mockPostResponse.Setup(p => p.GetResponseStream()).Returns(postResponseStream);

            //mock up monitoring "GET" request/response
            mockMonitorResponse.Setup(g => g.StatusCode).Returns(HttpStatusCode.OK);
            mockMonitorResponse.Setup(g => g.GetResponseStream()).Returns(monitorResponseStream);
            mockMonitorRequest.Setup(g => g.GetResponse()).Returns(mockMonitorResponse.Object);

            //mock up Android download request/response
            mockAndroidDownloadResponse.Setup(g => g.StatusCode).Returns(HttpStatusCode.OK);
            mockAndroidDownloadResponse.Setup(g => g.GetResponseStream()).Returns(downloadStream);
            mockAndroidDownloadRequest.Setup(g => g.GetResponse()).Returns(mockAndroidDownloadResponse.Object);

            //setup request factory
            string instanceMonitorURL = String.Format("{0}/{1}?email={2}&password={3}", monitorURL, monitorId, email, password);
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "POST"), It.Is<string>(s => s == postURL))).Returns(mockPostRequest.Object);
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "GET"), It.Is<string>(s => s == instanceMonitorURL))).Returns(mockMonitorRequest.Object);
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "GET"), It.Is<string>(s => s == androidurl))).Returns(mockAndroidDownloadRequest.Object);

            StandaloneHttpBuilder b = new StandaloneHttpBuilder(mockFactory.Object, postURL, monitorURL, email, password);
            Dictionary<BuildPlatform, MemoryStream> dict = b.BuildForPlatforms(BuildPlatform.Android, new MemoryStream(), mockResource.Object);

            Assert.IsNotNull(dict);
            Assert.IsTrue(dict.ContainsKey(BuildPlatform.Android));
            Assert.IsNotNull(dict[BuildPlatform.Android]);
            string downloaded = string.Empty;

            byte[] buff = new byte[dict[BuildPlatform.Android].Length];
            dict[BuildPlatform.Android].Read(buff, 0, buff.Length);
            downloaded = Encoding.UTF8.GetString(buff);
            Assert.AreEqual(downloaded, androidpackagecontents);

            mockFactory.VerifyAll();
        }
        public void Builder_Throws_BuildFailureException_When_Monitoring_URL_Returns_Fail_StatusCode()
        {
            MockRepository repo = new MockRepository(MockBehavior.Loose);
            Mock<IHttpWebRequest> mockPostRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockPostResponse = repo.Create<HttpWebResponse>();
            Mock<IHttpWebRequest> mockMonitorRequest = repo.Create<IHttpWebRequest>();
            Mock<HttpWebResponse> mockMonitorResponse = repo.Create<HttpWebResponse>();
            Mock<HttpWebRequestFactory> mockFactory = repo.Create<HttpWebRequestFactory>();
            Mock<PlatformResources> mockResource = repo.Create<PlatformResources>();
            Guid monitorId = Guid.NewGuid();
            MemoryStream responseStream = new MemoryStream(Encoding.UTF8.GetBytes("{ \"result\": \"ok\", \"id\": \"" + monitorId + "\" }"));

            //mock up resources
            mockResource.Setup(p => p.AndroidKeystore).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSCertificate).Returns(new MemoryStream());
            mockResource.Setup(p => p.iOSProfile).Returns(new MemoryStream());

            //mock up content "POST" request/response
            mockPostRequest.Setup(p => p.GetRequestStream()).Returns(new MemoryStream());
            mockPostRequest.Setup(p => p.GetResponse()).Returns(mockPostResponse.Object);
            mockPostResponse.Setup(p => p.StatusCode).Returns(HttpStatusCode.OK);
            mockPostResponse.Setup(p => p.GetResponseStream()).Returns(responseStream);

            //mock up monitoring "GET" request/response
            mockMonitorResponse.Setup(g => g.StatusCode).Returns(HttpStatusCode.BadRequest);
            mockMonitorRequest.Setup(g => g.GetResponse()).Returns(mockMonitorResponse.Object);

            //setup request factory
            string instanceMonitorURL = String.Format("{0}/{1}?email={2}&password={3}", monitorURL, monitorId, email, password);
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "POST"), It.Is<string>(s => s == postURL))).Returns(mockPostRequest.Object);
            mockFactory.Setup(f => f.BuildRequest(It.Is<string>(s => s == "GET"), It.Is<string>(s => s == instanceMonitorURL))).Returns(mockMonitorRequest.Object);

            StandaloneHttpBuilder b = new StandaloneHttpBuilder(mockFactory.Object, postURL, monitorURL, email, password);
            try
            {
                b.BuildForPlatforms(BuildPlatform.iOS | BuildPlatform.Android, new MemoryStream(), mockResource.Object);
                Assert.Fail();
            }
            catch (BuildFailureException e)
            {
            }
        }