Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.335
diff -u -p -r1.335 bootstrap.inc
--- includes/bootstrap.inc	22 Dec 2009 14:47:14 -0000	1.335
+++ includes/bootstrap.inc	25 Dec 2009 01:43:09 -0000
@@ -1502,6 +1502,13 @@ function drupal_bootstrap($phase = NULL,
     // phase.
     while ($phases && $phase > $completed_phase && $final_phase > $completed_phase) {
       $current_phase = array_shift($phases);
+
+      // This function is re-entrant. Only update the completed phase when the
+      // current call actually resulted in a progress in the bootstrap process.
+      if ($current_phase > $completed_phase) {
+        $completed_phase = $current_phase;
+      }
+
       switch ($current_phase) {
         case DRUPAL_BOOTSTRAP_CONFIGURATION:
           _drupal_bootstrap_configuration();
@@ -1537,11 +1544,6 @@ function drupal_bootstrap($phase = NULL,
           _drupal_bootstrap_full();
           break;
       }
-      // This function is reentrant. Only update the completed phase when the
-      // current call actually resulted in a progress in the bootstrap process.
-      if ($current_phase > $completed_phase) {
-        $completed_phase = $current_phase;
-      }
     }
   }
   return $completed_phase;
Index: modules/simpletest/tests/bootstrap.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v
retrieving revision 1.26
diff -u -p -r1.26 bootstrap.test
--- modules/simpletest/tests/bootstrap.test	21 Nov 2009 14:35:05 -0000	1.26
+++ modules/simpletest/tests/bootstrap.test	25 Dec 2009 01:43:13 -0000
@@ -413,3 +413,30 @@ class BootstrapResettableStaticTestCase 
     $this->assertEqual($var, 'foo', t('Variable was reset after second invocation of global reset.'));
   }
 }
+
+/**
+ * Test that drupal_get_bootstrap_phase() returns the current bootstrap phase.
+ */
+class BootstrapPhaseTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Bootstrap phase',
+      'description' => 'Tests that drupal_bootstrap_phase() returns the current phase .',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test');
+  }
+
+  /**
+   * Confirm that calling drupal_bootstrap_phase() during hook_init()
+   * returns DRUPAL_BOOTSTRAP_FULL
+   */
+  function testDrupalBootstrapPhase() {
+    $this->drupalGet('');
+    $this->assertText(t('Current bootstrap phase is @phase', array('@phase' => DRUPAL_BOOTSTRAP_FULL)), t('Bootstrap phase is returned correctly.'));
+  }
+}
Index: modules/simpletest/tests/system_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/system_test.module,v
retrieving revision 1.23
diff -u -p -r1.23 system_test.module
--- modules/simpletest/tests/system_test.module	8 Dec 2009 06:39:34 -0000	1.23
+++ modules/simpletest/tests/system_test.module	25 Dec 2009 01:43:14 -0000
@@ -225,6 +225,14 @@ function system_test_init() {
   if (variable_get('front_page_output', 0) && drupal_is_front_page()) {
     drupal_set_message(t('On front page.'));
   }
+
+  // Used by BootstrapPhaseTestCase to show the current bootstrap phase.
+  // Only show this when page caching is off to avoid interfering with the
+  // hook_boot() and hook_exit() test cases, since drupal_set_message()
+  // suppresses caching.
+  if (!variable_get('cache', FALSE)) {
+    drupal_set_message(t('Current bootstrap phase is @phase', array('@phase' => drupal_get_bootstrap_phase())));
+  }
 }
 
 /**
