netty5/transport-native-epoll/src/test/java/io/netty/channel/epoll/EpollSocketChannelConfigTest.java
Norman Maurer f115bf50cb EpollSocketChannelConfig.getOptions() must not throw if TCP_FASTOPEN_CONNECT is not supported
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.
2017-11-16 14:07:54 +01:00

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());
}
}