nitrpg: avoid race conditions in tests that imply database
authorAlexandre Terrasa <alexandre@moz-code.org>
Tue, 15 Dec 2015 01:58:49 +0000 (20:58 -0500)
committerAlexandre Terrasa <alexandre@moz-code.org>
Tue, 15 Dec 2015 22:29:12 +0000 (17:29 -0500)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

contrib/nitrpg/src/test_achievements.nit
contrib/nitrpg/src/test_events.nit
contrib/nitrpg/src/test_game.nit
contrib/nitrpg/src/test_helper.nit
contrib/nitrpg/src/test_listener.nit
contrib/nitrpg/src/test_statistics.nit

index b5d4cb7..033832f 100644 (file)
@@ -24,29 +24,27 @@ class TestGame
        super NitrpgTestHelper
 
        fun test_add_achievement do
-               var db = load_db("test_add_achievement")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var a1 = new Achievement(game, "test_id1", "test_name", "test_desc", 15)
                var a2 = new Achievement(game, "test_id2", "test_name", "test_desc", 15)
                game.add_achievement(a1)
                game.add_achievement(a2)
                assert game.load_achievements.length == 2
-               db.drop
        end
 
        fun test_load_achievement do
-               var db = load_db("test_load_achievement")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var a1 = new Achievement(game, "test_id1", "test_name", "test_desc", 15)
                var a2 = new Achievement(game, "test_id2", "test_name", "test_desc", 15)
                game.add_achievement(a1)
                assert game.load_achievement(a1.id).id == "test_id1"
                assert game.load_achievement(a2.id) == null
-               db.drop
        end
 
        fun test_load_achievements do
