f115bf50cb
Motivation: If a user calls EpollSocketChannelConfig.getOptions() and TCP_FASTOPEN_CONNECT is not supported we throw an exception. Modifications: - Just return 0 if ENOPROTOOPT is set. - Add testcase Result: getOptions() works as epxected.
165 lines
4.6 KiB
Java
165 lines
4.6 KiB
Java
/*
|
|
* Copyright 2015 The Netty Project
|
|
*
|
|
* The Netty Project licenses this file to you 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 io.netty.channel.epoll;
|
|
|
|
import static org.junit.Assert.*;
|
|
import static org.junit.Assume.*;
|
|
import io.netty.bootstrap.Bootstrap;
|
|
import io.netty.channel.ChannelException;
|
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
|
import io.netty.channel.ChannelOption;
|
|
import io.netty.channel.EventLoopGroup;
|
|
|
|
import java.net.InetSocketAddress;
|
|
import java.nio.channels.ClosedChannelException;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
|
|
import org.junit.After;
|
|
import org.junit.AfterClass;
|
|
import org.junit.Before;
|
|
import org.junit.BeforeClass;
|
|
import org.junit.Test;
|
|
|
|
public class EpollSocketChannelConfigTest {
|
|
|
|
private static EventLoopGroup group;
|
|
private static EpollSocketChannel ch;
|
|
private static Random rand;
|
|
|
|
@BeforeClass
|
|
public static void beforeClass() {
|
|
rand = new Random();
|
|
group = new EpollEventLoopGroup(1);
|
|
}
|
|
|
|
@AfterClass
|
|
public static void afterClass() {
|
|
group.shutdownGracefully();
|
|
}
|
|
|
|
@Before
|
|
public void setup() {
|
|
Bootstrap bootstrap = new Bootstrap();
|
|
ch = (EpollSocketChannel) bootstrap.group(group)
|
|
.channel(EpollSocketChannel.class)
|
|
.handler(new ChannelInboundHandlerAdapter())
|
|
.bind(new InetSocketAddress(0)).syncUninterruptibly().channel();
|
|
}
|
|
|
|
@After
|
|
public void teardown() {
|
|
ch.close().syncUninterruptibly();
|
|
}
|
|
|
|
private static long randLong(long min, long max) {
|
|
return min + nextLong(max - min + 1);
|
|
}
|
|
|
|
private static long nextLong(long n) {
|
|
long bits, val;
|
|
do {
|
|
bits = (rand.nextLong() << 1) >>> 1;
|
|
val = bits % n;
|
|
} while (bits - val + (n - 1) < 0L);
|
|
return val;
|
|
}
|
|
|
|
@Test
|
|
public void testRandomTcpNotSentLowAt() {
|
|
final long expected = randLong(0, 0xFFFFFFFFL);
|
|
final long actual;
|
|
try {
|
|
ch.config().setTcpNotSentLowAt(expected);
|
|
actual = ch.config().getTcpNotSentLowAt();
|
|
} catch (RuntimeException e) {
|
|
assumeNoException(e);
|
|
return; // Needed to prevent compile error for final variables to be used below
|
|
}
|
|
assertEquals(expected, actual);
|
|
}
|
|
|
|
@Test
|
|
public void testInvalidHighTcpNotSentLowAt() {
|
|
try {
|
|
final long value = 0xFFFFFFFFL + 1;
|
|
ch.config().setTcpNotSentLowAt(value);
|
|
} catch (IllegalArgumentException e) {
|
|
return;
|
|
} catch (RuntimeException e) {
|
|
assumeNoException(e);
|
|
}
|
|
fail();
|
|
}
|
|
|
|
@Test
|
|
public void testInvalidLowTcpNotSentLowAt() {
|
|
try {
|
|
final long value = -1;
|
|
ch.config().setTcpNotSentLowAt(value);
|
|
} catch (IllegalArgumentException e) {
|
|
return;
|
|
} catch (RuntimeException e) {
|
|
assumeNoException(e);
|
|
}
|
|
fail();
|
|
}
|
|
|
|
@Test
|
|
public void testTcpCork() {
|
|
ch.config().setTcpCork(false);
|
|
assertFalse(ch.config().isTcpCork());
|
|
ch.config().setTcpCork(true);
|
|
assertTrue(ch.config().isTcpCork());
|
|
}
|
|
|
|
@Test
|
|
public void testTcpQickAck() {
|
|
ch.config().setTcpQuickAck(false);
|
|
assertFalse(ch.config().isTcpQuickAck());
|
|
ch.config().setTcpQuickAck(true);
|
|
assertTrue(ch.config().isTcpQuickAck());
|
|
}
|
|
|
|
@Test
|
|
public void testSetOptionWhenClosed() {
|
|
ch.close().syncUninterruptibly();
|
|
try {
|
|
ch.config().setSoLinger(0);
|
|
fail();
|
|
} catch (ChannelException e) {
|
|
assertTrue(e.getCause() instanceof ClosedChannelException);
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testGetOptionWhenClosed() {
|
|
ch.close().syncUninterruptibly();
|
|
try {
|
|
ch.config().getSoLinger();
|
|
fail();
|
|
} catch (ChannelException e) {
|
|
assertTrue(e.getCause() instanceof ClosedChannelException);
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void getGetOptions() {
|
|
Map<ChannelOption<?>, Object> map = ch.config().getOptions();
|
|
assertFalse(map.isEmpty());
|
|
}
|
|
}
|