Glenn Jahnke's blog



Glenn JahnkeGlenn Jahnke
Adventures in TDDing Scala Actors with Scalatest
edit Posted by Glenn Jahnke on Saturday February 27, 2010 at 07:47PM

Recently, Martin Odersky and David Pollak visited Pivotal Labs to show off Scala and its Lift web framework. I have an ongoing interest in concurrent programming and this resparked my interest in Scala and its Actors, a library that leverages the Erlang style concurrency model but with a (relatively) more familiar JVM language. I began spiking on a project with Actors some time ago but hit several issues that made me really want to test-drive the project to both drive out better design, and hopefully eliminate some of these bugs in a more productive manner.

After some effort reading documentation about both ScalaTest and Scala's Actors, and wrangling with the compiler for a while, here is where I am so far.

The test for a very simple Square class that accepts three messages, then returns the maximum.

package test

import org.scalatest._
import matchers.MustMatchers
import main.Square

class SquareSpec extends Spec with MustMatchers {
  describe("Square") {
    it("returns the max of 3 messages received") {
      val timeout = 500
      val square = new Square
      square ! 1
      square ! 3
      (square !? (timeout, 2)).get must equal(3)
    }
  }
}

Here is the implementation.

package main

import scala.actors.Actor
import scala.actors.Actor._

class Square extends Actor {
  var numMessagesReceived = 0
  var maxMessageReceived = Integer.MIN_VALUE
  this.start
  def act() {
    loop {
      react {
        case msg : Int => replyWhenNecessary(msg)
      }
    }
  }

  def replyWhenNecessary(msg : Int) {
    println(msg)
    maxMessageReceived = if(maxMessageReceived > msg) {maxMessageReceived} else {msg}
    numMessagesReceived += 1
    if(numMessagesReceived == 3) {
      reply(maxMessageReceived)
      exit
    }
  }
}

Things I learned:

Scala

  • Scala's classes don't call out the main constructor, you just dump the class variables in parentheses after the class name and constructor code inside the body of the class

Actors

  • You can use the method!?(timeout, message) in place of !(message) to synchronously, and with a timeout, get a return message from the actor. The actor must reply though. The timeout is great for testing, often you'll have an actor in an infinite loop and your test won't complete instead of failing nicely.

ScalaTest

  • ScalaTest has several flavors of test, but the one that most Rubyists will appreciate is having your test class extend Spec as it is most similar to RSpec.

General

  • IntelliJ Community Edition with the Scala plugin is pretty awesome.

Hopefully I'll have more later as I continue my effort to learn how to test concurrent programming.

Glenn JahnkeGlenn Jahnke
Standup 2/17/2010: A New Jasmine Release
edit Posted by Glenn Jahnke on Wednesday February 17, 2010 at 09:14AM

Interesting Things

There is a new release of Jasmine, the Javascript testing framework written by several people here at Pivotal Labs, due to a bug found in CI related to implementing Rack.

For those uninitiated to Javascript BDD testing, here is a quick example.

it('should be a test', function () {
  var foo = 0
  foo++;

  expect(foo).toBeTruthy();
  expect(foo).toEqual(1);
});

Be sure to check out Jasmine at Github.

Glenn JahnkeGlenn Jahnke
Standup 8/13/2009: BART Strike, etc
edit Posted by Glenn Jahnke on Friday August 14, 2009 at 09:19AM

Ask for Help

"BART will be striking for an indefinite period of time starting Monday"

Somewhat scary for those of us trying to get into the city... good luck to everyone else in the same predicament.

"Has anyone used geminstaller to install Passenger?"

It appears not.

Interesting

"EngineYard's Solo offering now has a feature called quickstart"

The Solo Linux OS image which is built to run on Amazon's EC2 apparently has a new quickstart feature that lets people drop a git repository link into their web interface and self configures things appropriately. Pretty interesting.

"RabbitMQ is a viable option for projects"

RabbitMQ has been vetted and so far has proven to be stable, fast, and reliable, despite a few things we had to iron out first. Pretty cool new technology with some good Ruby integration in the form of the amqp gem. This website had a similar experience with RabbitMQ, AMQP, and Rails.

"Rails code committers inside Pivotal now get t-shirts denoting that fact for their efforts"

Sweet ;).

Glenn JahnkeGlenn Jahnke
Standup 8/13/2009: Java, Java, Java
edit Posted by Glenn Jahnke on Thursday August 13, 2009 at 02:57PM

Despite being a Ruby shop, we do have our hands in some Java issues...

Ask for Help

"Anyone know of a good Rhino Javascript book?" (He was looking for more information on the Javascript implementation using Java and related information)

Nope :(.

"What is the status of finding out how to sandbox Java"

Still in progress.

Interesting

Changing the Java version from 1.5 to 1.6 in Mac OSX is painful.

  • It may be tempting to manually install Java and then just change the link (in some file called "a"), but this is wrong and spits out warnings.

  • Most options can be set using:

    /Applications/Utilities/Java\ Preferences.app/Contents/MacOS/Java\ Preferences

and then setting $JAVA_HOME is up to you.

Glenn JahnkeGlenn Jahnke
Standup 8/12/2009: Using stub with before(:all)
edit Posted by Glenn Jahnke on Wednesday August 12, 2009 at 05:43PM

Ask for Help

"My method stub only works on the first RSpec example and clearing in subsequent examples, what's wrong?"

Using RSpec, it is common to mock out certain aspects of your code to change functionality for testing. This is accomplished using the "stub" method and passing the method name as a symbol.

SomeObject.stub(:some_method_to_modify).and_return do something_else() end

As we like to keep our code nice and DRY, we often pull things into "before" blocks. Unfortunately, this can cause some confusion as

describe "ObjectA" do
    before :all do
        ObjectB.stub!(:some_method_ObjectA_depends_on).and_return(15)
    end

    it "can test something" do
        ...
    end

    it "can test something else" do
        Objectb.some_method_ObjectA_depends_on
    end

end

will have ObjectB.some_method_ObjectA_depends_on actually executing ObjectB's method instead of stubbing. This is because after each example ("it" block), all stubs are cleared from all objects, leaving the stubs only effective in the first example.

Glenn JahnkeGlenn Jahnke
Standup 8/10/2009: Javascript Date-Time Picker
edit Posted by Glenn Jahnke on Monday August 10, 2009 at 05:23PM

Ask for Help

"Does anyone know of the best current Date-Time picker for Javascript?"

*Tim Harper's Calendar Date Select was recommended for its simplicity and rails integration.

Simply install the gem and add it as a project dependency:

sudo gem install calendar_date_select
config.gem "calendar_date_select"

And insert into your Rails code:

<%= calendar_date_select_includes "red" %>

And voila, you have an intuitive time and date selector:

Date and Time Selector GUIJ

Check out the live Demo.

*Yahoo's Javascript toolkit was determined to work well for people in need of a date and time selection GUI.