cleaned up buildr config

This commit is contained in:
Jonas Boner 2009-03-12 11:02:44 +01:00
parent cd9ef46cae
commit 1a0e277e27
8 changed files with 21 additions and 801 deletions

View file

@ -25,12 +25,6 @@
<artifactId>junit</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock</artifactId>
<version>2.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View file

@ -4,40 +4,31 @@ repositories.remote << 'http://www.ibiblio.org/maven2'
repositories.remote << 'http://scala-tools.org/repo-releases'
repositories.remote << 'http://scala-tools.org/repo-snapshots'
repositories.remote << 'http://www.lag.net/repo'
repositories.local = '/home/jboner/.m2/repository'
#AXIS2 = 'org.apache.axis2:axis2:jar:1.2'
#AXIOM = group('axiom-api', 'axiom-impl', 'axiom-dom',
# :under=>'org.apache.ws.commons.axiom', :version=>'1.2.4')
#AXIS_OF_WS = [AXIOM, AXIS2]
#OPENJPA = ['org.apache.openjpa:openjpa:jar:1.2.0',
# 'net.sourceforge.serp:serp:jar:1.12.0']
AKKA = ['com.scalablesolutions.akka:akka-supervisor:jar:0.1',
'com.scalablesolutions.akka:akka-util-java:jar:0.1']
GUICEYFRUIT = ['org.guiceyfruit:guice-core:jar:2.0-SNAPSHOT',
'org.guiceyfruit:guice-jsr250:jar:2.0-SNAPSHOT']
JERSEY = ['com.sun.jersey:jersey-core:jar:1.0.1',
'com.sun.jersey:jersey-server:jar:1.0.1',
'com.sun.jersey:jersey-json:jar:1.0.1',
'com.sun.jersey:jersey-atom:jar:1.0.1',
'javax.ws.rs:jsr311-api:jar:1.0']
VOLDEMORT = ['voldemort:voldemort:jar:0.4a',
'voldemort:voldemort-contrib:jar:0.4a']
SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3',
'org.slf4j:slf4j-api:jar:1.4.3',
'log4j:log4j:jar:1.2.13']
CONFIGGY = 'net.lag:configgy:jar:1.2'
AKKA_SUPERVISOR = 'com.scalablesolutions.akka:akka-supervisor:jar:0.1'
AKKA_UTIL_JAVA = 'com.scalablesolutions.akka:akka-util-java:jar:0.1'
GUICEYFRUIT_CORE = 'org.guiceyfruit:guice-core:jar:2.0-SNAPSHOT'
GUICEYFRUIT_JSR250 = 'org.guiceyfruit:guice-jsr250:jar:2.0-SNAPSHOT'
GRIZZLY_WEBSERVER = 'com.sun.grizzly:grizzly-servlet-webserver:jar:1.8.6.3'
JERSEY_CORE = 'com.sun.jersey:jersey-core:jar:1.0.1'
JERSEY_SERVER = 'com.sun.jersey:jersey-server:jar:1.0.1'
JERSEY_JSON = 'com.sun.jersey:jersey-json:jar:1.0.1'
JERSEY_ATOM = 'com.sun.jersey:jersey-atom:jar:1.0.1'
JSR_311 = 'javax.ws.rs:jsr311-api:jar:1.0'
VOLDEMORT = 'voldemort:voldemort:jar:0.4a'
VOLDEMORT_CONTRIB = 'voldemort:voldemort-contrib:jar:0.4a'
ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0'
SLF4J_LOG4J_12 = 'org.slf4j:slf4j-log4j12:jar:1.4.3'
SLF4J_API = 'org.slf4j:slf4j-api:jar:1.4.3'
LOG4J = 'log4j:log4j:jar:1.2.13'
SPECS = 'org.specs:specs:jar:1.4.3'
GRIZZLY = 'com.sun.grizzly:grizzly-servlet-webserver:jar:1.8.6.3'
JUNIT4 = 'junit:junit:jar:4.0'
desc 'The Akka Actor kernel core implementation'
define 'akka-kernel' do
project.version = '0.1'
project.group = 'com.scalablesolutios.akka'
compile.with [CONFIGGY, AKKA_SUPERVISOR, AKKA_UTIL_JAVA, GUICEYFRUIT_CORE, GUICEYFRUIT_JSR250, GRIZZLY_WEBSERVER, JERSEY_CORE, JERSEY_SERVER, JERSEY_JSON, JERSEY_ATOM, JSR_311, VOLDEMORT, VOLDEMORT_CONTRIB, ZOOKEEPER, SLF4J_LOG4J_12, SLF4J_API, LOG4J, SPECS, JUNIT4]
project.group = 'com.scalablesolutions.akka'
compile.with [AKKA, GUICEYFRUIT, JERSEY, VOLDEMORT, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, JUNIT4]
test.using :specs
package :jar
end

