/// <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);
         }
     }
 }
コード例 #3
0
		/// <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();
			}
		}