public void TestBatcherSingleBatch() { doneSignal = new CountdownEvent(10); inboxCapacity = 10; processorDelay = 1000; var scheduler = new SingleTaskThreadpoolScheduler(); var batcher = new Batcher<string>(new TaskFactory(scheduler), inboxCapacity, processorDelay, TestBatcherSingleBatchProcessor); var objectsToQueue = new List<string>(); for (var i = 0; i < inboxCapacity * 10; i++) { objectsToQueue.Add(i.ToString()); } batcher.QueueObjects(objectsToQueue); var success = doneSignal.Wait(TimeSpan.FromSeconds(35)); Assert.IsTrue(success); }
/// <summary> /// Creates a new <see cref="Couchbase.Lite.Replication"/> that will pull from the source <see cref="Couchbase.Lite.Database"/> at the given url. /// </summary> /// <returns>A new <see cref="Couchbase.Lite.Replication"/> that will pull from the source Database at the given url.</returns> /// <param name="url">The url of the source Database.</param> public Replication CreatePullReplication(Uri url) { var scheduler = new SingleTaskThreadpoolScheduler(); return new Puller(this, url, false, new TaskFactory(scheduler)); }
public void TestBatcherCancel() { var mre = new ManualResetEventSlim(); var scheduler = new SingleTaskThreadpoolScheduler(); var batcher = new Batcher<int>(new TaskFactory(scheduler), 5, 500, (inbox) => { mre.Set(); }); batcher.QueueObject(0); Assert.IsTrue(mre.Wait(1000), "Batcher didn't initially run"); mre.Reset(); batcher.QueueObject(0); batcher.Clear(); Assert.False(mre.Wait(TimeSpan.FromSeconds(1)), "Batcher ran after being cancelled"); }
public void TestBatcherAddAfterCancel() { var evt = new CountdownEvent(1); var scheduler = new SingleTaskThreadpoolScheduler(); var batcher = new Batcher<int>(new TaskFactory(scheduler), 5, 500, (inbox) => { evt.Signal(); }); batcher.QueueObject(0); Assert.IsTrue(evt.Wait(1000), "Batcher didn't initially run"); evt.Reset(2); batcher.QueueObject(0); batcher.Clear(); batcher.QueueObject(0); Assert.False(evt.Wait(TimeSpan.FromSeconds(1.5)), "Batcher ran too many times"); Assert.True(evt.CurrentCount == 1, "Batcher never ran"); }
private void RunChangeTrackerTransientError( ChangeTrackerMode mode, Int32 errorCode, string statusMessage, Int32 numExpectedChangeCallbacks) { var changeTrackerFinishedSignal = new CountDownLatch(1); var changeReceivedSignal = new CountDownLatch(numExpectedChangeCallbacks); var client = new ChangeTrackerTestClient(changeTrackerFinishedSignal, changeReceivedSignal); MockHttpRequestHandler.HttpResponseDelegate sentinal = RunChangeTrackerTransientErrorDefaultResponder(); var responders = new List<MockHttpRequestHandler.HttpResponseDelegate>(); responders.Add(RunChangeTrackerTransientErrorDefaultResponder()); responders.Add(MockHttpRequestHandler.TransientErrorResponder(errorCode, statusMessage)); MockHttpRequestHandler.HttpResponseDelegate chainResponder = (request) => { if (responders.Count > 0) { var responder = responders[0]; responders.RemoveAt(0); return responder(request); } return sentinal(request); }; var handler = client.HttpRequestHandler; handler.SetResponder("_changes", chainResponder); var testUrl = GetReplicationURL(); var scheduler = new SingleTaskThreadpoolScheduler(); var changeTracker = new ChangeTracker(testUrl, mode, 0, false, client, new TaskFactory(scheduler)); changeTracker.UsePost = IsSyncGateway(testUrl); changeTracker.Start(); var success = changeReceivedSignal.Await(TimeSpan.FromSeconds(30)); Assert.IsTrue(success); changeTracker.Stop(); success = changeTrackerFinishedSignal.Await(TimeSpan.FromSeconds(30)); Assert.IsTrue(success); }
private void TestChangeTrackerBackoff(MockHttpClientFactory httpClientFactory) { var changeTrackerFinishedSignal = new CountDownLatch(1); var client = new ChangeTrackerTestClient(changeTrackerFinishedSignal, null); client.HttpClientFactory = httpClientFactory; var testUrl = GetReplicationURL(); var scheduler = new SingleTaskThreadpoolScheduler(); var changeTracker = new ChangeTracker(testUrl, ChangeTrackerMode.LongPoll, 0, false, client, new TaskFactory(scheduler)); changeTracker.UsePost = IsSyncGateway(testUrl); changeTracker.Start(); // sleep for a few seconds Thread.Sleep(15 * 1000); // make sure we got less than 10 requests in those 10 seconds (if it was hammering, we'd get a lot more) var handler = client.HttpRequestHandler; Assert.IsTrue(handler.CapturedRequests.Count < 25); Assert.IsTrue(changeTracker.backoff.NumAttempts > 0, "Observed attempts: {0}".Fmt(changeTracker.backoff.NumAttempts)); handler.ClearResponders(); handler.AddResponderReturnEmptyChangesFeed(); // at this point, the change tracker backoff should cause it to sleep for about 3 seconds // and so lets wait 3 seconds until it wakes up and starts getting valid responses Thread.Sleep(3 * 1000); // now find the delta in requests received in a 2s period int before = handler.CapturedRequests.Count; Thread.Sleep(2 * 1000); int after = handler.CapturedRequests.Count; // assert that the delta is high, because at this point the change tracker should // be hammering away Assert.IsTrue((after - before) > 25); // the backoff numAttempts should have been reset to 0 Assert.IsTrue(changeTracker.backoff.NumAttempts == 0); changeTracker.Stop(); var success = changeTrackerFinishedSignal.Await(TimeSpan.FromSeconds(30)); Assert.IsTrue(success); }
private void ChangeTrackerTestWithMode(ChangeTrackerMode mode) { var changeTrackerFinishedSignal = new CountDownLatch(1); var changeReceivedSignal = new CountDownLatch(1); var client = new ChangeTrackerTestClient(changeTrackerFinishedSignal, changeReceivedSignal); client.ReceivedChangeDelegate = (IDictionary<string, object> change) => { Assert.IsTrue(change.ContainsKey("seq")); Assert.AreEqual("1", change["seq"]); }; var handler = client.HttpRequestHandler; handler.SetResponder("_changes", (request) => { var json = "{\"results\":[\n" + "{\"seq\":\"1\",\"id\":\"doc1-138\",\"changes\":[{\"rev\":\"1-82d\"}]}],\n" + "\"last_seq\":\"*:50\"}"; return MockHttpRequestHandler.GenerateHttpResponseMessage(HttpStatusCode.OK, null, json); }); var testUrl = GetReplicationURL(); var scheduler = new SingleTaskThreadpoolScheduler(); var changeTracker = new ChangeTracker(testUrl, mode, 0, false, client, new TaskFactory(scheduler)); changeTracker.UsePost = IsSyncGateway(testUrl); changeTracker.Start(); var success = changeReceivedSignal.Await(TimeSpan.FromSeconds(30)); Assert.IsTrue(success); changeTracker.Stop(); success = changeTrackerFinishedSignal.Await(TimeSpan.FromSeconds(30)); Assert.IsTrue(success); }
/// <summary> /// Creates a new <see cref="Couchbase.Lite.Replication"/> that will pull from the source <see cref="Couchbase.Lite.Database"/> at the given url. /// </summary> /// <returns>A new <see cref="Couchbase.Lite.Replication"/> that will pull from the source Database at the given url.</returns> /// <param name="url">The url of the source Database.</param> public Replication CreatePullReplication(Uri url) { if (!IsOpen) { Log.W(TAG, "CreatePullReplication called on closed database"); return null; } var scheduler = new SingleTaskThreadpoolScheduler(); return new Puller(this, url, false, new TaskFactory(scheduler)); }
/// <summary> /// Creates a new <see cref="Couchbase.Lite.Replication"/> that will pull from the source <see cref="Couchbase.Lite.Database"/> at the given url. /// </summary> /// <returns>A new <see cref="Couchbase.Lite.Replication"/> that will pull from the source Database at the given url.</returns> /// <param name="url">The url of the source Database.</param> public Replication CreatePullReplication(Uri url) { if(!IsOpen) { Log.To.Database.W(TAG, "{0} CreatePullReplication called on closed database, returning null...", this); return null; } #pragma warning disable 618 var replicationOptions = Manager.Options.DefaultReplicationOptions ?? new ReplicationOptions { RetryStrategy = new ExponentialBackoffStrategy(Manager.Options.MaxRetries), MaxOpenHttpConnections = Manager.Options.MaxOpenHttpConnections, MaxRevsToGetInBulk = Manager.Options.MaxRevsToGetInBulk, RequestTimeout = Manager.Options.RequestTimeout }; #pragma warning restore 618 var scheduler = new SingleTaskThreadpoolScheduler(); return new Puller(this, url, false, new TaskFactory(scheduler)) { ReplicationOptions = replicationOptions }; }