test_bytes.py 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067
  1. """Unit tests for the bytes and bytearray types.
  2. XXX This is a mess. Common tests should be unified with string_tests.py (and
  3. the latter should be modernized).
  4. """
  5. import array
  6. import os
  7. import re
  8. import sys
  9. import copy
  10. import functools
  11. import pickle
  12. import tempfile
  13. import textwrap
  14. import unittest
  15. import test.support
  16. from test.support import import_helper
  17. from test.support import warnings_helper
  18. import test.string_tests
  19. import test.list_tests
  20. from test.support import bigaddrspacetest, MAX_Py_ssize_t
  21. from test.support.script_helper import assert_python_failure
  22. if sys.flags.bytes_warning:
  23. def check_bytes_warnings(func):
  24. @functools.wraps(func)
  25. def wrapper(*args, **kw):
  26. with warnings_helper.check_warnings(('', BytesWarning)):
  27. return func(*args, **kw)
  28. return wrapper
  29. else:
  30. # no-op
  31. def check_bytes_warnings(func):
  32. return func
  33. class Indexable:
  34. def __init__(self, value=0):
  35. self.value = value
  36. def __index__(self):
  37. return self.value
  38. class BaseBytesTest:
  39. def test_basics(self):
  40. b = self.type2test()
  41. self.assertEqual(type(b), self.type2test)
  42. self.assertEqual(b.__class__, self.type2test)
  43. def test_copy(self):
  44. a = self.type2test(b"abcd")
  45. for copy_method in (copy.copy, copy.deepcopy):
  46. b = copy_method(a)
  47. self.assertEqual(a, b)
  48. self.assertEqual(type(a), type(b))
  49. def test_empty_sequence(self):
  50. b = self.type2test()
  51. self.assertEqual(len(b), 0)
  52. self.assertRaises(IndexError, lambda: b[0])
  53. self.assertRaises(IndexError, lambda: b[1])
  54. self.assertRaises(IndexError, lambda: b[sys.maxsize])
  55. self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
  56. self.assertRaises(IndexError, lambda: b[10**100])
  57. self.assertRaises(IndexError, lambda: b[-1])
  58. self.assertRaises(IndexError, lambda: b[-2])
  59. self.assertRaises(IndexError, lambda: b[-sys.maxsize])
  60. self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
  61. self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
  62. self.assertRaises(IndexError, lambda: b[-10**100])
  63. def test_from_iterable(self):
  64. b = self.type2test(range(256))
  65. self.assertEqual(len(b), 256)
  66. self.assertEqual(list(b), list(range(256)))
  67. # Non-sequence iterable.
  68. b = self.type2test({42})
  69. self.assertEqual(b, b"*")
  70. b = self.type2test({43, 45})
  71. self.assertIn(tuple(b), {(43, 45), (45, 43)})
  72. # Iterator that has a __length_hint__.
  73. b = self.type2test(iter(range(256)))
  74. self.assertEqual(len(b), 256)
  75. self.assertEqual(list(b), list(range(256)))
  76. # Iterator that doesn't have a __length_hint__.
  77. b = self.type2test(i for i in range(256) if i % 2)
  78. self.assertEqual(len(b), 128)
  79. self.assertEqual(list(b), list(range(256))[1::2])
  80. # Sequence without __iter__.
  81. class S:
  82. def __getitem__(self, i):
  83. return (1, 2, 3)[i]
  84. b = self.type2test(S())
  85. self.assertEqual(b, b"\x01\x02\x03")
  86. def test_from_tuple(self):
  87. # There is a special case for tuples.
  88. b = self.type2test(tuple(range(256)))
  89. self.assertEqual(len(b), 256)
  90. self.assertEqual(list(b), list(range(256)))
  91. b = self.type2test((1, 2, 3))
  92. self.assertEqual(b, b"\x01\x02\x03")
  93. def test_from_list(self):
  94. # There is a special case for lists.
  95. b = self.type2test(list(range(256)))
  96. self.assertEqual(len(b), 256)
  97. self.assertEqual(list(b), list(range(256)))
  98. b = self.type2test([1, 2, 3])
  99. self.assertEqual(b, b"\x01\x02\x03")
  100. def test_from_mutating_list(self):
  101. # Issue #34973: Crash in bytes constructor with mutating list.
  102. class X:
  103. def __index__(self):
  104. a.clear()
  105. return 42
  106. a = [X(), X()]
  107. self.assertEqual(bytes(a), b'*')
  108. class Y:
  109. def __index__(self):
  110. if len(a) < 1000:
  111. a.append(self)
  112. return 42
  113. a = [Y()]
  114. self.assertEqual(bytes(a), b'*' * 1000) # should not crash
  115. def test_from_index(self):
  116. b = self.type2test([Indexable(), Indexable(1), Indexable(254),
  117. Indexable(255)])
  118. self.assertEqual(list(b), [0, 1, 254, 255])
  119. self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
  120. self.assertRaises(ValueError, self.type2test, [Indexable(256)])
  121. def test_from_buffer(self):
  122. a = self.type2test(array.array('B', [1, 2, 3]))
  123. self.assertEqual(a, b"\x01\x02\x03")
  124. a = self.type2test(b"\x01\x02\x03")
  125. self.assertEqual(a, b"\x01\x02\x03")
  126. # Issues #29159 and #34974.
  127. # Fallback when __index__ raises a TypeError
  128. class B(bytes):
  129. def __index__(self):
  130. raise TypeError
  131. self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
  132. def test_from_ssize(self):
  133. self.assertEqual(self.type2test(0), b'')
  134. self.assertEqual(self.type2test(1), b'\x00')
  135. self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
  136. self.assertRaises(ValueError, self.type2test, -1)
  137. self.assertEqual(self.type2test('0', 'ascii'), b'0')
  138. self.assertEqual(self.type2test(b'0'), b'0')
  139. self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
  140. def test_constructor_type_errors(self):
  141. self.assertRaises(TypeError, self.type2test, 0.0)
  142. class C:
  143. pass
  144. self.assertRaises(TypeError, self.type2test, ["0"])
  145. self.assertRaises(TypeError, self.type2test, [0.0])
  146. self.assertRaises(TypeError, self.type2test, [None])
  147. self.assertRaises(TypeError, self.type2test, [C()])
  148. self.assertRaises(TypeError, self.type2test, encoding='ascii')
  149. self.assertRaises(TypeError, self.type2test, errors='ignore')
  150. self.assertRaises(TypeError, self.type2test, 0, 'ascii')
  151. self.assertRaises(TypeError, self.type2test, b'', 'ascii')
  152. self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
  153. self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
  154. self.assertRaises(TypeError, self.type2test, '')
  155. self.assertRaises(TypeError, self.type2test, '', errors='ignore')
  156. self.assertRaises(TypeError, self.type2test, '', b'ascii')
  157. self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
  158. def test_constructor_value_errors(self):
  159. self.assertRaises(ValueError, self.type2test, [-1])
  160. self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
  161. self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
  162. self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
  163. self.assertRaises(ValueError, self.type2test, [-10**100])
  164. self.assertRaises(ValueError, self.type2test, [256])
  165. self.assertRaises(ValueError, self.type2test, [257])
  166. self.assertRaises(ValueError, self.type2test, [sys.maxsize])
  167. self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
  168. self.assertRaises(ValueError, self.type2test, [10**100])
  169. @bigaddrspacetest
  170. def test_constructor_overflow(self):
  171. size = MAX_Py_ssize_t
  172. self.assertRaises((OverflowError, MemoryError), self.type2test, size)
  173. try:
  174. # Should either pass or raise an error (e.g. on debug builds with
  175. # additional malloc() overhead), but shouldn't crash.
  176. bytearray(size - 4)
  177. except (OverflowError, MemoryError):
  178. pass
  179. def test_constructor_exceptions(self):
  180. # Issue #34974: bytes and bytearray constructors replace unexpected
  181. # exceptions.
  182. class BadInt:
  183. def __index__(self):
  184. 1/0
  185. self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
  186. self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
  187. class BadIterable:
  188. def __iter__(self):
  189. 1/0
  190. self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
  191. def test_compare(self):
  192. b1 = self.type2test([1, 2, 3])
  193. b2 = self.type2test([1, 2, 3])
  194. b3 = self.type2test([1, 3])
  195. self.assertEqual(b1, b2)
  196. self.assertTrue(b2 != b3)
  197. self.assertTrue(b1 <= b2)
  198. self.assertTrue(b1 <= b3)
  199. self.assertTrue(b1 < b3)
  200. self.assertTrue(b1 >= b2)
  201. self.assertTrue(b3 >= b2)
  202. self.assertTrue(b3 > b2)
  203. self.assertFalse(b1 != b2)
  204. self.assertFalse(b2 == b3)
  205. self.assertFalse(b1 > b2)
  206. self.assertFalse(b1 > b3)
  207. self.assertFalse(b1 >= b3)
  208. self.assertFalse(b1 < b2)
  209. self.assertFalse(b3 < b2)
  210. self.assertFalse(b3 <= b2)
  211. @check_bytes_warnings
  212. def test_compare_to_str(self):
  213. # Byte comparisons with unicode should always fail!
  214. # Test this for all expected byte orders and Unicode character
  215. # sizes.
  216. self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
  217. self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
  218. False)
  219. self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
  220. self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
  221. False)
  222. self.assertEqual(self.type2test() == str(), False)
  223. self.assertEqual(self.type2test() != str(), True)
  224. def test_reversed(self):
  225. input = list(map(ord, "Hello"))
  226. b = self.type2test(input)
  227. output = list(reversed(b))
  228. input.reverse()
  229. self.assertEqual(output, input)
  230. def test_getslice(self):
  231. def by(s):
  232. return self.type2test(map(ord, s))
  233. b = by("Hello, world")
  234. self.assertEqual(b[:5], by("Hello"))
  235. self.assertEqual(b[1:5], by("ello"))
  236. self.assertEqual(b[5:7], by(", "))
  237. self.assertEqual(b[7:], by("world"))
  238. self.assertEqual(b[7:12], by("world"))
  239. self.assertEqual(b[7:100], by("world"))
  240. self.assertEqual(b[:-7], by("Hello"))
  241. self.assertEqual(b[-11:-7], by("ello"))
  242. self.assertEqual(b[-7:-5], by(", "))
  243. self.assertEqual(b[-5:], by("world"))
  244. self.assertEqual(b[-5:12], by("world"))
  245. self.assertEqual(b[-5:100], by("world"))
  246. self.assertEqual(b[-100:5], by("Hello"))
  247. def test_extended_getslice(self):
  248. # Test extended slicing by comparing with list slicing.
  249. L = list(range(255))
  250. b = self.type2test(L)
  251. indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
  252. for start in indices:
  253. for stop in indices:
  254. # Skip step 0 (invalid)
  255. for step in indices[1:]:
  256. self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
  257. def test_encoding(self):
  258. sample = "Hello world\n\u1234\u5678\u9abc"
  259. for enc in ("utf-8", "utf-16"):
  260. b = self.type2test(sample, enc)
  261. self.assertEqual(b, self.type2test(sample.encode(enc)))
  262. self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
  263. b = self.type2test(sample, "latin-1", "ignore")
  264. self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
  265. def test_decode(self):
  266. sample = "Hello world\n\u1234\u5678\u9abc"
  267. for enc in ("utf-8", "utf-16"):
  268. b = self.type2test(sample, enc)
  269. self.assertEqual(b.decode(enc), sample)
  270. sample = "Hello world\n\x80\x81\xfe\xff"
  271. b = self.type2test(sample, "latin-1")
  272. self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
  273. self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
  274. self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
  275. "Hello world\n")
  276. # Default encoding is utf-8
  277. self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
  278. def test_check_encoding_errors(self):
  279. # bpo-37388: bytes(str) and bytes.encode() must check encoding
  280. # and errors arguments in dev mode
  281. invalid = 'Boom, Shaka Laka, Boom!'
  282. encodings = ('ascii', 'utf8', 'latin1')
  283. code = textwrap.dedent(f'''
  284. import sys
  285. type2test = {self.type2test.__name__}
  286. encodings = {encodings!r}
  287. for data in ('', 'short string'):
  288. try:
  289. type2test(data, encoding={invalid!r})
  290. except LookupError:
  291. pass
  292. else:
  293. sys.exit(21)
  294. for encoding in encodings:
  295. try:
  296. type2test(data, encoding=encoding, errors={invalid!r})
  297. except LookupError:
  298. pass
  299. else:
  300. sys.exit(22)
  301. for data in (b'', b'short string'):
  302. data = type2test(data)
  303. print(repr(data))
  304. try:
  305. data.decode(encoding={invalid!r})
  306. except LookupError:
  307. sys.exit(10)
  308. else:
  309. sys.exit(23)
  310. try:
  311. data.decode(errors={invalid!r})
  312. except LookupError:
  313. pass
  314. else:
  315. sys.exit(24)
  316. for encoding in encodings:
  317. try:
  318. data.decode(encoding=encoding, errors={invalid!r})
  319. except LookupError:
  320. pass
  321. else:
  322. sys.exit(25)
  323. sys.exit(10)
  324. ''')
  325. proc = assert_python_failure('-X', 'dev', '-c', code)
  326. self.assertEqual(proc.rc, 10, proc)
  327. def test_from_int(self):
  328. b = self.type2test(0)
  329. self.assertEqual(b, self.type2test())
  330. b = self.type2test(10)
  331. self.assertEqual(b, self.type2test([0]*10))
  332. b = self.type2test(10000)
  333. self.assertEqual(b, self.type2test([0]*10000))
  334. def test_concat(self):
  335. b1 = self.type2test(b"abc")
  336. b2 = self.type2test(b"def")
  337. self.assertEqual(b1 + b2, b"abcdef")
  338. self.assertEqual(b1 + bytes(b"def"), b"abcdef")
  339. self.assertEqual(bytes(b"def") + b1, b"defabc")
  340. self.assertRaises(TypeError, lambda: b1 + "def")
  341. self.assertRaises(TypeError, lambda: "abc" + b2)
  342. def test_repeat(self):
  343. for b in b"abc", self.type2test(b"abc"):
  344. self.assertEqual(b * 3, b"abcabcabc")
  345. self.assertEqual(b * 0, b"")
  346. self.assertEqual(b * -1, b"")
  347. self.assertRaises(TypeError, lambda: b * 3.14)
  348. self.assertRaises(TypeError, lambda: 3.14 * b)
  349. # XXX Shouldn't bytes and bytearray agree on what to raise?
  350. with self.assertRaises((OverflowError, MemoryError)):
  351. c = b * sys.maxsize
  352. with self.assertRaises((OverflowError, MemoryError)):
  353. b *= sys.maxsize
  354. def test_repeat_1char(self):
  355. self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
  356. def test_contains(self):
  357. b = self.type2test(b"abc")
  358. self.assertIn(ord('a'), b)
  359. self.assertIn(int(ord('a')), b)
  360. self.assertNotIn(200, b)
  361. self.assertRaises(ValueError, lambda: 300 in b)
  362. self.assertRaises(ValueError, lambda: -1 in b)
  363. self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
  364. self.assertRaises(TypeError, lambda: None in b)
  365. self.assertRaises(TypeError, lambda: float(ord('a')) in b)
  366. self.assertRaises(TypeError, lambda: "a" in b)
  367. for f in bytes, bytearray:
  368. self.assertIn(f(b""), b)
  369. self.assertIn(f(b"a"), b)
  370. self.assertIn(f(b"b"), b)
  371. self.assertIn(f(b"c"), b)
  372. self.assertIn(f(b"ab"), b)
  373. self.assertIn(f(b"bc"), b)
  374. self.assertIn(f(b"abc"), b)
  375. self.assertNotIn(f(b"ac"), b)
  376. self.assertNotIn(f(b"d"), b)
  377. self.assertNotIn(f(b"dab"), b)
  378. self.assertNotIn(f(b"abd"), b)
  379. def test_fromhex(self):
  380. self.assertRaises(TypeError, self.type2test.fromhex)
  381. self.assertRaises(TypeError, self.type2test.fromhex, 1)
  382. self.assertEqual(self.type2test.fromhex(''), self.type2test())
  383. b = bytearray([0x1a, 0x2b, 0x30])
  384. self.assertEqual(self.type2test.fromhex('1a2B30'), b)
  385. self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
  386. # check that ASCII whitespace is ignored
  387. self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
  388. for c in "\x09\x0A\x0B\x0C\x0D\x20":
  389. self.assertEqual(self.type2test.fromhex(c), self.type2test())
  390. for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
  391. self.assertRaises(ValueError, self.type2test.fromhex, c)
  392. self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
  393. self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
  394. self.assertRaises(ValueError, self.type2test.fromhex, 'a')
  395. self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
  396. self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
  397. self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
  398. self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
  399. for data, pos in (
  400. # invalid first hexadecimal character
  401. ('12 x4 56', 3),
  402. # invalid second hexadecimal character
  403. ('12 3x 56', 4),
  404. # two invalid hexadecimal characters
  405. ('12 xy 56', 3),
  406. # test non-ASCII string
  407. ('12 3\xff 56', 4),
  408. ):
  409. with self.assertRaises(ValueError) as cm:
  410. self.type2test.fromhex(data)
  411. self.assertIn('at position %s' % pos, str(cm.exception))
  412. def test_hex(self):
  413. self.assertRaises(TypeError, self.type2test.hex)
  414. self.assertRaises(TypeError, self.type2test.hex, 1)
  415. self.assertEqual(self.type2test(b"").hex(), "")
  416. self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
  417. self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
  418. self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
  419. def test_hex_separator_basics(self):
  420. three_bytes = self.type2test(b'\xb9\x01\xef')
  421. self.assertEqual(three_bytes.hex(), 'b901ef')
  422. with self.assertRaises(ValueError):
  423. three_bytes.hex('')
  424. with self.assertRaises(ValueError):
  425. three_bytes.hex('xx')
  426. self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
  427. with self.assertRaises(TypeError):
  428. three_bytes.hex(None, 0)
  429. with self.assertRaises(ValueError):
  430. three_bytes.hex('\xff')
  431. with self.assertRaises(ValueError):
  432. three_bytes.hex(b'\xff')
  433. with self.assertRaises(ValueError):
  434. three_bytes.hex(b'\x80')
  435. with self.assertRaises(ValueError):
  436. three_bytes.hex(chr(0x100))
  437. self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
  438. self.assertEqual(three_bytes.hex(b'\x00'), 'b9\x0001\x00ef')
  439. self.assertEqual(three_bytes.hex('\x00'), 'b9\x0001\x00ef')
  440. self.assertEqual(three_bytes.hex(b'\x7f'), 'b9\x7f01\x7fef')
  441. self.assertEqual(three_bytes.hex('\x7f'), 'b9\x7f01\x7fef')
  442. self.assertEqual(three_bytes.hex(':', 3), 'b901ef')
  443. self.assertEqual(three_bytes.hex(':', 4), 'b901ef')
  444. self.assertEqual(three_bytes.hex(':', -4), 'b901ef')
  445. self.assertEqual(three_bytes.hex(':'), 'b9:01:ef')
  446. self.assertEqual(three_bytes.hex(b'$'), 'b9$01$ef')
  447. self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
  448. self.assertEqual(three_bytes.hex(':', -1), 'b9:01:ef')
  449. self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef')
  450. self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
  451. self.assertEqual(three_bytes.hex('*', -2), 'b901*ef')
  452. value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'
  453. self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030')
  454. def test_hex_separator_five_bytes(self):
  455. five_bytes = self.type2test(range(90,95))
  456. self.assertEqual(five_bytes.hex(), '5a5b5c5d5e')
  457. def test_hex_separator_six_bytes(self):
  458. six_bytes = self.type2test(x*3 for x in range(1, 7))
  459. self.assertEqual(six_bytes.hex(), '0306090c0f12')
  460. self.assertEqual(six_bytes.hex('.', 1), '03.06.09.0c.0f.12')
  461. self.assertEqual(six_bytes.hex(' ', 2), '0306 090c 0f12')
  462. self.assertEqual(six_bytes.hex('-', 3), '030609-0c0f12')
  463. self.assertEqual(six_bytes.hex(':', 4), '0306:090c0f12')
  464. self.assertEqual(six_bytes.hex(':', 5), '03:06090c0f12')
  465. self.assertEqual(six_bytes.hex(':', 6), '0306090c0f12')
  466. self.assertEqual(six_bytes.hex(':', 95), '0306090c0f12')
  467. self.assertEqual(six_bytes.hex('_', -3), '030609_0c0f12')
  468. self.assertEqual(six_bytes.hex(':', -4), '0306090c:0f12')
  469. self.assertEqual(six_bytes.hex(b'@', -5), '0306090c0f@12')
  470. self.assertEqual(six_bytes.hex(':', -6), '0306090c0f12')
  471. self.assertEqual(six_bytes.hex(' ', -95), '0306090c0f12')
  472. def test_join(self):
  473. self.assertEqual(self.type2test(b"").join([]), b"")
  474. self.assertEqual(self.type2test(b"").join([b""]), b"")
  475. for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
  476. lst = list(map(self.type2test, lst))
  477. self.assertEqual(self.type2test(b"").join(lst), b"abc")
  478. self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
  479. self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
  480. dot_join = self.type2test(b".:").join
  481. self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
  482. self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
  483. self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
  484. self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
  485. self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
  486. # Stress it with many items
  487. seq = [b"abc"] * 100000
  488. expected = b"abc" + b".:abc" * 99999
  489. self.assertEqual(dot_join(seq), expected)
  490. # Stress test with empty separator
  491. seq = [b"abc"] * 100000
  492. expected = b"abc" * 100000
  493. self.assertEqual(self.type2test(b"").join(seq), expected)
  494. self.assertRaises(TypeError, self.type2test(b" ").join, None)
  495. # Error handling and cleanup when some item in the middle of the
  496. # sequence has the wrong type.
  497. with self.assertRaises(TypeError):
  498. dot_join([bytearray(b"ab"), "cd", b"ef"])
  499. with self.assertRaises(TypeError):
  500. dot_join([memoryview(b"ab"), "cd", b"ef"])
  501. def test_count(self):
  502. b = self.type2test(b'mississippi')
  503. i = 105
  504. p = 112
  505. w = 119
  506. self.assertEqual(b.count(b'i'), 4)
  507. self.assertEqual(b.count(b'ss'), 2)
  508. self.assertEqual(b.count(b'w'), 0)
  509. self.assertEqual(b.count(i), 4)
  510. self.assertEqual(b.count(w), 0)
  511. self.assertEqual(b.count(b'i', 6), 2)
  512. self.assertEqual(b.count(b'p', 6), 2)
  513. self.assertEqual(b.count(b'i', 1, 3), 1)
  514. self.assertEqual(b.count(b'p', 7, 9), 1)
  515. self.assertEqual(b.count(i, 6), 2)
  516. self.assertEqual(b.count(p, 6), 2)
  517. self.assertEqual(b.count(i, 1, 3), 1)
  518. self.assertEqual(b.count(p, 7, 9), 1)
  519. def test_startswith(self):
  520. b = self.type2test(b'hello')
  521. self.assertFalse(self.type2test().startswith(b"anything"))
  522. self.assertTrue(b.startswith(b"hello"))
  523. self.assertTrue(b.startswith(b"hel"))
  524. self.assertTrue(b.startswith(b"h"))
  525. self.assertFalse(b.startswith(b"hellow"))
  526. self.assertFalse(b.startswith(b"ha"))
  527. with self.assertRaises(TypeError) as cm:
  528. b.startswith([b'h'])
  529. exc = str(cm.exception)
  530. self.assertIn('bytes', exc)
  531. self.assertIn('tuple', exc)
  532. def test_endswith(self):
  533. b = self.type2test(b'hello')
  534. self.assertFalse(bytearray().endswith(b"anything"))
  535. self.assertTrue(b.endswith(b"hello"))
  536. self.assertTrue(b.endswith(b"llo"))
  537. self.assertTrue(b.endswith(b"o"))
  538. self.assertFalse(b.endswith(b"whello"))
  539. self.assertFalse(b.endswith(b"no"))
  540. with self.assertRaises(TypeError) as cm:
  541. b.endswith([b'o'])
  542. exc = str(cm.exception)
  543. self.assertIn('bytes', exc)
  544. self.assertIn('tuple', exc)
  545. def test_find(self):
  546. b = self.type2test(b'mississippi')
  547. i = 105
  548. w = 119
  549. self.assertEqual(b.find(b'ss'), 2)
  550. self.assertEqual(b.find(b'w'), -1)
  551. self.assertEqual(b.find(b'mississippian'), -1)
  552. self.assertEqual(b.find(i), 1)
  553. self.assertEqual(b.find(w), -1)
  554. self.assertEqual(b.find(b'ss', 3), 5)
  555. self.assertEqual(b.find(b'ss', 1, 7), 2)
  556. self.assertEqual(b.find(b'ss', 1, 3), -1)
  557. self.assertEqual(b.find(i, 6), 7)
  558. self.assertEqual(b.find(i, 1, 3), 1)
  559. self.assertEqual(b.find(w, 1, 3), -1)
  560. for index in (-1, 256, sys.maxsize + 1):
  561. self.assertRaisesRegex(
  562. ValueError, r'byte must be in range\(0, 256\)',
  563. b.find, index)
  564. def test_rfind(self):
  565. b = self.type2test(b'mississippi')
  566. i = 105
  567. w = 119
  568. self.assertEqual(b.rfind(b'ss'), 5)
  569. self.assertEqual(b.rfind(b'w'), -1)
  570. self.assertEqual(b.rfind(b'mississippian'), -1)
  571. self.assertEqual(b.rfind(i), 10)
  572. self.assertEqual(b.rfind(w), -1)
  573. self.assertEqual(b.rfind(b'ss', 3), 5)
  574. self.assertEqual(b.rfind(b'ss', 0, 6), 2)
  575. self.assertEqual(b.rfind(i, 1, 3), 1)
  576. self.assertEqual(b.rfind(i, 3, 9), 7)
  577. self.assertEqual(b.rfind(w, 1, 3), -1)
  578. def test_index(self):
  579. b = self.type2test(b'mississippi')
  580. i = 105
  581. w = 119
  582. self.assertEqual(b.index(b'ss'), 2)
  583. self.assertRaises(ValueError, b.index, b'w')
  584. self.assertRaises(ValueError, b.index, b'mississippian')
  585. self.assertEqual(b.index(i), 1)
  586. self.assertRaises(ValueError, b.index, w)
  587. self.assertEqual(b.index(b'ss', 3), 5)
  588. self.assertEqual(b.index(b'ss', 1, 7), 2)
  589. self.assertRaises(ValueError, b.index, b'ss', 1, 3)
  590. self.assertEqual(b.index(i, 6), 7)
  591. self.assertEqual(b.index(i, 1, 3), 1)
  592. self.assertRaises(ValueError, b.index, w, 1, 3)
  593. def test_rindex(self):
  594. b = self.type2test(b'mississippi')
  595. i = 105
  596. w = 119
  597. self.assertEqual(b.rindex(b'ss'), 5)
  598. self.assertRaises(ValueError, b.rindex, b'w')
  599. self.assertRaises(ValueError, b.rindex, b'mississippian')
  600. self.assertEqual(b.rindex(i), 10)
  601. self.assertRaises(ValueError, b.rindex, w)
  602. self.assertEqual(b.rindex(b'ss', 3), 5)
  603. self.assertEqual(b.rindex(b'ss', 0, 6), 2)
  604. self.assertEqual(b.rindex(i, 1, 3), 1)
  605. self.assertEqual(b.rindex(i, 3, 9), 7)
  606. self.assertRaises(ValueError, b.rindex, w, 1, 3)
  607. def test_mod(self):
  608. b = self.type2test(b'hello, %b!')
  609. orig = b
  610. b = b % b'world'
  611. self.assertEqual(b, b'hello, world!')
  612. self.assertEqual(orig, b'hello, %b!')
  613. self.assertFalse(b is orig)
  614. b = self.type2test(b'%s / 100 = %d%%')
  615. a = b % (b'seventy-nine', 79)
  616. self.assertEqual(a, b'seventy-nine / 100 = 79%')
  617. self.assertIs(type(a), self.type2test)
  618. # issue 29714
  619. b = self.type2test(b'hello,\x00%b!')
  620. b = b % b'world'
  621. self.assertEqual(b, b'hello,\x00world!')
  622. self.assertIs(type(b), self.type2test)
  623. def check(fmt, vals, result):
  624. b = self.type2test(fmt)
  625. b = b % vals
  626. self.assertEqual(b, result)
  627. self.assertIs(type(b), self.type2test)
  628. # A set of tests adapted from test_unicode:UnicodeTest.test_formatting
  629. check(b'...%(foo)b...', {b'foo':b"abc"}, b'...abc...')
  630. check(b'...%(f(o)o)b...', {b'f(o)o':b"abc", b'foo':b'bar'}, b'...abc...')
  631. check(b'...%(foo)b...', {b'foo':b"abc",b'def':123}, b'...abc...')
  632. check(b'%*b', (5, b'abc',), b' abc')
  633. check(b'%*b', (-5, b'abc',), b'abc ')
  634. check(b'%*.*b', (5, 2, b'abc',), b' ab')
  635. check(b'%*.*b', (5, 3, b'abc',), b' abc')
  636. check(b'%i %*.*b', (10, 5, 3, b'abc',), b'10 abc')
  637. check(b'%i%b %*.*b', (10, b'3', 5, 3, b'abc',), b'103 abc')
  638. check(b'%c', b'a', b'a')
  639. def test_imod(self):
  640. b = self.type2test(b'hello, %b!')
  641. orig = b
  642. b %= b'world'
  643. self.assertEqual(b, b'hello, world!')
  644. self.assertEqual(orig, b'hello, %b!')
  645. self.assertFalse(b is orig)
  646. b = self.type2test(b'%s / 100 = %d%%')
  647. b %= (b'seventy-nine', 79)
  648. self.assertEqual(b, b'seventy-nine / 100 = 79%')
  649. self.assertIs(type(b), self.type2test)
  650. # issue 29714
  651. b = self.type2test(b'hello,\x00%b!')
  652. b %= b'world'
  653. self.assertEqual(b, b'hello,\x00world!')
  654. self.assertIs(type(b), self.type2test)
  655. def test_rmod(self):
  656. with self.assertRaises(TypeError):
  657. object() % self.type2test(b'abc')
  658. self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
  659. def test_replace(self):
  660. b = self.type2test(b'mississippi')
  661. self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
  662. self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
  663. def test_replace_int_error(self):
  664. self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
  665. def test_split_string_error(self):
  666. self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
  667. self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
  668. def test_split_int_error(self):
  669. self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
  670. self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
  671. def test_split_unicodewhitespace(self):
  672. for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
  673. b = self.type2test(b)
  674. self.assertEqual(b.split(), [b])
  675. b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
  676. self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
  677. def test_rsplit_unicodewhitespace(self):
  678. b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
  679. self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
  680. def test_partition(self):
  681. b = self.type2test(b'mississippi')
  682. self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
  683. self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
  684. def test_rpartition(self):
  685. b = self.type2test(b'mississippi')
  686. self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
  687. self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
  688. self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
  689. def test_partition_string_error(self):
  690. self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
  691. self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
  692. def test_partition_int_error(self):
  693. self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
  694. self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
  695. def test_pickling(self):
  696. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  697. for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
  698. b = self.type2test(b)
  699. ps = pickle.dumps(b, proto)
  700. q = pickle.loads(ps)
  701. self.assertEqual(b, q)
  702. def test_iterator_pickling(self):
  703. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  704. for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
  705. it = itorg = iter(self.type2test(b))
  706. data = list(self.type2test(b))
  707. d = pickle.dumps(it, proto)
  708. it = pickle.loads(d)
  709. self.assertEqual(type(itorg), type(it))
  710. self.assertEqual(list(it), data)
  711. it = pickle.loads(d)
  712. if not b:
  713. continue
  714. next(it)
  715. d = pickle.dumps(it, proto)
  716. it = pickle.loads(d)
  717. self.assertEqual(list(it), data[1:])
  718. def test_strip_bytearray(self):
  719. self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
  720. self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
  721. self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
  722. def test_strip_string_error(self):
  723. self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
  724. self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
  725. self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
  726. def test_strip_int_error(self):
  727. self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
  728. self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
  729. self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
  730. def test_center(self):
  731. # Fill character can be either bytes or bytearray (issue 12380)
  732. b = self.type2test(b'abc')
  733. for fill_type in (bytes, bytearray):
  734. self.assertEqual(b.center(7, fill_type(b'-')),
  735. self.type2test(b'--abc--'))
  736. def test_ljust(self):
  737. # Fill character can be either bytes or bytearray (issue 12380)
  738. b = self.type2test(b'abc')
  739. for fill_type in (bytes, bytearray):
  740. self.assertEqual(b.ljust(7, fill_type(b'-')),
  741. self.type2test(b'abc----'))
  742. def test_rjust(self):
  743. # Fill character can be either bytes or bytearray (issue 12380)
  744. b = self.type2test(b'abc')
  745. for fill_type in (bytes, bytearray):
  746. self.assertEqual(b.rjust(7, fill_type(b'-')),
  747. self.type2test(b'----abc'))
  748. def test_xjust_int_error(self):
  749. self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
  750. self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
  751. self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
  752. def test_ord(self):
  753. b = self.type2test(b'\0A\x7f\x80\xff')
  754. self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
  755. [0, 65, 127, 128, 255])
  756. def test_maketrans(self):
  757. transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
  758. self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
  759. transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz'
  760. self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
  761. self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
  762. self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
  763. def test_none_arguments(self):
  764. # issue 11828
  765. b = self.type2test(b'hello')
  766. l = self.type2test(b'l')
  767. h = self.type2test(b'h')
  768. x = self.type2test(b'x')
  769. o = self.type2test(b'o')
  770. self.assertEqual(2, b.find(l, None))
  771. self.assertEqual(3, b.find(l, -2, None))
  772. self.assertEqual(2, b.find(l, None, -2))
  773. self.assertEqual(0, b.find(h, None, None))
  774. self.assertEqual(3, b.rfind(l, None))
  775. self.assertEqual(3, b.rfind(l, -2, None))
  776. self.assertEqual(2, b.rfind(l, None, -2))
  777. self.assertEqual(0, b.rfind(h, None, None))
  778. self.assertEqual(2, b.index(l, None))
  779. self.assertEqual(3, b.index(l, -2, None))
  780. self.assertEqual(2, b.index(l, None, -2))
  781. self.assertEqual(0, b.index(h, None, None))
  782. self.assertEqual(3, b.rindex(l, None))
  783. self.assertEqual(3, b.rindex(l, -2, None))
  784. self.assertEqual(2, b.rindex(l, None, -2))
  785. self.assertEqual(0, b.rindex(h, None, None))
  786. self.assertEqual(2, b.count(l, None))
  787. self.assertEqual(1, b.count(l, -2, None))
  788. self.assertEqual(1, b.count(l, None, -2))
  789. self.assertEqual(0, b.count(x, None, None))
  790. self.assertEqual(True, b.endswith(o, None))
  791. self.assertEqual(True, b.endswith(o, -2, None))
  792. self.assertEqual(True, b.endswith(l, None, -2))
  793. self.assertEqual(False, b.endswith(x, None, None))
  794. self.assertEqual(True, b.startswith(h, None))
  795. self.assertEqual(True, b.startswith(l, -2, None))
  796. self.assertEqual(True, b.startswith(h, None, -2))
  797. self.assertEqual(False, b.startswith(x, None, None))
  798. def test_integer_arguments_out_of_byte_range(self):
  799. b = self.type2test(b'hello')
  800. for method in (b.count, b.find, b.index, b.rfind, b.rindex):
  801. self.assertRaises(ValueError, method, -1)
  802. self.assertRaises(ValueError, method, 256)
  803. self.assertRaises(ValueError, method, 9999)
  804. def test_find_etc_raise_correct_error_messages(self):
  805. # issue 11828
  806. b = self.type2test(b'hello')
  807. x = self.type2test(b'x')
  808. self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
  809. x, None, None, None)
  810. self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
  811. x, None, None, None)
  812. self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
  813. x, None, None, None)
  814. self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
  815. x, None, None, None)
  816. self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
  817. x, None, None, None)
  818. self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
  819. x, None, None, None)
  820. self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
  821. x, None, None, None)
  822. def test_free_after_iterating(self):
  823. test.support.check_free_after_iterating(self, iter, self.type2test)
  824. test.support.check_free_after_iterating(self, reversed, self.type2test)
  825. def test_translate(self):
  826. b = self.type2test(b'hello')
  827. rosetta = bytearray(range(256))
  828. rosetta[ord('o')] = ord('e')
  829. self.assertRaises(TypeError, b.translate)
  830. self.assertRaises(TypeError, b.translate, None, None)
  831. self.assertRaises(ValueError, b.translate, bytes(range(255)))
  832. c = b.translate(rosetta, b'hello')
  833. self.assertEqual(b, b'hello')
  834. self.assertIsInstance(c, self.type2test)
  835. c = b.translate(rosetta)
  836. d = b.translate(rosetta, b'')
  837. self.assertEqual(c, d)
  838. self.assertEqual(c, b'helle')
  839. c = b.translate(rosetta, b'l')
  840. self.assertEqual(c, b'hee')
  841. c = b.translate(None, b'e')
  842. self.assertEqual(c, b'hllo')
  843. # test delete as a keyword argument
  844. c = b.translate(rosetta, delete=b'')
  845. self.assertEqual(c, b'helle')
  846. c = b.translate(rosetta, delete=b'l')
  847. self.assertEqual(c, b'hee')
  848. c = b.translate(None, delete=b'e')
  849. self.assertEqual(c, b'hllo')
  850. def test_sq_item(self):
  851. _testcapi = import_helper.import_module('_testcapi')
  852. obj = self.type2test((42,))
  853. with self.assertRaises(IndexError):
  854. _testcapi.sequence_getitem(obj, -2)
  855. with self.assertRaises(IndexError):
  856. _testcapi.sequence_getitem(obj, 1)
  857. self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42)
  858. class BytesTest(BaseBytesTest, unittest.TestCase):
  859. type2test = bytes
  860. def test__bytes__(self):
  861. foo = b'foo\x00bar'
  862. self.assertEqual(foo.__bytes__(), foo)
  863. self.assertEqual(type(foo.__bytes__()), self.type2test)
  864. class bytes_subclass(bytes):
  865. pass
  866. bar = bytes_subclass(b'bar\x00foo')
  867. self.assertEqual(bar.__bytes__(), bar)
  868. self.assertEqual(type(bar.__bytes__()), self.type2test)
  869. def test_getitem_error(self):
  870. b = b'python'
  871. msg = "byte indices must be integers or slices"
  872. with self.assertRaisesRegex(TypeError, msg):
  873. b['a']
  874. def test_buffer_is_readonly(self):
  875. fd = os.open(__file__, os.O_RDONLY)
  876. with open(fd, "rb", buffering=0) as f:
  877. self.assertRaises(TypeError, f.readinto, b"")
  878. def test_custom(self):
  879. class A:
  880. def __bytes__(self):
  881. return b'abc'
  882. self.assertEqual(bytes(A()), b'abc')
  883. class A: pass
  884. self.assertRaises(TypeError, bytes, A())
  885. class A:
  886. def __bytes__(self):
  887. return None
  888. self.assertRaises(TypeError, bytes, A())
  889. class A:
  890. def __bytes__(self):
  891. return b'a'
  892. def __index__(self):
  893. return 42
  894. self.assertEqual(bytes(A()), b'a')
  895. # Issue #25766
  896. class A(str):
  897. def __bytes__(self):
  898. return b'abc'
  899. self.assertEqual(bytes(A('\u20ac')), b'abc')
  900. self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
  901. # Issue #24731
  902. class A:
  903. def __bytes__(self):
  904. return OtherBytesSubclass(b'abc')
  905. self.assertEqual(bytes(A()), b'abc')
  906. self.assertIs(type(bytes(A())), OtherBytesSubclass)
  907. self.assertEqual(BytesSubclass(A()), b'abc')
  908. self.assertIs(type(BytesSubclass(A())), BytesSubclass)
  909. # Test PyBytes_FromFormat()
  910. def test_from_format(self):
  911. ctypes = import_helper.import_module('ctypes')
  912. _testcapi = import_helper.import_module('_testcapi')
  913. from ctypes import pythonapi, py_object
  914. from ctypes import (
  915. c_int, c_uint,
  916. c_long, c_ulong,
  917. c_size_t, c_ssize_t,
  918. c_char_p)
  919. PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
  920. PyBytes_FromFormat.argtypes = (c_char_p,)
  921. PyBytes_FromFormat.restype = py_object
  922. # basic tests
  923. self.assertEqual(PyBytes_FromFormat(b'format'),
  924. b'format')
  925. self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
  926. b'Hello world !')
  927. # test formatters
  928. self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
  929. b'c=\0')
  930. self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
  931. b'c=@')
  932. self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
  933. b'c=\xff')
  934. self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
  935. c_int(1), c_long(2),
  936. c_size_t(3)),
  937. b'd=1 ld=2 zd=3')
  938. self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
  939. c_int(-1), c_long(-2),
  940. c_size_t(-3)),
  941. b'd=-1 ld=-2 zd=-3')
  942. self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
  943. c_uint(123), c_ulong(456),
  944. c_size_t(789)),
  945. b'u=123 lu=456 zu=789')
  946. self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
  947. b'i=123')
  948. self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
  949. b'i=-123')
  950. self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
  951. b'x=abc')
  952. sizeof_ptr = ctypes.sizeof(c_char_p)
  953. if os.name == 'nt':
  954. # Windows (MSCRT)
  955. ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
  956. def ptr_formatter(ptr):
  957. return (ptr_format % ptr)
  958. else:
  959. # UNIX (glibc)
  960. def ptr_formatter(ptr):
  961. return '%#x' % ptr
  962. ptr = 0xabcdef
  963. self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
  964. ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
  965. self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
  966. b's=cstr')
  967. # test minimum and maximum integer values
  968. size_max = c_size_t(-1).value
  969. for formatstr, ctypes_type, value, py_formatter in (
  970. (b'%d', c_int, _testcapi.INT_MIN, str),
  971. (b'%d', c_int, _testcapi.INT_MAX, str),
  972. (b'%ld', c_long, _testcapi.LONG_MIN, str),
  973. (b'%ld', c_long, _testcapi.LONG_MAX, str),
  974. (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
  975. (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
  976. (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
  977. (b'%zu', c_size_t, size_max, str),
  978. (b'%p', c_char_p, size_max, ptr_formatter),
  979. ):
  980. self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
  981. py_formatter(value).encode('ascii')),
  982. # width and precision (width is currently ignored)
  983. self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
  984. b'a')
  985. self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
  986. b'abc')
  987. # '%%' formatter
  988. self.assertEqual(PyBytes_FromFormat(b'%%'),
  989. b'%')
  990. self.assertEqual(PyBytes_FromFormat(b'[%%]'),
  991. b'[%]')
  992. self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
  993. b'%_')
  994. self.assertEqual(PyBytes_FromFormat(b'%%s'),
  995. b'%s')
  996. # Invalid formats and partial formatting
  997. self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
  998. self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
  999. b'x=2 y=%')
  1000. # Issue #19969: %c must raise OverflowError for values
  1001. # not in the range [0; 255]
  1002. self.assertRaises(OverflowError,
  1003. PyBytes_FromFormat, b'%c', c_int(-1))
  1004. self.assertRaises(OverflowError,
  1005. PyBytes_FromFormat, b'%c', c_int(256))
  1006. # Issue #33817: empty strings
  1007. self.assertEqual(PyBytes_FromFormat(b''),
  1008. b'')
  1009. self.assertEqual(PyBytes_FromFormat(b'%s', b''),
  1010. b'')
  1011. def test_bytes_blocking(self):
  1012. class IterationBlocked(list):
  1013. __bytes__ = None
  1014. i = [0, 1, 2, 3]
  1015. self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
  1016. self.assertRaises(TypeError, bytes, IterationBlocked(i))
  1017. # At least in CPython, because bytes.__new__ and the C API
  1018. # PyBytes_FromObject have different fallback rules, integer
  1019. # fallback is handled specially, so test separately.
  1020. class IntBlocked(int):
  1021. __bytes__ = None
  1022. self.assertEqual(bytes(3), b'\0\0\0')
  1023. self.assertRaises(TypeError, bytes, IntBlocked(3))
  1024. # While there is no separately-defined rule for handling bytes
  1025. # subclasses differently from other buffer-interface classes,
  1026. # an implementation may well special-case them (as CPython 2.x
  1027. # str did), so test them separately.
  1028. class BytesSubclassBlocked(bytes):
  1029. __bytes__ = None
  1030. self.assertEqual(bytes(b'ab'), b'ab')
  1031. self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
  1032. class BufferBlocked(bytearray):
  1033. __bytes__ = None
  1034. ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
  1035. self.assertEqual(bytes(ba), b'ab')
  1036. self.assertRaises(TypeError, bytes, bb)
  1037. def test_repeat_id_preserving(self):
  1038. a = b'123abc1@'
  1039. b = b'456zyx-+'
  1040. self.assertEqual(id(a), id(a))
  1041. self.assertNotEqual(id(a), id(b))
  1042. self.assertNotEqual(id(a), id(a * -4))
  1043. self.assertNotEqual(id(a), id(a * 0))
  1044. self.assertEqual(id(a), id(a * 1))
  1045. self.assertEqual(id(a), id(1 * a))
  1046. self.assertNotEqual(id(a), id(a * 2))
  1047. class SubBytes(bytes):
  1048. pass
  1049. s = SubBytes(b'qwerty()')
  1050. self.assertEqual(id(s), id(s))
  1051. self.assertNotEqual(id(s), id(s * -4))
  1052. self.assertNotEqual(id(s), id(s * 0))
  1053. self.assertNotEqual(id(s), id(s * 1))
  1054. self.assertNotEqual(id(s), id(1 * s))
  1055. self.assertNotEqual(id(s), id(s * 2))
  1056. class ByteArrayTest(BaseBytesTest, unittest.TestCase):
  1057. type2test = bytearray
  1058. def test_getitem_error(self):
  1059. b = bytearray(b'python')
  1060. msg = "bytearray indices must be integers or slices"
  1061. with self.assertRaisesRegex(TypeError, msg):
  1062. b['a']
  1063. def test_setitem_error(self):
  1064. b = bytearray(b'python')
  1065. msg = "bytearray indices must be integers or slices"
  1066. with self.assertRaisesRegex(TypeError, msg):
  1067. b['a'] = "python"
  1068. def test_nohash(self):
  1069. self.assertRaises(TypeError, hash, bytearray())
  1070. def test_bytearray_api(self):
  1071. short_sample = b"Hello world\n"
  1072. sample = short_sample + b"\0"*(20 - len(short_sample))
  1073. tfn = tempfile.mktemp()
  1074. try:
  1075. # Prepare
  1076. with open(tfn, "wb") as f:
  1077. f.write(short_sample)
  1078. # Test readinto
  1079. with open(tfn, "rb") as f:
  1080. b = bytearray(20)
  1081. n = f.readinto(b)
  1082. self.assertEqual(n, len(short_sample))
  1083. self.assertEqual(list(b), list(sample))
  1084. # Test writing in binary mode
  1085. with open(tfn, "wb") as f:
  1086. f.write(b)
  1087. with open(tfn, "rb") as f:
  1088. self.assertEqual(f.read(), sample)
  1089. # Text mode is ambiguous; don't test
  1090. finally:
  1091. try:
  1092. os.remove(tfn)
  1093. except OSError:
  1094. pass
  1095. def test_reverse(self):
  1096. b = bytearray(b'hello')
  1097. self.assertEqual(b.reverse(), None)
  1098. self.assertEqual(b, b'olleh')
  1099. b = bytearray(b'hello1') # test even number of items
  1100. b.reverse()
  1101. self.assertEqual(b, b'1olleh')
  1102. b = bytearray()
  1103. b.reverse()
  1104. self.assertFalse(b)
  1105. def test_clear(self):
  1106. b = bytearray(b'python')
  1107. b.clear()
  1108. self.assertEqual(b, b'')
  1109. b = bytearray(b'')
  1110. b.clear()
  1111. self.assertEqual(b, b'')
  1112. b = bytearray(b'')
  1113. b.append(ord('r'))
  1114. b.clear()
  1115. b.append(ord('p'))
  1116. self.assertEqual(b, b'p')
  1117. def test_copy(self):
  1118. b = bytearray(b'abc')
  1119. bb = b.copy()
  1120. self.assertEqual(bb, b'abc')
  1121. b = bytearray(b'')
  1122. bb = b.copy()
  1123. self.assertEqual(bb, b'')
  1124. # test that it's indeed a copy and not a reference
  1125. b = bytearray(b'abc')
  1126. bb = b.copy()
  1127. self.assertEqual(b, bb)
  1128. self.assertIsNot(b, bb)
  1129. bb.append(ord('d'))
  1130. self.assertEqual(bb, b'abcd')
  1131. self.assertEqual(b, b'abc')
  1132. def test_regexps(self):
  1133. def by(s):
  1134. return bytearray(map(ord, s))
  1135. b = by("Hello, world")
  1136. self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
  1137. def test_setitem(self):
  1138. b = bytearray([1, 2, 3])
  1139. b[1] = 100
  1140. self.assertEqual(b, bytearray([1, 100, 3]))
  1141. b[-1] = 200
  1142. self.assertEqual(b, bytearray([1, 100, 200]))
  1143. b[0] = Indexable(10)
  1144. self.assertEqual(b, bytearray([10, 100, 200]))
  1145. try:
  1146. b[3] = 0
  1147. self.fail("Didn't raise IndexError")
  1148. except IndexError:
  1149. pass
  1150. try:
  1151. b[-10] = 0
  1152. self.fail("Didn't raise IndexError")
  1153. except IndexError:
  1154. pass
  1155. try:
  1156. b[0] = 256
  1157. self.fail("Didn't raise ValueError")
  1158. except ValueError:
  1159. pass
  1160. try:
  1161. b[0] = Indexable(-1)
  1162. self.fail("Didn't raise ValueError")
  1163. except ValueError:
  1164. pass
  1165. try:
  1166. b[0] = None
  1167. self.fail("Didn't raise TypeError")
  1168. except TypeError:
  1169. pass
  1170. def test_delitem(self):
  1171. b = bytearray(range(10))
  1172. del b[0]
  1173. self.assertEqual(b, bytearray(range(1, 10)))
  1174. del b[-1]
  1175. self.assertEqual(b, bytearray(range(1, 9)))
  1176. del b[4]
  1177. self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
  1178. def test_setslice(self):
  1179. b = bytearray(range(10))
  1180. self.assertEqual(list(b), list(range(10)))
  1181. b[0:5] = bytearray([1, 1, 1, 1, 1])
  1182. self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
  1183. del b[0:-5]
  1184. self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
  1185. b[0:0] = bytearray([0, 1, 2, 3, 4])
  1186. self.assertEqual(b, bytearray(range(10)))
  1187. b[-7:-3] = bytearray([100, 101])
  1188. self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
  1189. b[3:5] = [3, 4, 5, 6]
  1190. self.assertEqual(b, bytearray(range(10)))
  1191. b[3:0] = [42, 42, 42]
  1192. self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
  1193. b[3:] = b'foo'
  1194. self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
  1195. b[:3] = memoryview(b'foo')
  1196. self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
  1197. b[3:4] = []
  1198. self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
  1199. for elem in [5, -5, 0, int(10e20), 'str', 2.3,
  1200. ['a', 'b'], [b'a', b'b'], [[]]]:
  1201. with self.assertRaises(TypeError):
  1202. b[3:4] = elem
  1203. for elem in [[254, 255, 256], [-256, 9000]]:
  1204. with self.assertRaises(ValueError):
  1205. b[3:4] = elem
  1206. def test_setslice_extend(self):
  1207. # Exercise the resizing logic (see issue #19087)
  1208. b = bytearray(range(100))
  1209. self.assertEqual(list(b), list(range(100)))
  1210. del b[:10]
  1211. self.assertEqual(list(b), list(range(10, 100)))
  1212. b.extend(range(100, 110))
  1213. self.assertEqual(list(b), list(range(10, 110)))
  1214. def test_fifo_overrun(self):
  1215. # Test for issue #23985, a buffer overrun when implementing a FIFO
  1216. # Build Python in pydebug mode for best results.
  1217. b = bytearray(10)
  1218. b.pop() # Defeat expanding buffer off-by-one quirk
  1219. del b[:1] # Advance start pointer without reallocating
  1220. b += bytes(2) # Append exactly the number of deleted bytes
  1221. del b # Free memory buffer, allowing pydebug verification
  1222. def test_del_expand(self):
  1223. # Reducing the size should not expand the buffer (issue #23985)
  1224. b = bytearray(10)
  1225. size = sys.getsizeof(b)
  1226. del b[:1]
  1227. self.assertLessEqual(sys.getsizeof(b), size)
  1228. def test_extended_set_del_slice(self):
  1229. indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize,
  1230. -1, -2, -31, -300)
  1231. for start in indices:
  1232. for stop in indices:
  1233. # Skip invalid step 0
  1234. for step in indices[1:]:
  1235. L = list(range(255))
  1236. b = bytearray(L)
  1237. # Make sure we have a slice of exactly the right length,
  1238. # but with different data.
  1239. data = L[start:stop:step]
  1240. data.reverse()
  1241. L[start:stop:step] = data
  1242. b[start:stop:step] = data
  1243. self.assertEqual(b, bytearray(L))
  1244. del L[start:stop:step]
  1245. del b[start:stop:step]
  1246. self.assertEqual(b, bytearray(L))
  1247. def test_setslice_trap(self):
  1248. # This test verifies that we correctly handle assigning self
  1249. # to a slice of self (the old Lambert Meertens trap).
  1250. b = bytearray(range(256))
  1251. b[8:] = b
  1252. self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
  1253. def test_iconcat(self):
  1254. b = bytearray(b"abc")
  1255. b1 = b
  1256. b += b"def"
  1257. self.assertEqual(b, b"abcdef")
  1258. self.assertEqual(b, b1)
  1259. self.assertIs(b, b1)
  1260. b += b"xyz"
  1261. self.assertEqual(b, b"abcdefxyz")
  1262. try:
  1263. b += ""
  1264. except TypeError:
  1265. pass
  1266. else:
  1267. self.fail("bytes += unicode didn't raise TypeError")
  1268. def test_irepeat(self):
  1269. b = bytearray(b"abc")
  1270. b1 = b
  1271. b *= 3
  1272. self.assertEqual(b, b"abcabcabc")
  1273. self.assertEqual(b, b1)
  1274. self.assertIs(b, b1)
  1275. def test_irepeat_1char(self):
  1276. b = bytearray(b"x")
  1277. b1 = b
  1278. b *= 100
  1279. self.assertEqual(b, b"x"*100)
  1280. self.assertEqual(b, b1)
  1281. self.assertIs(b, b1)
  1282. def test_alloc(self):
  1283. b = bytearray()
  1284. alloc = b.__alloc__()
  1285. self.assertGreaterEqual(alloc, 0)
  1286. seq = [alloc]
  1287. for i in range(100):
  1288. b += b"x"
  1289. alloc = b.__alloc__()
  1290. self.assertGreater(alloc, len(b)) # including trailing null byte
  1291. if alloc not in seq:
  1292. seq.append(alloc)
  1293. def test_init_alloc(self):
  1294. b = bytearray()
  1295. def g():
  1296. for i in range(1, 100):
  1297. yield i
  1298. a = list(b)
  1299. self.assertEqual(a, list(range(1, len(a)+1)))
  1300. self.assertEqual(len(b), len(a))
  1301. self.assertLessEqual(len(b), i)
  1302. alloc = b.__alloc__()
  1303. self.assertGreater(alloc, len(b)) # including trailing null byte
  1304. b.__init__(g())
  1305. self.assertEqual(list(b), list(range(1, 100)))
  1306. self.assertEqual(len(b), 99)
  1307. alloc = b.__alloc__()
  1308. self.assertGreater(alloc, len(b))
  1309. def test_extend(self):
  1310. orig = b'hello'
  1311. a = bytearray(orig)
  1312. a.extend(a)
  1313. self.assertEqual(a, orig + orig)
  1314. self.assertEqual(a[5:], orig)
  1315. a = bytearray(b'')
  1316. # Test iterators that don't have a __length_hint__
  1317. a.extend(map(int, orig * 25))
  1318. a.extend(int(x) for x in orig * 25)
  1319. self.assertEqual(a, orig * 50)
  1320. self.assertEqual(a[-5:], orig)
  1321. a = bytearray(b'')
  1322. a.extend(iter(map(int, orig * 50)))
  1323. self.assertEqual(a, orig * 50)
  1324. self.assertEqual(a[-5:], orig)
  1325. a = bytearray(b'')
  1326. a.extend(list(map(int, orig * 50)))
  1327. self.assertEqual(a, orig * 50)
  1328. self.assertEqual(a[-5:], orig)
  1329. a = bytearray(b'')
  1330. self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
  1331. self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
  1332. self.assertEqual(len(a), 0)
  1333. a = bytearray(b'')
  1334. a.extend([Indexable(ord('a'))])
  1335. self.assertEqual(a, b'a')
  1336. def test_remove(self):
  1337. b = bytearray(b'hello')
  1338. b.remove(ord('l'))
  1339. self.assertEqual(b, b'helo')
  1340. b.remove(ord('l'))
  1341. self.assertEqual(b, b'heo')
  1342. self.assertRaises(ValueError, lambda: b.remove(ord('l')))
  1343. self.assertRaises(ValueError, lambda: b.remove(400))
  1344. self.assertRaises(TypeError, lambda: b.remove('e'))
  1345. # remove first and last
  1346. b.remove(ord('o'))
  1347. b.remove(ord('h'))
  1348. self.assertEqual(b, b'e')
  1349. self.assertRaises(TypeError, lambda: b.remove(b'e'))
  1350. b.remove(Indexable(ord('e')))
  1351. self.assertEqual(b, b'')
  1352. # test values outside of the ascii range: (0, 127)
  1353. c = bytearray([126, 127, 128, 129])
  1354. c.remove(127)
  1355. self.assertEqual(c, bytes([126, 128, 129]))
  1356. c.remove(129)
  1357. self.assertEqual(c, bytes([126, 128]))
  1358. def test_pop(self):
  1359. b = bytearray(b'world')
  1360. self.assertEqual(b.pop(), ord('d'))
  1361. self.assertEqual(b.pop(0), ord('w'))
  1362. self.assertEqual(b.pop(-2), ord('r'))
  1363. self.assertRaises(IndexError, lambda: b.pop(10))
  1364. self.assertRaises(IndexError, lambda: bytearray().pop())
  1365. # test for issue #6846
  1366. self.assertEqual(bytearray(b'\xff').pop(), 0xff)
  1367. def test_nosort(self):
  1368. self.assertRaises(AttributeError, lambda: bytearray().sort())
  1369. def test_append(self):
  1370. b = bytearray(b'hell')
  1371. b.append(ord('o'))
  1372. self.assertEqual(b, b'hello')
  1373. self.assertEqual(b.append(100), None)
  1374. b = bytearray()
  1375. b.append(ord('A'))
  1376. self.assertEqual(len(b), 1)
  1377. self.assertRaises(TypeError, lambda: b.append(b'o'))
  1378. b = bytearray()
  1379. b.append(Indexable(ord('A')))
  1380. self.assertEqual(b, b'A')
  1381. def test_insert(self):
  1382. b = bytearray(b'msssspp')
  1383. b.insert(1, ord('i'))
  1384. b.insert(4, ord('i'))
  1385. b.insert(-2, ord('i'))
  1386. b.insert(1000, ord('i'))
  1387. self.assertEqual(b, b'mississippi')
  1388. self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
  1389. b = bytearray()
  1390. b.insert(0, Indexable(ord('A')))
  1391. self.assertEqual(b, b'A')
  1392. def test_copied(self):
  1393. # Issue 4348. Make sure that operations that don't mutate the array
  1394. # copy the bytes.
  1395. b = bytearray(b'abc')
  1396. self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
  1397. t = bytearray([i for i in range(256)])
  1398. x = bytearray(b'')
  1399. self.assertIsNot(x, x.translate(t))
  1400. def test_partition_bytearray_doesnt_share_nullstring(self):
  1401. a, b, c = bytearray(b"x").partition(b"y")
  1402. self.assertEqual(b, b"")
  1403. self.assertEqual(c, b"")
  1404. self.assertIsNot(b, c)
  1405. b += b"!"
  1406. self.assertEqual(c, b"")
  1407. a, b, c = bytearray(b"x").partition(b"y")
  1408. self.assertEqual(b, b"")
  1409. self.assertEqual(c, b"")
  1410. # Same for rpartition
  1411. b, c, a = bytearray(b"x").rpartition(b"y")
  1412. self.assertEqual(b, b"")
  1413. self.assertEqual(c, b"")
  1414. self.assertIsNot(b, c)
  1415. b += b"!"
  1416. self.assertEqual(c, b"")
  1417. c, b, a = bytearray(b"x").rpartition(b"y")
  1418. self.assertEqual(b, b"")
  1419. self.assertEqual(c, b"")
  1420. def test_resize_forbidden(self):
  1421. # #4509: can't resize a bytearray when there are buffer exports, even
  1422. # if it wouldn't reallocate the underlying buffer.
  1423. # Furthermore, no destructive changes to the buffer may be applied
  1424. # before raising the error.
  1425. b = bytearray(range(10))
  1426. v = memoryview(b)
  1427. def resize(n):
  1428. b[1:-1] = range(n + 1, 2*n - 1)
  1429. resize(10)
  1430. orig = b[:]
  1431. self.assertRaises(BufferError, resize, 11)
  1432. self.assertEqual(b, orig)
  1433. self.assertRaises(BufferError, resize, 9)
  1434. self.assertEqual(b, orig)
  1435. self.assertRaises(BufferError, resize, 0)
  1436. self.assertEqual(b, orig)
  1437. # Other operations implying resize
  1438. self.assertRaises(BufferError, b.pop, 0)
  1439. self.assertEqual(b, orig)
  1440. self.assertRaises(BufferError, b.remove, b[1])
  1441. self.assertEqual(b, orig)
  1442. def delitem():
  1443. del b[1]
  1444. self.assertRaises(BufferError, delitem)
  1445. self.assertEqual(b, orig)
  1446. # deleting a non-contiguous slice
  1447. def delslice():
  1448. b[1:-1:2] = b""
  1449. self.assertRaises(BufferError, delslice)
  1450. self.assertEqual(b, orig)
  1451. @test.support.cpython_only
  1452. def test_obsolete_write_lock(self):
  1453. _testcapi = import_helper.import_module('_testcapi')
  1454. self.assertRaises(BufferError, _testcapi.getbuffer_with_null_view, bytearray())
  1455. def test_iterator_pickling2(self):
  1456. orig = bytearray(b'abc')
  1457. data = list(b'qwerty')
  1458. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  1459. # initial iterator
  1460. itorig = iter(orig)
  1461. d = pickle.dumps((itorig, orig), proto)
  1462. it, b = pickle.loads(d)
  1463. b[:] = data
  1464. self.assertEqual(type(it), type(itorig))
  1465. self.assertEqual(list(it), data)
  1466. # running iterator
  1467. next(itorig)
  1468. d = pickle.dumps((itorig, orig), proto)
  1469. it, b = pickle.loads(d)
  1470. b[:] = data
  1471. self.assertEqual(type(it), type(itorig))
  1472. self.assertEqual(list(it), data[1:])
  1473. # empty iterator
  1474. for i in range(1, len(orig)):
  1475. next(itorig)
  1476. d = pickle.dumps((itorig, orig), proto)
  1477. it, b = pickle.loads(d)
  1478. b[:] = data
  1479. self.assertEqual(type(it), type(itorig))
  1480. self.assertEqual(list(it), data[len(orig):])
  1481. # exhausted iterator
  1482. self.assertRaises(StopIteration, next, itorig)
  1483. d = pickle.dumps((itorig, orig), proto)
  1484. it, b = pickle.loads(d)
  1485. b[:] = data
  1486. self.assertEqual(list(it), [])
  1487. test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
  1488. def test_iterator_length_hint(self):
  1489. # Issue 27443: __length_hint__ can return negative integer
  1490. ba = bytearray(b'ab')
  1491. it = iter(ba)
  1492. next(it)
  1493. ba.clear()
  1494. # Shouldn't raise an error
  1495. self.assertEqual(list(it), [])
  1496. def test_repeat_after_setslice(self):
  1497. # bpo-42924: * used to copy from the wrong memory location
  1498. b = bytearray(b'abc')
  1499. b[:2] = b'x'
  1500. b1 = b * 1
  1501. b3 = b * 3
  1502. self.assertEqual(b1, b'xc')
  1503. self.assertEqual(b1, b)
  1504. self.assertEqual(b3, b'xcxcxc')
  1505. def test_mutating_index(self):
  1506. class Boom:
  1507. def __index__(self):
  1508. b.clear()
  1509. return 0
  1510. with self.subTest("tp_as_mapping"):
  1511. b = bytearray(b'Now you see me...')
  1512. with self.assertRaises(IndexError):
  1513. b[0] = Boom()
  1514. with self.subTest("tp_as_sequence"):
  1515. _testcapi = import_helper.import_module('_testcapi')
  1516. b = bytearray(b'Now you see me...')
  1517. with self.assertRaises(IndexError):
  1518. _testcapi.sequence_setitem(b, 0, Boom())
  1519. class AssortedBytesTest(unittest.TestCase):
  1520. #
  1521. # Test various combinations of bytes and bytearray
  1522. #
  1523. @check_bytes_warnings
  1524. def test_repr_str(self):
  1525. for f in str, repr:
  1526. self.assertEqual(f(bytearray()), "bytearray(b'')")
  1527. self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
  1528. self.assertEqual(f(bytearray([0, 1, 254, 255])),
  1529. "bytearray(b'\\x00\\x01\\xfe\\xff')")
  1530. self.assertEqual(f(b"abc"), "b'abc'")
  1531. self.assertEqual(f(b"'"), '''b"'"''') # '''
  1532. self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
  1533. @check_bytes_warnings
  1534. def test_format(self):
  1535. for b in b'abc', bytearray(b'abc'):
  1536. self.assertEqual(format(b), str(b))
  1537. self.assertEqual(format(b, ''), str(b))
  1538. with self.assertRaisesRegex(TypeError,
  1539. r'\b%s\b' % re.escape(type(b).__name__)):
  1540. format(b, 's')
  1541. def test_compare_bytes_to_bytearray(self):
  1542. self.assertEqual(b"abc" == bytes(b"abc"), True)
  1543. self.assertEqual(b"ab" != bytes(b"abc"), True)
  1544. self.assertEqual(b"ab" <= bytes(b"abc"), True)
  1545. self.assertEqual(b"ab" < bytes(b"abc"), True)
  1546. self.assertEqual(b"abc" >= bytes(b"ab"), True)
  1547. self.assertEqual(b"abc" > bytes(b"ab"), True)
  1548. self.assertEqual(b"abc" != bytes(b"abc"), False)
  1549. self.assertEqual(b"ab" == bytes(b"abc"), False)
  1550. self.assertEqual(b"ab" > bytes(b"abc"), False)
  1551. self.assertEqual(b"ab" >= bytes(b"abc"), False)
  1552. self.assertEqual(b"abc" < bytes(b"ab"), False)
  1553. self.assertEqual(b"abc" <= bytes(b"ab"), False)
  1554. self.assertEqual(bytes(b"abc") == b"abc", True)
  1555. self.assertEqual(bytes(b"ab") != b"abc", True)
  1556. self.assertEqual(bytes(b"ab") <= b"abc", True)
  1557. self.assertEqual(bytes(b"ab") < b"abc", True)
  1558. self.assertEqual(bytes(b"abc") >= b"ab", True)
  1559. self.assertEqual(bytes(b"abc") > b"ab", True)
  1560. self.assertEqual(bytes(b"abc") != b"abc", False)
  1561. self.assertEqual(bytes(b"ab") == b"abc", False)
  1562. self.assertEqual(bytes(b"ab") > b"abc", False)
  1563. self.assertEqual(bytes(b"ab") >= b"abc", False)
  1564. self.assertEqual(bytes(b"abc") < b"ab", False)
  1565. self.assertEqual(bytes(b"abc") <= b"ab", False)
  1566. @test.support.requires_docstrings
  1567. def test_doc(self):
  1568. self.assertIsNotNone(bytearray.__doc__)
  1569. self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
  1570. self.assertIsNotNone(bytes.__doc__)
  1571. self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
  1572. def test_from_bytearray(self):
  1573. sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
  1574. buf = memoryview(sample)
  1575. b = bytearray(buf)
  1576. self.assertEqual(b, bytearray(sample))
  1577. @check_bytes_warnings
  1578. def test_to_str(self):
  1579. self.assertEqual(str(b''), "b''")
  1580. self.assertEqual(str(b'x'), "b'x'")
  1581. self.assertEqual(str(b'\x80'), "b'\\x80'")
  1582. self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
  1583. self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
  1584. self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
  1585. def test_literal(self):
  1586. tests = [
  1587. (b"Wonderful spam", "Wonderful spam"),
  1588. (br"Wonderful spam too", "Wonderful spam too"),
  1589. (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
  1590. (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
  1591. ]
  1592. for b, s in tests:
  1593. self.assertEqual(b, bytearray(s, 'latin-1'))
  1594. for c in range(128, 256):
  1595. self.assertRaises(SyntaxError, eval,
  1596. 'b"%s"' % chr(c))
  1597. def test_split_bytearray(self):
  1598. self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
  1599. def test_rsplit_bytearray(self):
  1600. self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
  1601. def test_return_self(self):
  1602. # bytearray.replace must always return a new bytearray
  1603. b = bytearray()
  1604. self.assertIsNot(b.replace(b'', b''), b)
  1605. @unittest.skipUnless(sys.flags.bytes_warning,
  1606. "BytesWarning is needed for this test: use -bb option")
  1607. def test_compare(self):
  1608. def bytes_warning():
  1609. return warnings_helper.check_warnings(('', BytesWarning))
  1610. with bytes_warning():
  1611. b'' == ''
  1612. with bytes_warning():
  1613. '' == b''
  1614. with bytes_warning():
  1615. b'' != ''
  1616. with bytes_warning():
  1617. '' != b''
  1618. with bytes_warning():
  1619. bytearray(b'') == ''
  1620. with bytes_warning():
  1621. '' == bytearray(b'')
  1622. with bytes_warning():
  1623. bytearray(b'') != ''
  1624. with bytes_warning():
  1625. '' != bytearray(b'')
  1626. with bytes_warning():
  1627. b'\0' == 0
  1628. with bytes_warning():
  1629. 0 == b'\0'
  1630. with bytes_warning():
  1631. b'\0' != 0
  1632. with bytes_warning():
  1633. 0 != b'\0'
  1634. # Optimizations:
  1635. # __iter__? (optimization)
  1636. # __reversed__? (optimization)
  1637. # XXX More string methods? (Those that don't use character properties)
  1638. # There are tests in string_tests.py that are more
  1639. # comprehensive for things like partition, etc.
  1640. # Unfortunately they are all bundled with tests that
  1641. # are not appropriate for bytes
  1642. # I've started porting some of those into bytearray_tests.py, we should port
  1643. # the rest that make sense (the code can be cleaned up to use modern
  1644. # unittest methods at the same time).
  1645. class BytearrayPEP3137Test(unittest.TestCase):
  1646. def marshal(self, x):
  1647. return bytearray(x)
  1648. def test_returns_new_copy(self):
  1649. val = self.marshal(b'1234')
  1650. # On immutable types these MAY return a reference to themselves
  1651. # but on mutable types like bytearray they MUST return a new copy.
  1652. for methname in ('zfill', 'rjust', 'ljust', 'center'):
  1653. method = getattr(val, methname)
  1654. newval = method(3)
  1655. self.assertEqual(val, newval)
  1656. self.assertIsNot(val, newval,
  1657. methname+' returned self on a mutable object')
  1658. for expr in ('val.split()[0]', 'val.rsplit()[0]',
  1659. 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
  1660. 'val.splitlines()[0]', 'val.replace(b"", b"")'):
  1661. newval = eval(expr)
  1662. self.assertEqual(val, newval)
  1663. self.assertIsNot(val, newval,
  1664. expr+' returned val on a mutable object')
  1665. sep = self.marshal(b'')
  1666. newval = sep.join([val])
  1667. self.assertEqual(val, newval)
  1668. self.assertIsNot(val, newval)
  1669. class FixedStringTest(test.string_tests.BaseTest):
  1670. def fixtype(self, obj):
  1671. if isinstance(obj, str):
  1672. return self.type2test(obj.encode("utf-8"))
  1673. return super().fixtype(obj)
  1674. contains_bytes = True
  1675. class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
  1676. type2test = bytearray
  1677. class BytesAsStringTest(FixedStringTest, unittest.TestCase):
  1678. type2test = bytes
  1679. class SubclassTest:
  1680. def test_basic(self):
  1681. self.assertTrue(issubclass(self.type2test, self.basetype))
  1682. self.assertIsInstance(self.type2test(), self.basetype)
  1683. a, b = b"abcd", b"efgh"
  1684. _a, _b = self.type2test(a), self.type2test(b)
  1685. # test comparison operators with subclass instances
  1686. self.assertTrue(_a == _a)
  1687. self.assertTrue(_a != _b)
  1688. self.assertTrue(_a < _b)
  1689. self.assertTrue(_a <= _b)
  1690. self.assertTrue(_b >= _a)
  1691. self.assertTrue(_b > _a)
  1692. self.assertIsNot(_a, a)
  1693. # test concat of subclass instances
  1694. self.assertEqual(a + b, _a + _b)
  1695. self.assertEqual(a + b, a + _b)
  1696. self.assertEqual(a + b, _a + b)
  1697. # test repeat
  1698. self.assertTrue(a*5 == _a*5)
  1699. def test_join(self):
  1700. # Make sure join returns a NEW object for single item sequences
  1701. # involving a subclass.
  1702. # Make sure that it is of the appropriate type.
  1703. s1 = self.type2test(b"abcd")
  1704. s2 = self.basetype().join([s1])
  1705. self.assertIsNot(s1, s2)
  1706. self.assertIs(type(s2), self.basetype, type(s2))
  1707. # Test reverse, calling join on subclass
  1708. s3 = s1.join([b"abcd"])
  1709. self.assertIs(type(s3), self.basetype)
  1710. def test_pickle(self):
  1711. a = self.type2test(b"abcd")
  1712. a.x = 10
  1713. a.z = self.type2test(b"efgh")
  1714. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  1715. b = pickle.loads(pickle.dumps(a, proto))
  1716. self.assertNotEqual(id(a), id(b))
  1717. self.assertEqual(a, b)
  1718. self.assertEqual(a.x, b.x)
  1719. self.assertEqual(a.z, b.z)
  1720. self.assertEqual(type(a), type(b))
  1721. self.assertEqual(type(a.z), type(b.z))
  1722. self.assertFalse(hasattr(b, 'y'))
  1723. def test_copy(self):
  1724. a = self.type2test(b"abcd")
  1725. a.x = 10
  1726. a.z = self.type2test(b"efgh")
  1727. for copy_method in (copy.copy, copy.deepcopy):
  1728. b = copy_method(a)
  1729. self.assertNotEqual(id(a), id(b))
  1730. self.assertEqual(a, b)
  1731. self.assertEqual(a.x, b.x)
  1732. self.assertEqual(a.z, b.z)
  1733. self.assertEqual(type(a), type(b))
  1734. self.assertEqual(type(a.z), type(b.z))
  1735. self.assertFalse(hasattr(b, 'y'))
  1736. def test_fromhex(self):
  1737. b = self.type2test.fromhex('1a2B30')
  1738. self.assertEqual(b, b'\x1a\x2b\x30')
  1739. self.assertIs(type(b), self.type2test)
  1740. class B1(self.basetype):
  1741. def __new__(cls, value):
  1742. me = self.basetype.__new__(cls, value)
  1743. me.foo = 'bar'
  1744. return me
  1745. b = B1.fromhex('1a2B30')
  1746. self.assertEqual(b, b'\x1a\x2b\x30')
  1747. self.assertIs(type(b), B1)
  1748. self.assertEqual(b.foo, 'bar')
  1749. class B2(self.basetype):
  1750. def __init__(me, *args, **kwargs):
  1751. if self.basetype is not bytes:
  1752. self.basetype.__init__(me, *args, **kwargs)
  1753. me.foo = 'bar'
  1754. b = B2.fromhex('1a2B30')
  1755. self.assertEqual(b, b'\x1a\x2b\x30')
  1756. self.assertIs(type(b), B2)
  1757. self.assertEqual(b.foo, 'bar')
  1758. class ByteArraySubclass(bytearray):
  1759. pass
  1760. class ByteArraySubclassWithSlots(bytearray):
  1761. __slots__ = ('x', 'y', '__dict__')
  1762. class BytesSubclass(bytes):
  1763. pass
  1764. class OtherBytesSubclass(bytes):
  1765. pass
  1766. class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
  1767. basetype = bytearray
  1768. type2test = ByteArraySubclass
  1769. def test_init_override(self):
  1770. class subclass(bytearray):
  1771. def __init__(me, newarg=1, *args, **kwargs):
  1772. bytearray.__init__(me, *args, **kwargs)
  1773. x = subclass(4, b"abcd")
  1774. x = subclass(4, source=b"abcd")
  1775. self.assertEqual(x, b"abcd")
  1776. x = subclass(newarg=4, source=b"abcd")
  1777. self.assertEqual(x, b"abcd")
  1778. class ByteArraySubclassWithSlotsTest(SubclassTest, unittest.TestCase):
  1779. basetype = bytearray
  1780. type2test = ByteArraySubclassWithSlots
  1781. class BytesSubclassTest(SubclassTest, unittest.TestCase):
  1782. basetype = bytes
  1783. type2test = BytesSubclass
  1784. if __name__ == "__main__":
  1785. unittest.main()