File: test_rmd5.py

package info (click to toggle)
pypy 5.6.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 97,040 kB
  • ctags: 185,069
  • sloc: python: 1,147,862; ansic: 49,642; cpp: 5,245; asm: 5,169; makefile: 529; sh: 481; xml: 232; lisp: 45
file content (152 lines) | stat: -rw-r--r-- 3,923 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import md5    # for comparison
from rpython.rlib import rmd5


def test_digest_size():
    assert rmd5.digest_size == 16


def test_cases():
    """
    Feed example strings into a md5 object and check the digest and
    hexdigest.
    """
    cases = (
      ("",
       "d41d8cd98f00b204e9800998ecf8427e"),
      ("a",
       "0cc175b9c0f1b6a831c399e269772661"),
      ("abc",
       "900150983cd24fb0d6963f7d28e17f72"),
      ("message digest",
       "f96b697d7cb7938d525a2f31aaf161d0"),
      ("abcdefghijklmnopqrstuvwxyz",
       "c3fcd3d76192e4007dfb496cca67e13b"),
      ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
       "d174ab98d277d9f5a5611c2c9f419d9f"),
      ("1234567890"*8,
       "57edf4a22be3c955ac49da2e2107b67a"),
    )
    for input, expected in cases:
        d = rmd5.RMD5()
        d.update(input)
        assert d.hexdigest() == expected
        assert d.digest() == expected.decode('hex')


def test_more():
    "Test cases without known digest result."

    cases = (
      "123",
      "1234",
      "12345",
      "123456",
      "1234567",
      "12345678",
      "123456789 123456789 123456789 ",
      "123456789 123456789 ",
      "123456789 123456789 1",
      "123456789 123456789 12",
      "123456789 123456789 123",
      "123456789 123456789 1234",
      "123456789 123456789 123456789 1",
      "123456789 123456789 123456789 12",
      "123456789 123456789 123456789 123",
      "123456789 123456789 123456789 1234",
      "123456789 123456789 123456789 12345",
      "123456789 123456789 123456789 123456",
      "123456789 123456789 123456789 1234567",
      "123456789 123456789 123456789 12345678",
     )

    for input in cases:
        d = rmd5.RMD5(input)
        assert d.hexdigest() == md5.md5(input).hexdigest()
        assert d.digest() == md5.md5(input).digest()


def test_long():
    "Test cases with long messages (can take a while)."

    cases = (
      2**10*'a',
      2**10*'abcd',
      ##2**20*'a',  ## 1 MB, takes about 160 sec. on a 233 Mhz Pentium.
     )

    for input in cases:
        d = rmd5.RMD5(input)
        assert d.hexdigest() == md5.md5(input).hexdigest()
        assert d.digest() == md5.md5(input).digest()


def test_updating_many_times():
    "Test with an increasingly growing message."

    d1 = rmd5.RMD5()
    d2 = md5.md5()
    for i in range(300):
        d1.update(chr(i & 0xFF))
        d2.update(chr(i & 0xFF))
        assert d1.digest() == d2.digest()


def test_copy():
    "Test updating cloned objects."

    cases = (
      "123",
      "1234",
      "12345",
      "123456",
      "1234567",
      "12345678",
      "123456789 123456789 123456789 ",
      "123456789 123456789 ",
      "123456789 123456789 1",
      "123456789 123456789 12",
      "123456789 123456789 123",
      "123456789 123456789 1234",
      "123456789 123456789 123456789 1",
      "123456789 123456789 123456789 12",
      "123456789 123456789 123456789 123",
      "123456789 123456789 123456789 1234",
      "123456789 123456789 123456789 12345",
      "123456789 123456789 123456789 123456",
      "123456789 123456789 123456789 1234567",
      "123456789 123456789 123456789 12345678",
     )

    # Load both with same prefix.    
    prefix1 = 2**10 * 'a'

    m1 = md5.md5()
    m1.update(prefix1)

    m2 = rmd5.RMD5()
    m2.update(prefix1)

    # Update and compare...
    for message in cases:
        m1c = m1.copy()
        m1c.update(message)
        d1 = m1c.hexdigest()

        m2c = m2.copy()
        m2c.update(message)
        d2 = m2c.hexdigest()

        assert d1 == d2

def test_random():
    import random, md5
    for i in range(20):
        input = ''.join([chr(random.randrange(256))
                         for i in range(random.randrange(1000))])
        m1 = rmd5.RMD5()
        m1.update(input)
        m2 = md5.new()
        m2.update(input)
        assert m2.hexdigest() == m1.hexdigest()