def setUp(self):
        super(TestCollectionNoConnect, self).setUp()

        if sys.version_info[0] == 2:
            self._original_encoding = sys.getdefaultencoding()

    def tearDown(self):
        super(TestCollectionNoConnect, self).tearDown()

        if sys.version_info[0] == 2:
            # Restore back the original encoding
            sys.setdefaultencoding(self._original_encoding)

    @unittest.skipIf(sys.version_info[0] == 3, 'Skipping tests under Python 3')
    def test_error_message_as_as_string_and_unicode_python2(self):
        msg1 = 'E11000 duplicate key error index: foo.$uid_1 dup key: { : "žfooćšžži💩" }'
        msg2 = u'E11000 duplicate key error index: foo.$uid_1 dup key: { : "žfooćšžži💩" }'
        err1 = DuplicateKeyError(msg1)
        err2 = DuplicateKeyError(msg2)

        # 1. Test with ascii encoding
        reload(sys)
        sys.setdefaultencoding('ascii')

        self.assertEqual(sys.getdefaultencoding(), 'ascii')

        err_1_str = str(err1)
        err_1_unicode = unicode(err1)
        err_2_str = str(err2)
        err_2_unicode = unicode(err2)

        self.assertEqual(err_1_str, msg1)
        self.assertEqual(err_1_unicode, unicode(msg1, 'utf-8'))

        self.assertEqual(err_2_str, msg2.encode('utf-8', errors='replace'))
        self.assertEqual(err_2_unicode, msg2)

        # 2. Test with utf-8 encoding
        reload(sys)
        sys.setdefaultencoding('utf8')

        self.assertEqual(sys.getdefaultencoding(), 'utf8')

        err_1_str = str(err1)
        err_1_unicode = unicode(err1)
        err_2_str = str(err2)
        err_2_unicode = unicode(err2)

        self.assertEqual(err_1_str, msg1)
        self.assertEqual(err_1_unicode, unicode(msg1, 'utf-8'))
        # Here casting to unicode works out of the box because default encoding
        # is utf8
        self.assertEqual(err_1_unicode, msg1)
        self.assertEqual(err_2_str, msg2.encode('utf-8', errors='replace'))
        self.assertEqual(err_2_unicode, msg2)

    @unittest.skipIf(sys.version_info[0] == 2, 'Skipping tests under Python 2')
    def test_error_message_as_as_string_and_unicode_python3(self):
        msg = 'E11000 duplicate key error index: foo.$uid_1 dup key: { : "žfooćšžži💩" }'
        err = DuplicateKeyError(msg)

        err_unicode = str(err)

        self.assertEqual(err_unicode, msg)