1cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera/*
2cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * Copyright (C) 2016 The Android Open Source Project
3cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera *
4cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * Licensed under the Apache License, Version 2.0 (the "License");
5cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * you may not use this file except in compliance with the License.
6cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * You may obtain a copy of the License at
7cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera *
8cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera *      http://www.apache.org/licenses/LICENSE-2.0
9cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera *
10cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * Unless required by applicable law or agreed to in writing, software
11cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * distributed under the License is distributed on an "AS IS" BASIS,
12cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * See the License for the specific language governing permissions and
14cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera * limitations under the License
15cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera */
16cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
17cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmerapackage libcore.java.nio.channels;
18cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
19cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport junit.framework.TestCase;
20cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
21cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.io.IOException;
22cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.Inet4Address;
23cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.Inet6Address;
24cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.InetAddress;
25cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.InetSocketAddress;
26cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.NetworkInterface;
27cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.StandardProtocolFamily;
28cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.StandardSocketOptions;
29cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.net.UnknownHostException;
30cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.nio.ByteBuffer;
31cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.nio.channels.DatagramChannel;
32cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmeraimport java.nio.channels.MembershipKey;
33cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
34cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmerapublic class MembershipKeyTest extends TestCase {
35cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
36cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private MembershipKey key;
37cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private final int PORT = 5000;
38cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private final String TEST_MESSAGE = "hello";
39cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private DatagramChannel client;
40cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private InetAddress sourceAddress = Inet4Address.LOOPBACK;
41cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private final static InetAddress MULTICAST_ADDRESS = getMulticastAddress();
42cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private final static NetworkInterface NETWORK_INTERFACE = getNetworkInterface();
43cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
4429cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer    private void init(boolean withSource) throws Exception {
45cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client = DatagramChannel.open(StandardProtocolFamily.INET)
46cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                .bind(new InetSocketAddress(Inet4Address.ANY, PORT));
47cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.configureBlocking(false);
48cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
49cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        if (withSource) {
503b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            key = client.join(MULTICAST_ADDRESS, NETWORK_INTERFACE, sourceAddress);
51cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } else {
52cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key = client.join(MULTICAST_ADDRESS, NETWORK_INTERFACE);
53cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        }
54cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
55cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
56cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    @Override
57cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void tearDown() throws IOException {
58cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.close();
59cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key = null;
60cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
61cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
62cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_isValid_OnChannelCloseWithJoinWithoutSource() throws Exception {
6329cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
6429cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        check_isValid();
65cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
66cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
67cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_isValid_OnChannelCloseWithJoinWithSource() throws Exception {
6829cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
6929cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        check_isValid();
70cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
71cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
7229cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer    private void check_isValid() throws IOException {
73cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertTrue(key.isValid());
74cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.close();
75cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertFalse(key.isValid());
76cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
77cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
78cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_isValid_OnDropJoinWithoutSource() throws Exception {
7929cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
8029cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        check_isValid_OnDrop();
81cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
82cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
83cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_isValid_OnDropJoinWithSource() throws Exception {
8429cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
8529cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        check_isValid_OnDrop();
86cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
87cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
8829cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer    private void check_isValid_OnDrop() {
89cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertTrue(key.isValid());
90cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.drop();
91cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertFalse(key.isValid());
92cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
93cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
94cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_dropWithJoinWithoutSource() throws Exception {
9529cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
9629cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        check_drop();
97cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
98cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
99cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_dropWithJoinWithSource() throws Exception {
10029cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
10129cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        check_drop();
102cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
103cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
10429cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer    private void check_drop() throws IOException {
105cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.drop();
106cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try(DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
107cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            assertEquals(TEST_MESSAGE.length(), dc
108cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .bind(new InetSocketAddress(Inet4Address.LOOPBACK, 0))
109cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .send(ByteBuffer.wrap(TEST_MESSAGE.getBytes()),
110cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                            new InetSocketAddress(MULTICAST_ADDRESS, PORT)));
111cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        }
112cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
113cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        ByteBuffer buffer = ByteBuffer.allocate(1048);
114cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.receive(buffer);
115cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        buffer.flip();
116cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(0, buffer.limit());
117cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
118cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
119cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_networkInterface() throws Exception {
12029cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
121cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(NETWORK_INTERFACE, key.networkInterface());
122cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.close();
123cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(NETWORK_INTERFACE, key.networkInterface());
124cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
125cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
126cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_sourceAddressWithJoinWithSource() throws Exception {
12729cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
128cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(sourceAddress, key.sourceAddress());
129cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
130cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
131cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_sourceAddressWithJoinWithoutSource() throws Exception {
13229cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
133cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertNull(key.sourceAddress());
134cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
135cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
136cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_groupWithJoinWithSource() throws Exception {
13729cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
138cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(MULTICAST_ADDRESS, key.group());
139cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
140cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
141cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_groupWithoutJoinWIthSource() throws Exception {
14229cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
143cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(MULTICAST_ADDRESS, key.group());
144cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
145cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
146cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_channelWithJoinWithSource() throws Exception {
14729cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
148cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(client, key.channel());
149cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.drop();
150cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(client, key.channel());
151cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
152cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
153cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_channelWithJoinWithoutSource() throws Exception {
15429cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
155cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(client, key.channel());
156cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.drop();
157cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(client, key.channel());
158cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
159cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
160cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_blockWithJoinWithSource() throws Exception {
16129cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
162cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
163cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.block(sourceAddress);
164d4b7449574ca69c713a3f2230cb77c68ee642700Tobias Thierer            fail();
165cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalStateException expected) {}
166cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
167cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
168cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_blockWithJoinWithoutSource() throws Exception {
16929cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
170cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.block(sourceAddress);
171cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
172cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
173cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            assertEquals(TEST_MESSAGE.length(), dc
174cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .bind(new InetSocketAddress(Inet4Address.LOOPBACK, 0))
175cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .send(ByteBuffer.wrap(TEST_MESSAGE.getBytes()),
176cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                            new InetSocketAddress(MULTICAST_ADDRESS, PORT)));
177cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        }
178cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
179cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        ByteBuffer buffer = ByteBuffer.allocate(1048);
180cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.receive(buffer);
181cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        buffer.flip();
182cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(0, buffer.limit());
183cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
184cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
185cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_block_Exception () throws Exception {
18629cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
187cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
188cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        // Blocking a multicast channel
189cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
190cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.block(Inet4Address.getByName("224.0.0.10"));
1913b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            fail();
192cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalArgumentException expected) {}
193cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
194cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        // Different address type than the group
195cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
196cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.block(Inet6Address.LOOPBACK);
1973b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            fail();
198cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalArgumentException expected) {}
199cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
200cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.drop();
201cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
202cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.block(sourceAddress);
2033b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            fail();
204cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalStateException expected) {}
205cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
206cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
207cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_unblockWithJoinWithSource() throws Exception {
20829cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(true);
209cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
210cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.unblock(Inet4Address.getByName("127.0.0.2"));
2113b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            fail();
212cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalStateException expected) {}
213cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
214cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
215cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_unblockWithJoinWithoutSource() throws Exception {
21629cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
217cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
218cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.block(sourceAddress);
219cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.unblock(sourceAddress);
220cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
221cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
222cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            assertEquals(TEST_MESSAGE.length(), dc
223cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .bind(new InetSocketAddress(Inet4Address.LOOPBACK, 0))
224cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .setOption(StandardSocketOptions.IP_MULTICAST_LOOP, true /* enable loop */)
225cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                    .send(ByteBuffer.wrap(TEST_MESSAGE.getBytes()),
226cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera                            new InetSocketAddress(MULTICAST_ADDRESS, PORT)));
227cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        }
228cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
229cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        ByteBuffer buffer = ByteBuffer.allocate(1048);
230cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        client.receive(buffer);
231cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        buffer.flip();
232cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        int limits = buffer.limit();
233cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        byte bytes[] = new byte[limits];
234cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        buffer.get(bytes, 0, limits);
235cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        String receivedMessage = new String(bytes);
236cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        assertEquals(TEST_MESSAGE, receivedMessage);
237cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
238cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
239cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    public void test_unblock_Exception() throws Exception {
24029cb37bc4cf841bd4f120b7d595e1be9659fe23bTobias Thierer        init(false);
241cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
242cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.unblock(sourceAddress);
2433b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            fail();
244cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalStateException expected) {}
245cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
246cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        key.drop();
247cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
248cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
249cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            key.unblock(sourceAddress);
2503b51268d4502356889956d46e2d3df997a85d089Shubham Ajmera            fail();
251cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (IllegalStateException expected) {}
252cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
253cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
254cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private static InetAddress getMulticastAddress() {
255cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
256cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            return InetAddress.getByName("239.255.0.1");
257cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (UnknownHostException exception) {
258cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            throw new RuntimeException(exception);
259cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        }
260cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
261cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera
262cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    private static NetworkInterface getNetworkInterface() {
263cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        try {
264cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            return NetworkInterface.getByName("lo");
265cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        } catch (Exception e) {
266cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera            throw new RuntimeException(e);
267cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera        }
268cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera    }
269cf010dc7e50acebe436d11e44fe311e487843db8Shubham Ajmera}
270