Skip to content

Commit

Permalink
Expose the responses through a class preventing additions.
Browse files Browse the repository at this point in the history
The user should be able to consume such blocking collection,
without being able to put responses there.
  • Loading branch information
carlosalberto committed Jun 13, 2017
1 parent 4a7aa48 commit 1865fc7
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 13 deletions.
3 changes: 2 additions & 1 deletion Src/LibHoney.Tests/HoneyTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@ public void InternalStateAfterInit ()
Assert.Equal (true, libHoney.Transmission != null);
Assert.Equal (true, libHoney.Responses != null);
Assert.Equal (libHoney.Transmission.Responses, libHoney.Responses);
Assert.Equal (true, libHoney.Responses.BoundedCapacity > 1);

Assert.Equal (true, libHoney.Transmission.Responses.BoundedCapacity > 1);
}

[Fact]
Expand Down
1 change: 1 addition & 0 deletions Src/LibHoney.Tests/LibHoney.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
<Compile Include="TransmissionTest.cs" />
<Compile Include="HttpTestServer.cs" />
<Compile Include="LibHoneyFixture.cs" />
<Compile Include="ResponseCollectionTest.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
Expand Down
71 changes: 71 additions & 0 deletions Src/LibHoney.Tests/ResponseCollectionTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System;
using System.Collections.Concurrent;
using Xunit;

namespace Honeycomb.Tests
{
public class ResponseCollectionTest
{
[Fact]
public void Wrap ()
{
var responses = new BlockingCollection<Response> ();
responses.Add (new Response ());
responses.Add (null);

var coll = new ResponseCollection (responses);
Assert.Equal (coll.Responses, responses);
Assert.Equal (coll.Count, 2);
Assert.False (coll.IsAddingCompleted);
Assert.False (coll.IsCompleted);

responses.CompleteAdding ();
Assert.True (coll.IsAddingCompleted);
Assert.False (coll.IsCompleted);

responses.Take ();
responses.Take ();
Assert.True (coll.IsAddingCompleted);
Assert.True (coll.IsCompleted);
}

[Fact]
public void Consume ()
{
var responses = new BlockingCollection<Response> ();
responses.Add (null);
responses.Add (null);

var coll = new ResponseCollection (responses);

Response response1, response2;
response1 = coll.Take ();
coll.TryTake (out response2);

Assert.Null (response1);
Assert.Null (response2);
Assert.False (coll.IsAddingCompleted);
Assert.False (coll.IsCompleted);
Assert.Equal (coll.Count, 0);
}

[Fact]
public void Enumerate ()
{
var responses = new BlockingCollection<Response> ();
for (int i = 0; i < 5; i++)
responses.Add (null);

var coll = new ResponseCollection (responses);

int count = 0;
foreach (var response in coll) {
count++;
Assert.Null (response);
}

Assert.Equal (count, 5);
Assert.Equal (coll.Count, 5);
}
}
}
2 changes: 1 addition & 1 deletion Src/LibHoney/Event.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public void SendPreSampled ()

void SendDroppedResponse ()
{
libHoney.Responses.Add (new Response () {
libHoney.Transmission.EnqueueResponse (new Response () {
Metadata = Metadata,
ErrorMessage = "Event dropped due to sampling"
});
Expand Down
6 changes: 3 additions & 3 deletions Src/LibHoney/LibHoney.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public sealed class LibHoney : IDisposable
readonly FieldHolder fields = new FieldHolder ();

Transmission transmission;
BlockingCollection<Response> responses;
ResponseCollection responses;

public LibHoney (string writeKey, string dataSet)
: this (writeKey, dataSet, DefaultApiHost, DefaultSampleRate, DefaultMaxConcurrentBatches,
Expand Down Expand Up @@ -56,7 +56,7 @@ public LibHoney (string writeKey, string dataSet, string apiHost, int sampleRate
throw new ArgumentException (nameof (apiHost));

transmission = new Transmission (maxConcurrentBatches, blockOnSend, blockOnResponse);
responses = transmission.Responses;
responses = new ResponseCollection (transmission.Responses);

WriteKey = writeKey;
DataSet = dataSet;
Expand Down Expand Up @@ -105,7 +105,7 @@ internal void Reset ()
get { return transmission == null; }
}

public BlockingCollection<Response> Responses {
public ResponseCollection Responses {
get {
return responses;
}
Expand Down
1 change: 1 addition & 0 deletions Src/LibHoney/LibHoney.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
<Compile Include="SendException.cs" />
<Compile Include="Transmission.cs" />
<Compile Include="Response.cs" />
<Compile Include="ResponseCollection.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
Expand Down
58 changes: 58 additions & 0 deletions Src/LibHoney/ResponseCollection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;

namespace Honeycomb
{
public sealed class ResponseCollection : IEnumerable<Response>
{
BlockingCollection<Response> responses;

internal ResponseCollection (BlockingCollection<Response> responses)
{
this.responses = responses;
}

internal BlockingCollection<Response> Responses {
get { return responses; }
}

public int Count {
get { return responses.Count; }
}

public bool IsAddingCompleted {
get { return responses.IsAddingCompleted; }
}

public bool IsCompleted {
get { return responses.IsCompleted; }
}

public Response Take ()
{
return responses.Take ();
}

public bool TryTake (out Response response)
{
return responses.TryTake (out response);
}

public bool TryTake (out Response response, TimeSpan timeout)
{
return responses.TryTake (out response, timeout);
}

IEnumerator IEnumerable.GetEnumerator ()
{
return ((IEnumerable)responses).GetEnumerator ();
}

IEnumerator<Response> IEnumerable<Response>.GetEnumerator ()
{
return ((IEnumerable<Response>)responses).GetEnumerator ();
}
}
}
16 changes: 8 additions & 8 deletions Src/LibHoney/Transmission.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,14 @@ public void Dispose ()
client.Dispose ();
}

public void EnqueueResponse (Response res)
{
if (BlockOnResponse)
responses.Add (res);
else
responses.TryAdd (res);
}

public void Send (Event ev)
{
ev = ev.Clone (); // Prevent further changes
Expand All @@ -150,14 +158,6 @@ public void Send (Event ev)
}
}

void EnqueueResponse (Response res)
{
if (BlockOnResponse)
responses.Add (res);
else
responses.TryAdd (res);
}

void DoSend (Event ev)
{
var uri = new Uri (ev.ApiHost + HoneyEventsUrl + ev.DataSet);
Expand Down

0 comments on commit 1865fc7

Please sign in to comment.