Great Ran, I think I've missed the .setDaemon to keep the server alive. Thanks
Richard On Sun, Jan 24, 2010 at 12:02 PM, Ran Tavory <ran...@gmail.com> wrote: > Here's the code I've just written over the weekend and started using in > test: > > > package com.outbrain.data.cassandra.service; > > import java.io.File; > import java.io.FileOutputStream; > import java.io.IOException; > import java.io.InputStream; > import java.io.OutputStream; > > import org.apache.cassandra.config.DatabaseDescriptor; > import org.apache.cassandra.service.CassandraDaemon; > import org.apache.cassandra.utils.FileUtils; > import org.apache.thrift.transport.TTransportException; > import org.slf4j.Logger; > import org.slf4j.LoggerFactory; > > /** > * An in-memory cassandra storage service that listens to the thrift > interface. > * Useful for unit testing, > * > * @author Ran Tavory (r...@outbain.com) > * > */ > public class InProcessCassandraServer implements Runnable { > > private static final Logger log = > LoggerFactory.getLogger(InProcessCassandraServer.class); > > CassandraDaemon cassandraDaemon; > > public void init() { > try { > prepare(); > } catch (IOException e) { > log.error("Cannot prepare cassandra.", e); > } > try { > cassandraDaemon = new CassandraDaemon(); > cassandraDaemon.init(null); > } catch (TTransportException e) { > log.error("TTransportException", e); > } catch (IOException e) { > log.error("IOException", e); > } > } > > @Override > public void run() { > cassandraDaemon.start(); > } > > public void stop() { > cassandraDaemon.stop(); > rmdir("tmp"); > } > > > /** > * Creates all files and directories needed > * @throws IOException > */ > private void prepare() throws IOException { > // delete tmp dir first > rmdir("tmp"); > // make a tmp dir and copy storag-conf.xml and log4j.properties to it > copy("/cassandra/storage-conf.xml", "tmp"); > copy("/cassandra/log4j.properties", "tmp"); > System.setProperty("storage-config", "tmp"); > > // make cassandra directories. > for (String s: DatabaseDescriptor.getAllDataFileLocations()) { > mkdir(s); > } > mkdir(DatabaseDescriptor.getBootstrapFileLocation()); > mkdir(DatabaseDescriptor.getLogFileLocation()); > } > > /** > * Copies a resource from within the jar to a directory. > * > * @param resourceName > * @param directory > * @throws IOException > */ > private void copy(String resource, String directory) throws IOException { > mkdir(directory); > InputStream is = getClass().getResourceAsStream(resource); > String fileName = resource.substring(resource.lastIndexOf("/") + 1); > File file = new File(directory + System.getProperty("file.separator") + > fileName); > OutputStream out = new FileOutputStream(file); > byte buf[] = new byte[1024]; > int len; > while ((len = is.read(buf)) > 0) { > out.write(buf, 0, len); > } > out.close(); > is.close(); > } > > /** > * Creates a directory > * @param dir > * @throws IOException > */ > private void mkdir(String dir) throws IOException { > FileUtils.createDirectory(dir); > } > > /** > * Removes a directory from file system > * @param dir > */ > private void rmdir(String dir) { > FileUtils.deleteDir(new File(dir)); > } > } > > > And in the test class: > > public class XxxTest { > > private static InProcessCassandraServer cassandra; > > @BeforeClass > public static void setup() throws TTransportException, IOException, > InterruptedException { > cassandra = new InProcessCassandraServer(); > cassandra.init(); > Thread t = new Thread(cassandra); > t.setDaemon(true); > t.start(); > } > > @AfterClass > public static void shutdown() { > cassandra.stop(); > } > ... test > } > > Now you can connect to localhost:9160. > > Assumptions: > The code assumes you have two files in your classpath: > /cassandra/stogage-config.xml and /cassandra/log4j.xml. This is convenient > if you use maven, just throw them at /src/test/resources/cassandra/ > If you don't work with maven or would like to configure the configuration > files differently it should be fairly easy, just change the prepare() > method. > > > > On Sun, Jan 24, 2010 at 10:54 AM, Richard Grossman <richie...@gmail.com>wrote: > >> So Is there anybody ? Unit testing is important people ... >> Thanks >> >> >> On Thu, Jan 21, 2010 at 12:09 PM, Richard Grossman >> <richie...@gmail.com>wrote: >> >>> Here is the code I use >>> class startServer implements Runnable { >>> >>> @Override >>> public void run() { >>> try { >>> CassandraDaemon cassandraDaemon = new CassandraDaemon(); >>> cassandraDaemon.init(null); >>> cassandraDaemon.start(); >>> } catch (TTransportException e) { >>> // TODO Auto-generated catch block >>> e.printStackTrace(); >>> } catch (IOException e) { >>> // TODO Auto-generated catch block >>> e.printStackTrace(); >>> } >>> } >>> } >>> >>> Thread thread = new Thread(new startServer()); >>> thread.start(); >>> >>> <the code to test here> >>> >>> >>> >>> On Thu, Jan 21, 2010 at 12:08 PM, Richard Grossman >>> <richie...@gmail.com>wrote: >>> >>>> Yes I've seen this and also check it but if I start the server then it >>>> block the current thread I can continue the test in sequence. >>>> So I've tried to start into separate thread but no chance too it close >>>> the server even before I arrive to the code to test. >>>> >>>> If you've a trick to start the server in JVM thank >>>> >>>> Richard >>>> >>>> On Wed, Jan 20, 2010 at 3:47 PM, Jonathan Ellis <jbel...@gmail.com>wrote: >>>> >>>>> did you look at CassandraDaemon? >>>>> >>>>> >>> >> >