/*
* (C) 2007-2012 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.taobao.gecko.service.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.taobao.gecko.core.command.Constants;
import com.taobao.gecko.core.nio.NioSession;
import com.taobao.gecko.service.config.ClientConfig;
import com.taobao.gecko.service.mock.MockSession;
import com.taobao.gecko.service.notify.NotifyCommandFactory;
/**
*
*
*
* @author boyan
*
* @since 1.0, 2009-12-21 ����02:28:37
*/
public class DefaultRemotingContextUnitTest {
private static final class MockTask implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
}
}
}
private DefaultRemotingContext remotingContext;
@Before
public void setUp() {
final ClientConfig config = new ClientConfig();
config.setCallBackExecutorPoolSize(1);
config.setCallBackExecutorQueueSize(1);
config.setMaxCallBackExecutorPoolSize(1);
this.remotingContext = new DefaultRemotingContext(config, new NotifyCommandFactory());
}
@After
public void tearDown() {
if (this.remotingContext != null) {
this.remotingContext.dispose();
}
}
@Test
public void testAttribute() {
assertNull(this.remotingContext.getAttribute("a"));
assertEquals(1, this.remotingContext.getAttribute("a", 1));
this.remotingContext.setAttribute("a", 2);
assertEquals(2, this.remotingContext.getAttribute("a", 1));
Set<Object> keys = this.remotingContext.getAttributeKeys();
assertTrue(keys.contains("a"));
assertEquals(1, keys.size());
this.remotingContext.setAttributeIfAbsent("b", 3);
keys = this.remotingContext.getAttributeKeys();
assertEquals(2, keys.size());
assertEquals(3, this.remotingContext.getAttribute("b"));
this.remotingContext.removeAttribute("a");
assertNull(this.remotingContext.getAttribute("a"));
this.remotingContext.removeAttribute("b");
assertNull(this.remotingContext.getAttribute("b"));
keys = this.remotingContext.getAttributeKeys();
assertTrue(keys.isEmpty());
}
@Test
public void testSession2ConnectionMapping() {
final NioSession session = new MockSession();
final String groupName = "group1";
final DefaultConnection conn = new DefaultConnection(session, this.remotingContext);
assertNull(this.remotingContext.getConnectionsByGroup(Constants.DEFAULT_GROUP));
assertNull(this.remotingContext.getConnectionsByGroup(groupName));
// ����Ĭ�Ϸ���
this.remotingContext.addConnection(conn);
assertNotNull(this.remotingContext.getConnectionsByGroup(Constants.DEFAULT_GROUP));
assertEquals(1, this.remotingContext.getConnectionsByGroup(Constants.DEFAULT_GROUP).size());
assertTrue(this.remotingContext.getConnectionsByGroup(Constants.DEFAULT_GROUP).contains(conn));
assertNull(this.remotingContext.getConnectionsByGroup(groupName));
// ����groupName
this.remotingContext.addConnectionToGroup(groupName, conn);
assertEquals(1, this.remotingContext.getConnectionsByGroup(Constants.DEFAULT_GROUP).size());
assertEquals(1, this.remotingContext.getConnectionsByGroup(groupName).size());
assertTrue(this.remotingContext.getConnectionsByGroup(groupName).contains(conn));
final Set<String> groupSet = this.remotingContext.getGroupSet();
assertEquals(2, groupSet.size());
assertTrue(groupSet.contains(Constants.DEFAULT_GROUP));
assertTrue(groupSet.contains(groupName));
// ��Ĭ�Ϸ����Ƴ�
this.remotingContext.removeConnection(conn);
assertNull(this.remotingContext.getConnectionsByGroup(Constants.DEFAULT_GROUP));
// ��groupName�Ƴ�
this.remotingContext.removeConnectionFromGroup(groupName, conn);
assertNull(this.remotingContext.getConnectionsByGroup(groupName));
assertTrue(this.remotingContext.getGroupSet().isEmpty());
// ����session��conn��ӳ��
this.remotingContext.addSession2ConnectionMapping(session, conn);
assertSame(conn, this.remotingContext.getConnectionBySession(session));
assertSame(conn, this.remotingContext.removeSession2ConnectionMapping(session));
assertNull(this.remotingContext.getConnectionBySession(session));
}
}