View file

@ -12,7 +12,7 @@
<packaging>pom</packaging>
<properties>
<akka.version>0.1-SNAPSHOT</akka.version>
<akka.version>0.1</akka.version>
<akka.groupId>com.scalablesolutions.akka</akka.groupId>
<scala.version>2.7.3</scala.version>
</properties>

View file

@ -1,202 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class GenericServerContainerTest extends JUnit4(genericServerContainerSpec) // for JUnit4 and Maven
object genericServerContainerSpec extends Specification {
var inner: GenericServerContainerActor = null
var server: GenericServerContainer = null
def createProxy(f: () => GenericServer) = {
val server = new GenericServerContainer("server", f)
server.setTimeout(100)
server
}
inner = new GenericServerContainerActor
server = createProxy(() => inner)
server.newServer
server.start
"server should be initialized" in {
server.init("testInit")
Thread.sleep(100)
expect("initializing: testInit") {
inner.log
}
}
"server should terminate with a reason " in {
server.terminate("testTerminateWithReason", 100)
Thread.sleep(100)
expect("terminating: testTerminateWithReason") {
inner.log
}
}
"server respond to async oneway message" in {
server ! OneWay
Thread.sleep(100)
expect("got a oneway") {
inner.log
}
}
"server respond to async ping message" in {
server ! Ping
Thread.sleep(100)
expect("got a ping") {
inner.log
}
}
"server respond to !!!" in {
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
expect("got a ping") {
inner.log
}
}
"server respond to !?" in {
expect("pong") {
val res: String = server !? Ping
res
}
expect("got a ping") {
inner.log
}
}
"server respond to !!! with timeout" in {
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
expect("got a ping") {
inner.log
}
}
"server respond to !!! with timeout" in {
expect("error handler") {
server !!! (OneWay, "error handler")
}
expect("got a oneway") {
inner.log
}
}
"server respond to !!! and return future with timeout" in {
val future = server !! Ping
future.receiveWithin(100) match {
case None => fail("timed out") // timed out
case Some(reply) =>
expect("got a ping") {
inner.log
}
assert("pong" === reply)
}
}
"server respond to !!! and return future with timeout" in {
val future = server !! OneWay
future.receiveWithin(100) match {
case None =>
expect("got a oneway") {
inner.log
}
case Some(reply) =>
fail("expected a timeout, got Some(reply)")
}
}
"server respond do hotswap" in {
// using base
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping
server.hotswap(Some({
case Ping => reply("hotswapped pong")
}))
expect("hotswapped pong") {
(server !!! Ping).getOrElse("nil")
}
}
"server respond do double hotswap" in {
// using base
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping
server.hotswap(Some({
case Ping => reply("hotswapped pong")
}))
expect("hotswapped pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping again
server.hotswap(Some({
case Ping => reply("hotswapped pong again")
}))
expect("hotswapped pong again") {
(server !!! Ping).getOrElse("nil")
}
}
"server respond do hotswap and then revert" in {
// using base
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping
server.hotswap(Some({
case Ping => reply("hotswapped pong")
}))
expect("hotswapped pong") {
(server !!! Ping).getOrElse("nil")
}
// restoring original base
server.hotswap(None)
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
}
}
class GenericServerContainerActor extends GenericServer {
var log = ""
override def body: PartialFunction[Any, Unit] = {
case Ping =>
log = "got a ping"
reply("pong")
case OneWay =>
log = "got a oneway"
}
override def init(config: AnyRef) = log = "initializing: " + config
override def shutdown(reason: AnyRef) = log = "terminating: " + reason
}

View file

@ -1,40 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class GenericServerTest extends JUnit4(genericServerSpec) // for JUnit4 and Maven
object genericServerSpec extends Specification {
"server should respond to a regular message" in {
val server = new TestGenericServerActor
server.start
server !? Ping match {
case reply: String =>
assert("got a ping" === server.log)
assert("pong" === reply)
case _ => fail()
}
}
}
class TestGenericServerActor extends GenericServer {
var log: String = ""
override def body: PartialFunction[Any, Unit] = {
case Ping =>
log = "got a ping"
reply("pong")
}
}

View file

@ -1,12 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
sealed abstract class TestMessage
case object Ping extends TestMessage
case object Pong extends TestMessage
case object OneWay extends TestMessage
case object Die extends TestMessage
case object NotifySupervisorExit extends TestMessage

View file

@ -1,77 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class SupervisorStateTest extends JUnit4(supervisorStateSpec) // for JUnit4 and Maven
object supervisorStateSpec extends Specification {
val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }}
val newDummyActor = () => dummyActor
var state: SupervisorState = _
var proxy: GenericServerContainer = _
var supervisor: Supervisor = _
proxy = new GenericServerContainer("server1", newDummyActor)
object factory extends SupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
proxy,
LifeCycle(Permanent, 100))
:: Nil)
}
}
supervisor = factory.newSupervisor
state = new SupervisorState(supervisor, new AllForOneStrategy(3, 100))
"supervisor state should return added server" in {
state.addServerContainer(proxy)
state.getServerContainer("server1") match {
case None => fail("should have returned server")
case Some(server) =>
assert(server != null)
assert(server.isInstanceOf[GenericServerContainer])
assert(proxy === server)
}
}
"supervisor state should remove added server" in {
state.addServerContainer(proxy)
state.removeServerContainer("server1")
state.getServerContainer("server1") match {
case Some(_) => fail("should have returned None")
case None =>
}
state.getServerContainer("dummyActor") match {
case Some(_) => fail("should have returned None")
case None =>
}
}
"supervisor state should fail getting non-existent server by symbol" in {
state.getServerContainer("server2") match {
case Some(_) => fail("should have returned None")
case None =>
}
}
"supervisor state should fail getting non-existent server by actor" in {
state.getServerContainer("dummyActor") match {
case Some(_) => fail("should have returned None")
case None =>
}
}
}

