Skip to content

Commit

Permalink
Complete ActorBoundSessionTest. #24 #27
Browse files Browse the repository at this point in the history
  • Loading branch information
veblush committed Jun 7, 2016
1 parent 27df0b1 commit d0d3dc1
Show file tree
Hide file tree
Showing 6 changed files with 289 additions and 54 deletions.
160 changes: 135 additions & 25 deletions core/Akka.Interfaced.Tests/ActorBoundSessionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ protected void OnRequestMessage(int actorId, RequestMessage message)
return;
}

var boundType = GetBoundType(boundActor, message.InvokePayload);
var boundType = boundActor.FindBoundType(message.InvokePayload.GetInterfaceType());
if (boundType == null)
{
Sender.Tell(new ResponseMessage { RequestId = message.RequestId, Exception = new RequestMessageException() });
Sender.Tell(new ResponseMessage { RequestId = message.RequestId, Exception = new RequestHandlerNotFoundException() });
return;
}

Expand All @@ -65,22 +65,9 @@ protected override void OnResponseMessage(ResponseMessage message)
protected override void OnNotificationMessage(NotificationMessage message)
{
}

private BoundType GetBoundType(BoundActor boundActor, IInterfacedPayload payload)
{
var interfaceType = payload.GetInterfaceType();

foreach (var t in boundActor.DerivedTypes)
{
if (t.Type == interfaceType)
return t;
}

return null;
}
}

public class DummyWorkerActor : InterfacedActor, IDummyExFinal, IWorker
public class DummyWorkerActor : InterfacedActor, IDummyExFinal, IDummyWithTag
{
public DummyWorkerActor()
{
Expand All @@ -106,14 +93,9 @@ Task<object> IDummyExFinal.CallExFinal(object param)
return Task.FromResult<object>("CallExFinal:" + param);
}

Task IWorker.Atomic(int id)
Task<object> IDummyWithTag.CallWithTag(object param, string id)
{
throw new NotImplementedException();
}

Task IWorker.Reentrant(int id)
{
throw new NotImplementedException();
return Task.FromResult<object>("CallWithTag:" + param + ":" + id);
}
}

Expand All @@ -125,7 +107,7 @@ public ActorBoundSessionTest(ITestOutputHelper output)
}

[Fact]
private async Task Test_Work()
private async Task Test_RequestToBoundActor_Response()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();
Expand All @@ -134,7 +116,7 @@ private async Task Test_Work()

var r2 = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = 1,
ActorId = r.ActorId,
Message = new RequestMessage
{
RequestId = 1,
Expand All @@ -144,5 +126,133 @@ private async Task Test_Work()
Assert.Equal(1, r2.RequestId);
Assert.Equal("Call:Test", r2.ReturnPayload.Value);
}

[Fact]
private async Task Test_RequestToBoundActorWithTag_Response()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();
var r = await session.Ask<ActorBoundSessionMessage.BindReply>(new ActorBoundSessionMessage.Bind(dummy, typeof(IDummyWithTag), "ID"));
Assert.NotEqual(0, r.ActorId);

var r2 = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = r.ActorId,
Message = new RequestMessage
{
RequestId = 1,
InvokePayload = new IDummyWithTag_PayloadTable.CallWithTag_Invoke { param = "Test" }
}
});
Assert.Equal(1, r2.RequestId);
Assert.Equal("CallWithTag:Test:ID", r2.ReturnPayload.Value);
}

[Fact]
private async Task Test_RequestToUnboundActor_Exception()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();

var r = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = 1,
Message = new RequestMessage
{
RequestId = 1,
InvokePayload = new IDummy_PayloadTable.Call_Invoke { param = "Test" }
}
});
Assert.Equal(1, r.RequestId);
Assert.IsType<RequestTargetException>(r.Exception);
}

[Fact]
private async Task Test_RequestOnUnboundType_Exception()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();
var r = await session.Ask<ActorBoundSessionMessage.BindReply>(new ActorBoundSessionMessage.Bind(dummy, typeof(IDummyEx)));
Assert.NotEqual(0, r.ActorId);

var r2 = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = r.ActorId,
Message = new RequestMessage
{
RequestId = 1,
InvokePayload = new IDummyEx2_PayloadTable.CallEx2_Invoke { param = "Test" }
}
});
Assert.Equal(1, r2.RequestId);
Assert.IsType<RequestHandlerNotFoundException>(r2.Exception);
}

[Fact]
private async Task Test_UnbindActor_And_RequestToUnboundActor_Exception()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();
var r = await session.Ask<ActorBoundSessionMessage.BindReply>(new ActorBoundSessionMessage.Bind(dummy, typeof(IDummyEx)));
Assert.NotEqual(0, r.ActorId);
session.Tell(new ActorBoundSessionMessage.Unbind(dummy));

var r2 = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = r.ActorId,
Message = new RequestMessage
{
RequestId = 1,
InvokePayload = new IDummyEx2_PayloadTable.CallEx2_Invoke { param = "Test" }
}
});
Assert.Equal(1, r2.RequestId);
Assert.IsType<RequestTargetException>(r2.Exception);
}

