/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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 org.apache.flume.sink.irc;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.flume.Channel;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.Sink;
import org.apache.flume.Transaction;
import org.apache.flume.channel.MemoryChannel;
import org.apache.flume.conf.Configurables;
import org.apache.flume.event.EventBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.UUID;
import static org.junit.Assert.fail;
public class TestIRCSink {
private File eventFile;
int ircServerPort;
DumbIRCServer dumbIRCServer;
@Rule
public TemporaryFolder folder = new TemporaryFolder();
private static int findFreePort() throws IOException {
ServerSocket socket = new ServerSocket(0);
int port = socket.getLocalPort();
socket.close();
return port;
}
@Before
public void setUp() throws IOException {
ircServerPort = findFreePort();
dumbIRCServer = new DumbIRCServer(ircServerPort);
dumbIRCServer.start();
eventFile = folder.newFile("eventFile.txt");
}
@After
public void tearDown() throws Exception {
dumbIRCServer.shutdownServer();
}
@Test
public void testIRCSinkMissingSplitLineProperty() {
Sink ircSink = new IRCSink();
ircSink.setName("IRC Sink - " + UUID.randomUUID().toString());
Context context = new Context();
context.put("hostname", "localhost");
context.put("port", String.valueOf(ircServerPort));
context.put("nick", "flume");
context.put("password", "flume");
context.put("user", "flume");
context.put("name", "flume-dev");
context.put("chan", "flume");
context.put("splitchars", "false");
Configurables.configure(ircSink, context);
Channel memoryChannel = new MemoryChannel();
Configurables.configure(memoryChannel, context);
ircSink.setChannel(memoryChannel);
ircSink.start();
Transaction txn = memoryChannel.getTransaction();
txn.begin();
Event event = EventBuilder.withBody("Dummy Event".getBytes());
memoryChannel.put(event);
txn.commit();
txn.close();
try {
Sink.Status status = ircSink.process();
if (status == Sink.Status.BACKOFF) {
fail("Error occured");
}
} catch (EventDeliveryException eDelExcp) {
// noop
}
}
class DumbIRCServer extends Thread {
int port;
ServerSocket ss;
public DumbIRCServer(int port) {
this.port = port;
}
public void run() {
try {
ss = new ServerSocket(port);
while (true) {
try {
Socket socket = ss.accept();
process(socket);
} catch (Exception ex) {
/* noop */
}
}
} catch (IOException e) {
// noop
}
}
public void shutdownServer() throws Exception {
ss.close();
}
/**
* Process the incoming request from IRC client
*
* @param socket IRC client connection socket
* @throws IOException
*/
private void process(Socket socket) throws IOException {
FileOutputStream fileOutputStream = FileUtils.openOutputStream(eventFile);
List<String> input = IOUtils.readLines(socket.getInputStream());
for (String next : input) {
if (isPrivMessage(next)) {
fileOutputStream.write(next.getBytes());
fileOutputStream.write("\n".getBytes());
}
}
fileOutputStream.close();
socket.close();
}
/**
* Checks if the message is Priv message
*
* @param input command received from IRC client
* @return true, if command received is PrivMessage
*/
private boolean isPrivMessage(String input) {
return input.startsWith("PRIVMSG");
}
}
}