def METHOD_NAME(self):
    """Prechange callback that returns False stops changes from being made.
    Setup:
      * Set API calls to return a firewall rule that doesn't match the
        expected policy.
      * Create a prechange callback function that always returns False.
      * Send a mock project and policy to run().
    Expected results:
      An EnforcerLog proto showing 1 success, 1 project unchanged.
    """
    self.gce_api_client.get_firewall_rules.return_value = (
        constants.DEFAULT_FIREWALL_API_RESPONSE)
    project_policies = [(self.project, self.policy)]
    # Use a mutable list to get around nonlocal variable restrictions
    callback_called = [0]
    def prechange_callback(project, rules_to_delete, rules_to_insert,
                           rules_to_update):
        self.assertEqual(self.project, project)
        self.assertEqual(sorted(constants.DEFAULT_FIREWALL_RULES),
                         sorted(rules_to_delete))
        self.assertEqual(sorted(constants.EXPECTED_FIREWALL_RULES),
                         sorted(rules_to_insert))
        self.assertEqual([], rules_to_update)
        callback_called[0] += 1
        return False
    results = self.batch_enforcer.run(project_policies,
                                      prechange_callback=prechange_callback)
    self.expected_summary.projects_total = 1
    self.expected_summary.projects_success = 1
    self.expected_summary.projects_unchanged = 1
    self.assertEqual(self.expected_summary, results.summary)
    self.assertEqual(1, callback_called[0])