-               var db = load_db("test_load_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var a1 = new Achievement(game, "test_id1", "test_name", "test_desc", 15)
                var a2 = new Achievement(game, "test_id2", "test_name", "test_desc", 15)
@@ -58,7 +56,6 @@ class TestGame
                var res = game.load_achievements
                assert res.length == 2
                for a in res.values do assert ok.has(a.id)
-               db.drop
        end
 end
 
@@ -66,7 +63,7 @@ class TestPlayer
        super NitrpgTestHelper
 
        fun test_add_achievement do
-               var db = load_db("test_add_achievement")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var player1 = new Player(game, "Morriar")
                var a1 = new Achievement(game, "test_id1", "test_name", "test_desc", 15)
@@ -74,11 +71,10 @@ class TestPlayer
                player1.add_achievement(a1)
                player1.add_achievement(a2)
                assert player1.load_achievements.length == 2
-               db.drop
        end
 
        fun test_load_achievement do
-               var db = load_db("test_load_achievement")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var player1 = new Player(game, "Morriar")
                var player2 = new Player(game, "xymus")
@@ -90,11 +86,10 @@ class TestPlayer
                assert player1.load_achievement(a2.id) == null
                assert player2.load_achievement(a2.id).id == "test_id2"
                assert player2.load_achievement(a1.id) == null
-               db.drop
        end
 
        fun test_load_achievements do
-               var db = load_db("test_load_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var player1 = new Player(game, "Morriar")
                var player2 = new Player(game, "xymus")
@@ -108,7 +103,6 @@ class TestPlayer
                var res = player1.load_achievements
                assert res.length == 2
                for a in res.values do assert ok.has(a.id)
-               db.drop
        end
 end
 
@@ -116,18 +110,17 @@ class TestAchievement
        super NitrpgTestHelper
 
        fun test_init do
-               var db = load_db("test_init")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var a = new Achievement(game, "test_id", "test_name", "test_desc", 15)
                assert a.id == "test_id"
                assert a.name == "test_name"
                assert a.desc == "test_desc"
                assert a.reward == 15
-               db.drop
        end
 
        fun test_init_from_json do
-               var db = load_db("test_init_from_json")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var json = """{
                        "id": "test_id",
@@ -140,6 +133,5 @@ class TestAchievement
                assert a.name == "test_name"
                assert a.desc == "test_desc"
                assert a.reward == 15
-               db.drop
        end
 end
index 83f17bf..b960501 100644 (file)
@@ -24,29 +24,27 @@ class TestGame
        super NitrpgTestHelper
 
        fun test_add_event do
-               var db = load_db("test_add_event")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var event1 = new GameEvent(game, "test_kind", new JsonObject)
                var event2 = new GameEvent(game, "test_kind", new JsonObject)
                game.add_event(event1)
                game.add_event(event2)
                assert game.load_events.length == 2
-               db.drop
        end
 
        fun test_load_event do
-               var db = load_db("test_load_event")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var event1 = new GameEvent(game, "test_kind", new JsonObject)
                var event2 = new GameEvent(game, "test_kind", new JsonObject)
                game.add_event(event1)
                assert game.load_event(event1.internal_id).kind == "test_kind"
                assert game.load_event(event2.internal_id) == null
-               db.drop
        end
 
        fun test_load_events do
-               var db = load_db("test_load_events")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var event1 = new GameEvent(game, "test_kind", new JsonObject)
                var event2 = new GameEvent(game, "test_kind", new JsonObject)
@@ -58,7 +56,6 @@ class TestGame
                var res = game.load_events
                assert res.length == 2
                for event in res do assert ok.has(event.internal_id)
-               db.drop
        end
 end
 
@@ -66,7 +63,7 @@ class TestPlayer
        super NitrpgTestHelper
 
        fun test_add_event do
-               var db = load_db("test_add_event")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var player1 = new Player(game, "Morriar")
                var player2 = new Player(game, "xymus")
@@ -76,11 +73,10 @@ class TestPlayer
                player1.add_event(event2)
                assert player1.load_events.length == 2
                assert player2.load_events.length == 0
-               db.drop
        end
 
        fun test_load_event do
-               var db = load_db("test_load_event")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var player1 = new Player(game, "Morriar")
                var player2 = new Player(game, "xymus")
@@ -92,11 +88,10 @@ class TestPlayer
                assert player1.load_event(event2.internal_id) == null
                assert player2.load_event(event2.internal_id).kind == "test_kind"
                assert player2.load_event(event1.internal_id) == null
-               db.drop
        end
 
        fun test_load_events do
-               var db = load_db("test_load_events")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var player1 = new Player(game, "Morriar")
                var player2 = new Player(game, "xymus")
@@ -110,7 +105,6 @@ class TestPlayer
                assert player2.load_events.length == 1
                var ok = [event1.internal_id, event2.internal_id]
                for event in player1.load_events do assert ok.has(event.internal_id)
-               db.drop
        end
 end
 
@@ -118,15 +112,14 @@ class TestGameEvent
        super NitrpgTestHelper
 
        fun test_init do
-               var db = load_db("test_init")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var event = new GameEvent(game, "test_kind", new JsonObject)
                assert event.to_json["kind"] == "test_kind"
-               db.drop
        end
 
        fun test_init_from_json do
-               var db = load_db("test_init_from_json")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var json = """{
                        "internal_id": "test_id",
@@ -139,6 +132,5 @@ class TestGameEvent
                assert event.kind == "test_kind"
                assert event.data.to_json == """{"test_field":"test_value"}"""
                assert event.time.to_s == "2015-02-05T00:00:00Z"
-               db.drop
        end
 end
index 78f3bd0..fceafb9 100644 (file)
@@ -23,7 +23,7 @@ class TestGame
        super NitrpgTestHelper
 
        fun test_add_player do
-               var db = load_db("test_add_player")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var users = ["Morriar", "xymus"]
                for name in users do
@@ -34,11 +34,10 @@ class TestGame
                for player in res do
                        assert users.has(player.name)
                end
-               db.drop
        end
 
        fun test_load_player do
-               var db = load_db("test_load_player")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var ogame = load_game("Morriar/nit", db)
 
@@ -51,11 +50,10 @@ class TestGame
                assert game.load_player("Morriar").name == "Morriar"
                assert ogame.load_player("privat").name == "privat"
                assert ogame.load_player("Morriar") == null
-               db.drop
        end
 
        fun test_load_players do
-               var db = load_db("test_load_players")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var ogame = load_game("Morriar/nit", db)
 
@@ -69,7 +67,6 @@ class TestGame
                var players = game.load_players
                var ok = ["Morriar", "xymus"]
                for player in players.values do assert ok.has(player.name)
-               db.drop
        end
 end
 
@@ -77,47 +74,43 @@ class TestPlayer
        super NitrpgTestHelper
 
        fun test_init do
-               var db = load_db("test_init")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var player = new Player(game, "Morriar")
                assert player.name == "Morriar"
                assert player.user.login == "Morriar"
                assert player.nitcoins == 0
-               db.drop
        end
 
        fun test_init_from_json do
-               var db = load_db("test_init_from_json")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var json = """{"name": "Morriar", "nitcoins": 10}""".parse_json
                var player = new Player.from_json(game, json.as(JsonObject))
                assert player.name == "Morriar"
                assert player.user.login == "Morriar"
                assert player.nitcoins == 10
-               db.drop
        end
 
        fun test_save do
-               var db = load_db("test_save")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var json = """{"name": "Morriar", "nitcoins": 10}""".parse_json.as(JsonObject)
                var player = new Player.from_json(game, json)
                player.save
                assert game.db.collection("players").find(json) != null
-               db.drop
        end
 
        fun test_game_add_player do
-               var db = load_db("test_game_add_player")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                game.add_player(game.api.load_user("Morriar").as(not null))
                var json = """{"name": "Morriar"}""".parse_json.as(JsonObject)
                assert game.db.collection("players").find(json) != null
-               db.drop
        end
 
        fun test_game_load_player do
-               var db = load_db("test_game_load_player")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var json = """{"name": "Morriar", "nitcoins": 10}""".parse_json.as(JsonObject)
                var player = new Player.from_json(game, json)
@@ -125,7 +118,6 @@ class TestPlayer
                var oplayer = game.load_player("Morriar")
                assert oplayer != null
                assert player.nitcoins == oplayer.nitcoins
-               db.drop
        end
 end
 
@@ -133,7 +125,7 @@ class TestUser
        super NitrpgTestHelper
 
        fun test_player do
-               var db = load_db("test_player")
+               var db = gen_test_db
                var api = new GithubAPI(get_github_oauth)
                var game = load_game("privat/nit", db)
                var user = api.load_user("Morriar")
@@ -141,6 +133,5 @@ class TestUser
                var player = user.player(game)
                assert player.name == "Morriar"
                game.clear
-               db.drop
        end
 end
index d8ba14e..1ac8314 100644 (file)
@@ -36,7 +36,7 @@ abstract class NitrpgTestHelper
        var mongo = new MongoClient("mongodb://localhost:27017/")
 
        # Load a new test database by with a name
-       fun load_db(name: String): MongoDb do return mongo.database(name)
+       private fun load_db(name: String): MongoDb do return mongo.database(name)
 
        # Load a repo by its name.
        fun load_repo(name: String): Repo do
@@ -51,4 +51,23 @@ abstract class NitrpgTestHelper
                game.db_name = db.name
                return game
        end
+
+       # Stack of db used for testing.
+       var test_dbs = new Array[MongoDb]
+
+       # Gen a test db with a random name (to avoid race conditions).
+       fun gen_test_db: MongoDb do
+               var db_name = "test_nitrpg_{get_time}_{1000.rand}"
+               var db = load_db(db_name)
+               test_dbs.add db
+               return db
+       end
+
+       # Should be called after your test.
+       fun drop_test_db do
+               var db = test_dbs.pop
+               db.drop
+       end
+
+       redef fun after_test do drop_test_db
 end
index edbfe37..ee6d13b 100644 (file)
@@ -45,7 +45,7 @@ class TestListener
        var repo: Repo is lazy do return load_repo("Morriar/nit")
 
        fun test_game_issue_stats do
-               var db = load_db("test_game_issue_stats")
+               var db = gen_test_db
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
 
@@ -64,11 +64,10 @@ class TestListener
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["issues"] == 1
                assert game.stats.overall["issues_open"] == 1
-               db.drop
        end
 
        fun test_player_issue_stats do
-               var db = load_db("test_player_issue_stats")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
@@ -88,11 +87,10 @@ class TestListener
                player = new Player(game, "Morriar")
                assert player.stats.overall["issues"] == 1
                assert player.stats.overall["issues_open"] == 1
-               db.drop
        end
 
        fun test_game_pr_stats do
-               var db = load_db("test_game_pr_stats")
+               var db = gen_test_db
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
 
@@ -121,11 +119,10 @@ class TestListener
                assert game.stats.overall["pulls"] == 1
                assert game.stats.overall["pulls_open"] == 0
                assert game.stats.overall["commits"] == 2
-               db.drop
        end
 
        fun test_game_issue_comment_stats do
-               var db = load_db("test_game_issue_comment_stats")
+               var db = gen_test_db
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
 
@@ -144,11 +141,10 @@ class TestListener
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["comments"] == 2
                assert game.stats.overall["reviews"] == 1
-               db.drop
        end
 
        fun test_player_pull_reactor do
-               var db = load_db("test_player_pull_reactor")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new PlayerReactor)
@@ -170,11 +166,10 @@ class TestListener
                l.apply_event(generator.pull_close(pull), db)
                player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 12
-               db.drop
        end
 
        fun test_player_review_reactor do
-               var db = load_db("test_player_review_reactor")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new PlayerReactor)
@@ -214,11 +209,10 @@ class TestListener
                l.apply_event(generator.issue_comment_event(pull, comment), db)
                player = new Player(game, "Morriar")
                assert player.stats.overall["nitcoins"] == 4
-               db.drop
        end
 
        fun test_X_issues_achievements do
-               var db = load_db("test_X_issues_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
@@ -238,11 +232,10 @@ class TestListener
                end
                var player = new Player(game, "Morriar")
                assert player.stats.overall["nitcoins"] == 1110
-               db.drop
        end
 
        fun test_X_pulls_achievements do
-               var db = load_db("test_X_pulls_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
@@ -262,11 +255,10 @@ class TestListener
                end
                var player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 1110
-               db.drop
        end
 
        fun test_X_commits_achievements do
-               var db = load_db("test_X_commits_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
@@ -289,11 +281,10 @@ class TestListener
                end
                var player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 11110
-               db.drop
        end
 
        fun test_X_comments_achievements do
-               var db = load_db("test_X_comments_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new StatisticsReactor)
@@ -315,11 +306,10 @@ class TestListener
                end
                var player = new Player(game, "Morriar")
                assert player.stats.overall["nitcoins"] == 1110
-               db.drop
        end
 
     fun test_issues_achievements do
-               var db = load_db("test_issues_achievements")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new IssueAboutNitdoc, new IssueAboutFFI)
@@ -333,11 +323,10 @@ class TestListener
                assert player.load_achievements.has_key("issue_about_nitdoc")
                assert player.load_achievements.has_key("issue_about_ffi")
                assert player.stats.overall["nitcoins"] == 20
-               db.drop
        end
 
        fun test_comments_reactor do
-               var db = load_db("test_comments_reactor")
+               var db = gen_test_db
                var game = load_game("Morriar/nit", db)
                var l = new DummyListener
                l.add_reactor(new PlayerPingGod, new PlayerFirstReview, new PlayerSaysNitcoin)
@@ -364,6 +353,5 @@ class TestListener
                player = new Player(game, "Morriar")
                assert player.load_achievements.has_key("player_says_nitcoin")
                assert player.stats.overall["nitcoins"] == 70
-               db.drop
        end
 end
index aa4c893..766726c 100644 (file)
@@ -24,7 +24,7 @@ class TestGame
        super NitrpgTestHelper
 
        fun test_game_stats do
-               var db = load_db("test_game_stats")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var stats = game.stats
                assert stats.overall["test"] == 0
@@ -35,7 +35,6 @@ class TestGame
                var ostats = ogame.stats
                ostats.overall.inc("test")
                assert ostats.overall["test"] == 2
-               db.drop
        end
 end
 
@@ -43,7 +42,7 @@ class TestPlayer
        super NitrpgTestHelper
 
        fun test_player_stats do
-               var db = load_db("test_player_stats")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var player = new Player(game, "Morriar")
                var stats = player.stats
@@ -55,7 +54,6 @@ class TestPlayer
                var ostats = oplayer.stats
                ostats.overall.inc("test")
                assert ostats.overall["test"] == 2
-               db.drop
        end
 end
 
@@ -63,7 +61,7 @@ class TestGameStats
        super NitrpgTestHelper
 
        fun test_init_from_json do
-               var db = load_db("test_init_from_json")
+               var db = gen_test_db
                var game = load_game("privat/nit", db)
                var owner = new Player(game, "Morriar")
                var json = """{
@@ -78,6 +76,5 @@ class TestGameStats
                assert stats["test0"] == 0
                assert stats["test1"] == 10
                assert stats["test2"] == 20
-               db.drop
        end
 end