[Fact]
private async Task Test_AddTypeToBoundActor_And_RequestToBoundActor_Response()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();
var r = await session.Ask<ActorBoundSessionMessage.BindReply>(new ActorBoundSessionMessage.Bind(dummy, typeof(IDummyEx)));
Assert.NotEqual(0, r.ActorId);
session.Tell(new ActorBoundSessionMessage.AddType(dummy, typeof(IDummyEx2)));

var r2 = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = r.ActorId,
Message = new RequestMessage
{
RequestId = 1,
InvokePayload = new IDummyEx2_PayloadTable.CallEx2_Invoke { param = "Test" }
}
});
Assert.Equal(1, r2.RequestId);
Assert.Equal("CallEx2:Test", r2.ReturnPayload.Value);
}

[Fact]
private async Task Test_RemoveTypeToBoundActor_And_RequestOnUnboundType_Exception()
{
var session = ActorOfAsTestActorRef<TestActorBoundSesson>();
var dummy = ActorOfAsTestActorRef<DummyWorkerActor>();
var r = await session.Ask<ActorBoundSessionMessage.BindReply>(new ActorBoundSessionMessage.Bind(dummy, typeof(IDummyEx)));
Assert.NotEqual(0, r.ActorId);
session.Tell(new ActorBoundSessionMessage.AddType(dummy, typeof(IDummyEx2)));
session.Tell(new ActorBoundSessionMessage.RemoveType(dummy, typeof(IDummyEx2)));

var r2 = await session.Ask<ResponseMessage>(new TestActorBoundSesson.Request
{
ActorId = r.ActorId,
Message = new RequestMessage
{
RequestId = 1,
InvokePayload = new IDummyEx2_PayloadTable.CallEx2_Invoke { param = "Test" }
}
});
Assert.Equal(1, r2.RequestId);
Assert.IsType<RequestHandlerNotFoundException>(r2.Exception);
}
}
}
6 changes: 6 additions & 0 deletions core/Akka.Interfaced.Tests/Interface/IDummy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,10 @@ public interface IDummyExFinal : IDummyEx, IDummyEx2
{
Task<object> CallExFinal(object param);
}

[TagOverridable("id")]
public interface IDummyWithTag : IInterfacedActor
{
Task<object> CallWithTag(object param, string id = null);
}
}
107 changes: 107 additions & 0 deletions core/Akka.Interfaced.Tests/Properties/Akka.Interfaced.CodeGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,113 @@ void IDummyEx2_NoReply.CallEx2(System.Object param)
}
}

#endregion
#region Akka.Interfaced.Tests.IDummyWithTag

namespace Akka.Interfaced.Tests
{
[PayloadTable(typeof(IDummyWithTag), PayloadTableKind.Request)]
public static class IDummyWithTag_PayloadTable
{
public static Type[,] GetPayloadTypes()
{
return new Type[,] {
{ typeof(CallWithTag_Invoke), typeof(CallWithTag_Return) },
};
}

public class CallWithTag_Invoke
: IInterfacedPayload, IAsyncInvokable, IPayloadTagOverridable
{
public System.Object param;
public System.String id;

public Type GetInterfaceType()
{
return typeof(IDummyWithTag);
}

public async Task<IValueGetable> InvokeAsync(object __target)
{
var __v = await ((IDummyWithTag)__target).CallWithTag(param, id);
return (IValueGetable)(new CallWithTag_Return { v = __v });
}

void IPayloadTagOverridable.SetTag(object value)
{
id = (System.String)value;
}
}

public class CallWithTag_Return
: IInterfacedPayload, IValueGetable
{
public System.Object v;

public Type GetInterfaceType()
{
return typeof(IDummyWithTag);
}

public object Value
{
get { return v; }
}
}
}

public interface IDummyWithTag_NoReply
{
void CallWithTag(System.Object param, System.String id = null);
}

public class DummyWithTagRef : InterfacedActorRef, IDummyWithTag, IDummyWithTag_NoReply
{
public DummyWithTagRef() : base(null)
{
}

public DummyWithTagRef(IActorRef actor) : base(actor)
{
}

public DummyWithTagRef(IActorRef actor, IRequestWaiter requestWaiter, TimeSpan? timeout = null) : base(actor, requestWaiter, timeout)
{
}

public IDummyWithTag_NoReply WithNoReply()
{
return this;
}

public DummyWithTagRef WithRequestWaiter(IRequestWaiter requestWaiter)
{
return new DummyWithTagRef(Actor, requestWaiter, Timeout);
}

public DummyWithTagRef WithTimeout(TimeSpan? timeout)
{
return new DummyWithTagRef(Actor, RequestWaiter, timeout);
}

public Task<System.Object> CallWithTag(System.Object param, System.String id = null)
{
var requestMessage = new RequestMessage {
InvokePayload = new IDummyWithTag_PayloadTable.CallWithTag_Invoke { param = param, id = id }
};
return SendRequestAndReceive<System.Object>(requestMessage);
}

void IDummyWithTag_NoReply.CallWithTag(System.Object param, System.String id)
{
var requestMessage = new RequestMessage {
InvokePayload = new IDummyWithTag_PayloadTable.CallWithTag_Invoke { param = param, id = id }
};
SendRequest(requestMessage);
}
}
}

#endregion
#region Akka.Interfaced.Tests.IOverloaded

Expand Down
Loading

0 comments on commit d0d3dc1

Please sign in to comment.