/**
* Copyright 2013 Netflix, Inc.
* <p/>
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.netflix.servo.publish.graphite;
import javax.net.ServerSocketFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class SocketReceiverTester implements Runnable {
private final ServerSocket acceptor;
private Socket s;
private final String[] lines = new String[100];
private volatile boolean running = true;
private volatile boolean connected = false;
private volatile int linesRead = 0;
private volatile int linesWritten = 0;
public SocketReceiverTester(int port) throws IOException {
ServerSocketFactory socketFactory = ServerSocketFactory.getDefault();
acceptor = socketFactory.createServerSocket();
acceptor.setReuseAddress(true);
acceptor.bind(new InetSocketAddress(port));
}
@Override
public void run() {
while (running) {
try {
s = acceptor.accept();
synchronized (this) {
connected = true;
notify();
}
BufferedReader stream = new BufferedReader(
new InputStreamReader(s.getInputStream(), "UTF-8"));
while (running) {
String line = stream.readLine();
synchronized (this) {
lines[linesWritten++ % lines.length] = line;
notify();
}
}
} catch (IOException e) {
synchronized (this) {
connected = false;
linesWritten = 0;
linesRead = 0;
notify();
}
}
}
}
private Thread thread;
public void start() {
thread = new Thread(this);
thread.start();
}
public void stop() throws Exception {
running = false;
if (s != null) {
s.close();
}
acceptor.close();
thread.interrupt();
thread.join();
}
public String[] waitForLines(int waitingFor) throws Exception {
long start = System.currentTimeMillis();
synchronized (this) {
while (linesWritten < linesRead + waitingFor) {
if (!connected) {
throw new IllegalArgumentException("Not connected!");
}
if (System.currentTimeMillis() - start > 1000) {
throw new InterruptedException("Timed out!");
}
wait(100);
}
return Arrays.copyOfRange(lines, linesRead, linesRead + waitingFor);
}
}
public void waitForConnected() throws Exception {
long start = System.currentTimeMillis();
synchronized (this) {
while (!connected) {
if (System.currentTimeMillis() - start > 1000) {
throw new InterruptedException("Timed out!");
}
wait(100);
}
}
}
}