View file

@ -1,434 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
import scala.collection.Map
import scala.collection.mutable.HashMap
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class SupervisorTest extends JUnit4(supervisorSpec) // for JUnit4 and Maven
object supervisorSpec extends Specification {
var messageLog: String = ""
val pingpong1 = new GenericServerContainer("pingpong1", () => new PingPong1Actor)
val pingpong2 = new GenericServerContainer("pingpong2", () => new PingPong2Actor)
val pingpong3 = new GenericServerContainer("pingpong3", () => new PingPong3Actor)
pingpong1.setTimeout(100)
pingpong2.setTimeout(100)
pingpong3.setTimeout(100)
@BeforeMethod
def setup = messageLog = ""
// ===========================================
"starting supervisor should start the servers" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
}
// ===========================================
"started supervisor should be able to return started servers" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
val server = sup.getServerOrElse("pingpong1", throw new RuntimeException("server not found"))
assert(server.isInstanceOf[GenericServerContainer])
assert(server === pingpong1)
}
// ===========================================
"started supervisor should fail returning non-existing server" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
intercept(classOf[RuntimeException]) {
sup.getServerOrElse("wrong_name", throw new RuntimeException("server not found"))
}
}
// ===========================================
"supervisor should restart killed server with restart strategy one_for_one" in {
val sup = getSingleActorOneForOneSupervisor
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("oneforone") {
messageLog
}
}
// ===========================================
"supervisor should restart used killed server with restart strategy one_for_one" in {
val sup = getSingleActorOneForOneSupervisor
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("ping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingoneforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingoneforoneping") {
messageLog
}
}
// ===========================================
"supervisor should restart killed server with restart strategy all_for_one" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("allforone") {
messageLog
}
}
// ===========================================
"supervisor should restart used killed server with restart strategy all_for_one" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("ping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingallforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingallforoneping") {
messageLog
}
}
// ===========================================
"supervisor should restart killed multiple servers with restart strategy one_for_one" in {
val sup = getMultipleActorsOneForOneConf
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong3 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("oneforone") {
messageLog
}
}
// ===========================================
"supervisor should restart killed multiple servers with restart strategy one_for_one" in {
val sup = getMultipleActorsOneForOneConf
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingpingpingoneforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingpingoneforonepingpingping") {
messageLog
}
}
// ===========================================
"supervisor should restart killed muliple servers with restart strategy all_for_one" in {
val sup = getMultipleActorsAllForOneConf
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("allforoneallforoneallforone") {
messageLog
}
}
// ===========================================
"supervisor should restart killed muliple servers with restart strategy all_for_one" in {
val sup = getMultipleActorsAllForOneConf
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingpingpingallforoneallforoneallforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingpingallforoneallforoneallforonepingpingping") {
messageLog
}
}
"supervisor should restart killed first-level server with restart strategy all_for_one" in {
val sup = getNestedSupervisorsAllForOneConf
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("allforoneallforoneallforone") {
messageLog
}
}
// =============================================
// Creat some supervisors with different configurations
def getSingleActorAllForOneSupervisor: Supervisor = {
// Create an abstract SupervisorContainer that works for all implementations
// of the different Actors (Services).
//
// Then create a concrete container in which we mix in support for the specific
// implementation of the Actors we want to use.
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getSingleActorOneForOneSupervisor: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(OneForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getMultipleActorsAllForOneConf: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
::
Worker(
pingpong2,
LifeCycle(Permanent, 100))
::
Worker(
pingpong3,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getMultipleActorsOneForOneConf: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(OneForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
::
Worker(
pingpong2,
LifeCycle(Permanent, 100))
::
Worker(
pingpong3,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getNestedSupervisorsAllForOneConf: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
::
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong2,
LifeCycle(Permanent, 100))
::
Worker(
pingpong3,
LifeCycle(Permanent, 100))
:: Nil)
:: Nil)
}
}
factory.newSupervisor
}
class PingPong1Actor extends GenericServer {
override def body: PartialFunction[Any, Unit] = {
case Ping =>
messageLog += "ping"
reply("pong")
case Die =>
throw new RuntimeException("Recieved Die message")
}
}
class PingPong2Actor extends GenericServer {
override def body: PartialFunction[Any, Unit] = {
case Ping =>
messageLog += "ping"
reply("pong")
case Die =>
throw new RuntimeException("Recieved Die message")
}
}
class PingPong3Actor extends GenericServer {
override def body: PartialFunction[Any, Unit] = {
case Ping =>
messageLog += "ping"
reply("pong")
case Die =>
throw new RuntimeException("Recieved Die message")
}
}
// =============================================
class TestAllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends AllForOneStrategy(maxNrOfRetries, withinTimeRange) {
override def postRestart(serverContainer: GenericServerContainer) = {
messageLog += "allforone"
}
}
class TestOneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends OneForOneStrategy(maxNrOfRetries, withinTimeRange) {
override def postRestart(serverContainer: GenericServerContainer) = {
messageLog += "oneforone"
}
}
abstract class TestSupervisorFactory extends SupervisorFactory {
override def create(strategy: RestartStrategy): Supervisor = strategy match {
case RestartStrategy(scheme, maxNrOfRetries, timeRange) =>
scheme match {
case AllForOne => new Supervisor(new TestAllForOneStrategy(maxNrOfRetries, timeRange))
case OneForOne => new Supervisor(new TestOneForOneStrategy(maxNrOfRetries, timeRange))
}
}
}
}