package org.yamcs.yarch;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Semaphore;
import org.yamcs.YConfiguration;
import org.yamcs.utils.FileUtils;
import org.yamcs.yarch.YarchDatabase;
import org.yamcs.yarch.management.JMXService;
import org.junit.Before;
import org.junit.BeforeClass;
import org.yamcs.yarch.rocksdb.RdbStorageEngine;
import org.yamcs.yarch.streamsql.ExecutionContext;
import org.yamcs.yarch.streamsql.ParseException;
import org.yamcs.yarch.streamsql.StreamSqlException;
import org.yamcs.yarch.streamsql.StreamSqlParser;
import org.yamcs.yarch.streamsql.StreamSqlResult;
public abstract class YarchTestCase {
protected StreamSqlParser parser;
protected ExecutionContext context;
protected YarchDatabase ydb;
static boolean littleEndian;
protected String instance;
Random random = new Random();
@BeforeClass
public static void setUpYarch() throws Exception {
YConfiguration.setup(); //reset the prefix if maven runs multiple tests in the same java
YConfiguration config=YConfiguration.getConfiguration("yamcs");
if(config.containsKey("littleEndian")) {
littleEndian=config.getBoolean("littleEndian");
} else {
littleEndian=false;
}
JMXService.setup(false);
}
@Before
public void setUp() throws Exception {
YConfiguration config = YConfiguration.getConfiguration("yamcs");
String dir = config.getString("dataDir");
instance = "yarchtest_"+this.getClass().getSimpleName();
context = new ExecutionContext(instance);
File ytdir=new File(dir+"/"+instance);
FileUtils.deleteRecursively(ytdir.toPath());
if(!ytdir.mkdirs()) throw new IOException("Cannot create directory "+ytdir);
if(YarchDatabase.hasInstance(instance)) {
YarchDatabase ydb = YarchDatabase.getInstance(instance);
RdbStorageEngine.removeInstance(ydb);
YarchDatabase.removeInstance(instance);
}
ydb = YarchDatabase.getInstance(instance);
}
protected StreamSqlResult execute(String cmd) throws StreamSqlException, ParseException {
return ydb.execute(cmd);
}
protected List<Tuple> fetchAllFromTable(String tableName) throws Exception {
String sname = tableName+"_out_"+random.nextInt(10000);
ydb.execute("create stream "+sname+" as select * from "+tableName);
return fetchAll(sname);
}
protected List<Tuple> fetchAll(String streamName) throws InterruptedException{
final List<Tuple> tuples=new ArrayList<Tuple>();
final Semaphore semaphore=new Semaphore(0);
Stream s = ydb.getStream(streamName);
if(s==null) throw new IllegalArgumentException("No stream named '"+streamName+"' in instance "+instance);
s.addSubscriber(new StreamSubscriber() {
@Override
public void streamClosed(Stream stream) {
semaphore.release();
}
@Override
public void onTuple(Stream stream, Tuple tuple) {
tuples.add(tuple);
}
});
s.start();
semaphore.acquire();
return tuples;
}
}