Forking and integration tests

Hi All,

I had a bug in one project, that data get duplicated in the DB due to
multiple instances of the application (multiple thins) are accessing the
DB at the same time … The typical mistake.

Problem fixed.

I just need to write a test code that covers the fixed bug.

I need to simulate the concurrent requests that can result in the
original bug. I thought of many ideas and decided to go with forking 2
or more processes (from within the test code) in which I issue a get
request to my controller-action.

Setup: MySQL DB, Rails 2.3.5, Ruby 1.9.1, Shoulda and FactoryGirl.

Unfortunately this test code doesn’t do the trick.

When I try to remove_connection before forking and then
establish_connection inside the children processes, I don’t find data
when asserting.

When trying to use the same connection among the parent process and its
children, I get into a total mess (due to concurrent access to the db
connection).

Sample errors from different runs:
The famous “MySQL has gone away”
Some other times it work perfectly!
“Mysql::Error: SAVEPOINT active_record_1 does not exist”
“undefined method all_hashes for nil:NilClass”

I know that I have so many issues to handle here: concurrency safety,
blocking DB adapter, the nature of the testing environment…etc

But, is there another approach to handle it?
What is the best practice of testing code for concurrency?

I know that u may need more details or code sample … but I’m trying to
think of the concept itself.

Sorry for the long message.
Thanks

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs