/// <exception cref="System.Exception"></exception> public virtual void TestOnlineOfflinePusher() { Uri remote = GetReplicationURL(); // mock sync gateway CustomizableMockHttpClient mockHttpClient = new CustomizableMockHttpClient(); mockHttpClient.AddResponderFakeLocalDocumentUpdate404(); mockHttpClient.AddResponderRevDiffsSmartResponder(); HttpClientFactory mockHttpClientFactory = MockFactoryFactory(mockHttpClient); manager.SetDefaultHttpClientFactory(mockHttpClientFactory); // create a replication observer CountDownLatch replicationDoneSignal = new CountDownLatch(1); LiteTestCase.ReplicationFinishedObserver replicationFinishedObserver = new LiteTestCase.ReplicationFinishedObserver (replicationDoneSignal); // create a push replication Replication pusher = database.CreatePushReplication(remote); Log.D(Database.Tag, "created pusher: " + pusher); pusher.AddChangeListener(replicationFinishedObserver); pusher.SetContinuous(true); pusher.Start(); for (int i = 0; i < 5; i++) { Log.D(Database.Tag, "testOnlineOfflinePusher, i: " + i); string docFieldName = "testOnlineOfflinePusher" + i; // put the replication offline PutReplicationOffline(pusher); // add a response listener to wait for a bulk_docs request from the pusher CountDownLatch gotBulkDocsRequest = new CountDownLatch(1); CustomizableMockHttpClient.ResponseListener bulkDocsListener = new _ResponseListener_1334 (docFieldName, gotBulkDocsRequest); mockHttpClient.AddResponseListener(bulkDocsListener); // add a document string docFieldVal = "foo" + i; IDictionary<string, object> properties = new Dictionary<string, object>(); properties.Put(docFieldName, docFieldVal); CreateDocumentWithProperties(database, properties); // put the replication online, which should trigger it to send outgoing bulk_docs request PutReplicationOnline(pusher); // wait until we get a bulk docs request Log.D(Database.Tag, "waiting for bulk docs request with " + docFieldName); bool succeeded = gotBulkDocsRequest.Await(90, TimeUnit.Seconds); NUnit.Framework.Assert.IsTrue(succeeded); Log.D(Database.Tag, "got bulk docs request with " + docFieldName); mockHttpClient.RemoveResponseListener(bulkDocsListener); mockHttpClient.ClearCapturedRequests(); } Log.D(Database.Tag, "calling pusher.stop()"); pusher.Stop(); Log.D(Database.Tag, "called pusher.stop()"); // wait for replication to finish Log.D(Database.Tag, "waiting for replicationDoneSignal"); bool didNotTimeOut = replicationDoneSignal.Await(90, TimeUnit.Seconds); Log.D(Database.Tag, "done waiting for replicationDoneSignal. didNotTimeOut: " + didNotTimeOut); NUnit.Framework.Assert.IsTrue(didNotTimeOut); NUnit.Framework.Assert.IsFalse(pusher.IsRunning()); }
/// <summary>https://github.com/couchbase/couchbase-lite-android/issues/66</summary> /// <exception cref="System.Exception"></exception> public virtual void TestPushUpdatedDocWithoutReSendingAttachments() { NUnit.Framework.Assert.AreEqual(0, database.GetLastSequenceNumber()); IDictionary<string, object> properties1 = new Dictionary<string, object>(); properties1.Put("dynamic", 1); Document doc = CreateDocWithProperties(properties1); SavedRevision doc1Rev = doc.GetCurrentRevision(); // Add attachment to document UnsavedRevision doc2UnsavedRev = doc.CreateRevision(); InputStream attachmentStream = GetAsset("attachment.png"); doc2UnsavedRev.SetAttachment("attachment.png", "image/png", attachmentStream); SavedRevision doc2Rev = doc2UnsavedRev.Save(); NUnit.Framework.Assert.IsNotNull(doc2Rev); CustomizableMockHttpClient mockHttpClient = new CustomizableMockHttpClient(); mockHttpClient.AddResponderFakeLocalDocumentUpdate404(); // http://url/db/foo (foo==docid) mockHttpClient.SetResponder(doc.GetId(), new _Responder_1593(doc)); // create replication and add observer manager.SetDefaultHttpClientFactory(MockFactoryFactory(mockHttpClient)); Replication pusher = database.CreatePushReplication(GetReplicationURL()); RunReplication(pusher); IList<HttpWebRequest> captured = mockHttpClient.GetCapturedRequests(); foreach (HttpWebRequest httpRequest in captured) { // verify that there are no PUT requests with attachments if (httpRequest is HttpPut) { HttpPut httpPut = (HttpPut)httpRequest; HttpEntity entity = httpPut.GetEntity(); } } //assertFalse("PUT request with updated doc properties contains attachment", entity instanceof MultipartEntity); mockHttpClient.ClearCapturedRequests(); Document oldDoc = database.GetDocument(doc.GetId()); UnsavedRevision aUnsavedRev = oldDoc.CreateRevision(); IDictionary<string, object> prop = new Dictionary<string, object>(); prop.PutAll(oldDoc.GetProperties()); prop.Put("dynamic", (int)oldDoc.GetProperty("dynamic") + 1); aUnsavedRev.SetProperties(prop); SavedRevision savedRev = aUnsavedRev.Save(); mockHttpClient.SetResponder(doc.GetId(), new _Responder_1630(doc, savedRev)); string json = string.Format("{\"%s\":{\"missing\":[\"%s\"],\"possible_ancestors\":[\"%s\",\"%s\"]}}" , doc.GetId(), savedRev.GetId(), doc1Rev.GetId(), doc2Rev.GetId()); mockHttpClient.SetResponder("_revs_diff", new _Responder_1642(mockHttpClient, json )); pusher = database.CreatePushReplication(GetReplicationURL()); RunReplication(pusher); captured = mockHttpClient.GetCapturedRequests(); foreach (HttpWebRequest httpRequest_1 in captured) { // verify that there are no PUT requests with attachments if (httpRequest_1 is HttpPut) { HttpPut httpPut = (HttpPut)httpRequest_1; HttpEntity entity = httpPut.GetEntity(); NUnit.Framework.Assert.IsFalse("PUT request with updated doc properties contains attachment" , entity is MultipartEntity); } } }
/// <exception cref="System.Exception"></exception> public virtual void TestOnlineOfflinePusher() { Uri remote = GetReplicationURL(); // mock sync gateway CustomizableMockHttpClient mockHttpClient = new CustomizableMockHttpClient(); mockHttpClient.AddResponderFakeLocalDocumentUpdate404(); mockHttpClient.AddResponderRevDiffsSmartResponder(); HttpClientFactory mockHttpClientFactory = MockFactoryFactory(mockHttpClient); manager.SetDefaultHttpClientFactory(mockHttpClientFactory); // create a push replication Replication pusher = database.CreatePushReplication(remote); Log.D(Database.Tag, "created pusher: " + pusher); pusher.SetContinuous(true); pusher.Start(); for (int i = 0; i < 5; i++) { Log.D(Database.Tag, "testOnlineOfflinePusher, i: " + i); // put the replication offline PutReplicationOffline(pusher); // add a document string docFieldName = "testOnlineOfflinePusher" + i; string docFieldVal = "foo" + i; IDictionary<string, object> properties = new Dictionary<string, object>(); properties.Put(docFieldName, docFieldVal); CreateDocumentWithProperties(database, properties); // add a response listener to wait for a bulk_docs request from the pusher CountDownLatch gotBulkDocsRequest = new CountDownLatch(1); CustomizableMockHttpClient.ResponseListener bulkDocsListener = new _ResponseListener_1145 (gotBulkDocsRequest); mockHttpClient.AddResponseListener(bulkDocsListener); // put the replication online, which should trigger it to send outgoing bulk_docs request PutReplicationOnline(pusher); // wait until we get a bulk docs request Log.D(Database.Tag, "waiting for bulk docs request"); bool succeeded = gotBulkDocsRequest.Await(120, TimeUnit.Seconds); NUnit.Framework.Assert.IsTrue(succeeded); Log.D(Database.Tag, "got bulk docs request, verifying captured requests"); mockHttpClient.RemoveResponseListener(bulkDocsListener); // workaround bug https://github.com/couchbase/couchbase-lite-android/issues/219 Sharpen.Thread.Sleep(2000); // make sure that doc was pushed out in a bulk docs request bool foundExpectedDoc = false; IList<HttpWebRequest> capturedRequests = mockHttpClient.GetCapturedRequests(); foreach (HttpWebRequest capturedRequest in capturedRequests) { Log.D(Database.Tag, "captured request: " + capturedRequest); if (capturedRequest is HttpPost) { HttpPost capturedPostRequest = (HttpPost)capturedRequest; Log.D(Database.Tag, "capturedPostRequest: " + capturedPostRequest.GetURI().GetPath ()); if (capturedPostRequest.GetURI().GetPath().EndsWith("_bulk_docs")) { ArrayList docs = CustomizableMockHttpClient.ExtractDocsFromBulkDocsPost(capturedRequest ); NUnit.Framework.Assert.AreEqual(1, docs.Count); IDictionary<string, object> doc = (IDictionary)docs[0]; Log.D(Database.Tag, "doc from captured request: " + doc); Log.D(Database.Tag, "docFieldName: " + docFieldName); Log.D(Database.Tag, "expected docFieldVal: " + docFieldVal); Log.D(Database.Tag, "actual doc.get(docFieldName): " + doc.Get(docFieldName)); NUnit.Framework.Assert.AreEqual(docFieldVal, doc.Get(docFieldName)); foundExpectedDoc = true; } } } NUnit.Framework.Assert.IsTrue(foundExpectedDoc); mockHttpClient.ClearCapturedRequests(); } }