You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2016/08/25 22:09:01 UTC
qpid-proton git commit: PROTON-1291 Check local state on open / close
calls
Repository: qpid-proton
Updated Branches:
refs/heads/master 752e848b3 -> c089f7c54
PROTON-1291 Check local state on open / close calls
When open or close is called on an endpoint, check that the state
doesn't already reflect the request to avoid marking the endpoint as
modified when it shouldn't be
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c089f7c5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c089f7c5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c089f7c5
Branch: refs/heads/master
Commit: c089f7c54ee783238db4aef9a237c88e774312f1
Parents: 752e848
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Aug 25 18:08:49 2016 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Aug 25 18:08:49 2016 -0400
----------------------------------------------------------------------
.../qpid/proton/engine/impl/EndpointImpl.java | 53 ++++++++-----
.../proton/engine/impl/TransportImplTest.java | 80 ++++++++++++++++++++
2 files changed, 114 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c089f7c5/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EndpointImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EndpointImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EndpointImpl.java
index 8b143d6..8fa10ba 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EndpointImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EndpointImpl.java
@@ -61,47 +61,57 @@ public abstract class EndpointImpl implements ProtonJEndpoint
abstract void localClose();
+ @Override
public void open()
{
- switch(_localState)
+ if (getLocalState() != EndpointState.ACTIVE)
{
- case ACTIVE:
- // TODO
- case CLOSED:
- // TODO
- case UNINITIALIZED:
- _localState = EndpointState.ACTIVE;
- localOpen();
+ switch(_localState)
+ {
+ case ACTIVE:
+ // TODO
+ case CLOSED:
+ // TODO
+ case UNINITIALIZED:
+ _localState = EndpointState.ACTIVE;
+ localOpen();
+ }
+ modified();
}
- modified();
}
+ @Override
public void close()
{
-
- switch(_localState)
+ if (getLocalState() != EndpointState.CLOSED)
{
- case UNINITIALIZED:
- // TODO
- case CLOSED:
- // TODO
- case ACTIVE:
- _localState = EndpointState.CLOSED;
- localClose();
+ switch(_localState)
+ {
+ case UNINITIALIZED:
+ // TODO
+ case CLOSED:
+ // TODO
+ case ACTIVE:
+ _localState = EndpointState.CLOSED;
+ localClose();
+ }
+ modified();
}
- modified();
}
+ @Override
public EndpointState getLocalState()
{
return _localState;
}
+ @Override
public EndpointState getRemoteState()
{
return _remoteState;
}
+ @Override
public ErrorCondition getCondition()
{
return _localError;
@@ -120,6 +130,7 @@ public abstract class EndpointImpl implements ProtonJEndpoint
}
}
+ @Override
public ErrorCondition getRemoteCondition()
{
return _remoteError;
@@ -186,6 +197,7 @@ public abstract class EndpointImpl implements ProtonJEndpoint
abstract void doFree();
+ @Override
final public void free()
{
if (freed) return;
@@ -205,16 +217,19 @@ public abstract class EndpointImpl implements ProtonJEndpoint
_transportPrev = transportPrevious;
}
+ @Override
public Object getContext()
{
return _context;
}
+ @Override
public void setContext(Object context)
{
_context = context;
}
+ @Override
public Record attachments()
{
return _attachments;
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c089f7c5/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/TransportImplTest.java
----------------------------------------------------------------------
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/TransportImplTest.java b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/TransportImplTest.java
index 412d0ff..a411cca 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/TransportImplTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/TransportImplTest.java
@@ -1557,4 +1557,84 @@ public class TransportImplTest
// expected
}
}
+
+ @Test
+ public void testEndpointOpenAndCloseAreIdempotent()
+ {
+ MockTransportImpl transport = new MockTransportImpl();
+
+ Connection connection = Proton.connection();
+ transport.bind(connection);
+
+ Collector collector = Collector.Factory.create();
+ connection.collect(collector);
+
+ connection.open();
+ connection.open();
+
+ Session session = connection.session();
+ session.open();
+
+ String linkName = "mySender";
+ Sender sender = session.sender(linkName);
+ sender.open();
+
+ pumpMockTransport(transport);
+
+ assertEvents(collector, Event.Type.CONNECTION_INIT, Event.Type.CONNECTION_LOCAL_OPEN, Event.Type.TRANSPORT,
+ Event.Type.SESSION_INIT, Event.Type.SESSION_LOCAL_OPEN,
+ Event.Type.TRANSPORT, Event.Type.LINK_INIT, Event.Type.LINK_LOCAL_OPEN, Event.Type.TRANSPORT);
+
+ pumpMockTransport(transport);
+
+ connection.open();
+ session.open();
+ sender.open();
+
+ assertNoEvents(collector);
+
+ pumpMockTransport(transport);
+
+ assertEquals("Unexpected frames written: " + getFrameTypesWritten(transport), 3, transport.writes.size());
+
+ assertTrue("Unexpected frame type", transport.writes.get(0) instanceof Open);
+ assertTrue("Unexpected frame type", transport.writes.get(1) instanceof Begin);
+ assertTrue("Unexpected frame type", transport.writes.get(2) instanceof Attach);
+
+ // Send the necessary responses to open/begin/attach then give sender credit
+ transport.handleFrame(new TransportFrame(0, new Open(), null));
+
+ Begin begin = new Begin();
+ begin.setRemoteChannel(UnsignedShort.valueOf((short) 0));
+ transport.handleFrame(new TransportFrame(0, begin, null));
+
+ Attach attach = new Attach();
+ attach.setHandle(UnsignedInteger.ZERO);
+ attach.setRole(Role.RECEIVER);
+ attach.setName(linkName);
+ attach.setInitialDeliveryCount(UnsignedInteger.ZERO);
+ transport.handleFrame(new TransportFrame(0, attach, null));
+
+ assertEvents(collector, Event.Type.CONNECTION_REMOTE_OPEN, Event.Type.SESSION_REMOTE_OPEN,
+ Event.Type.LINK_REMOTE_OPEN);
+
+ assertEquals("Unexpected frames written: " + getFrameTypesWritten(transport), 3, transport.writes.size());
+
+ // Now close the link and expect one event
+ sender.close();
+ sender.close();
+
+ assertEvents(collector, Event.Type.LINK_LOCAL_CLOSE, Event.Type.TRANSPORT);
+
+ pumpMockTransport(transport);
+
+ sender.close();
+
+ assertNoEvents(collector);
+
+ pumpMockTransport(transport);
+
+ assertEquals("Unexpected frames written: " + getFrameTypesWritten(transport), 4, transport.writes.size());
+ assertTrue("Unexpected frame type", transport.writes.get(3) instanceof Detach);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org