Index: modules/simpletest/drupal_web_test_case.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/drupal_web_test_case.php,v
retrieving revision 1.198
diff -u -r1.198 drupal_web_test_case.php
--- modules/simpletest/drupal_web_test_case.php	26 Feb 2010 17:22:39 -0000	1.198
+++ modules/simpletest/drupal_web_test_case.php	27 Feb 2010 23:39:37 -0000
@@ -953,6 +953,14 @@
    *   Role ID of newly created role, or FALSE if role creation failed.
    */
   protected function drupalCreateRole(array $permissions, $name = NULL) {
+    // Avoid creating roles of duplicate permission sets, unless a different
+    // name is given.
+    $roles_created = &drupal_static(__FUNCTION__, array());
+    $role_hash = md5(implode(':', $permissions) . ':' . $name);
+    if (isset($roles_created[$role_hash])) {
+      return $roles_created[$role_hash];
+    }
+
     // Generate random name if it was not passed.
     if (!$name) {
       $name = $this->randomName();
@@ -973,6 +981,7 @@
     if ($role && !empty($role->rid)) {
       $count = db_query('SELECT COUNT(*) FROM {role_permission} WHERE rid = :rid', array(':rid' => $role->rid))->fetchField();
       $this->assertTrue($count == count($permissions), t('Created permissions: @perms', array('@perms' => implode(', ', $permissions))), t('Role'));
+      $roles_created[$role_hash] = $role->rid;
       return $role->rid;
     }
     else {
