-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathtest_message.py
122 lines (94 loc) · 4.31 KB
/
test_message.py
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
from blockchain import Message, InvalidMessage
import unittest
import hashlib
import time
class TestMessage(unittest.TestCase):
def payload_hash(self, msg):
return hashlib.sha256(bytearray(str(msg.timestamp) + str(msg.data) + str(msg.sender) + str(msg.receiver), "utf-8")).hexdigest()
def message_hash(self, msg):
return hashlib.sha256(bytearray(str(msg.prev_hash) + msg.payload_hash, "utf-8")).hexdigest()
def test_data_message_hashes_only_payload_on_create(self):
data = "some data"
msg = Message(data)
self.assertEqual(msg.data, data)
self.assertIsNone(msg.sender)
self.assertIsNone(msg.receiver)
self.assertIsNotNone(msg.timestamp)
self.assertEqual(self.payload_hash(msg), msg.payload_hash)
self.assertIsNone(msg.hash)
def test_full_message_hashes_only_payload_on_create(self):
data = "some data"
alice = "Alice"
bob = "Bob"
msg = Message(data, alice, bob)
self.assertEqual(msg.data, data)
self.assertEqual(msg.sender, alice)
self.assertEqual(msg.receiver, bob)
self.assertIsNotNone(msg.timestamp)
self.assertEqual(self.payload_hash(msg), msg.payload_hash)
self.assertIsNone(msg.hash)
def test_tampering_invalidates_payload_hash(self):
msg = Message("some data", "Alice", "Bob")
msg.receiver = "Eve"
self.assertNotEqual(self.payload_hash(msg), msg.payload_hash)
def test_linking_populates_prev_hash_correctly(self):
msg1 = Message("some data")
msg2 = Message("some more data")
msg2.link(msg1)
self.assertEqual(msg2.prev_hash, msg1.hash)
self.assertIsNone(msg2.hash)
def test_sealing_unlinked_message_sets_message_hash_correctly(self):
msg = Message("some data")
self.assertIsNone(msg.hash)
msg.seal()
self.assertEqual(self.message_hash(msg), msg.hash)
def test_sealing_linked_message_sets_message_hash_correctly(self):
msg1 = Message("some data")
msg1.seal()
msg2 = Message("some more data")
msg2.link(msg1)
msg2.seal()
self.assertNotEqual(msg1.hash, msg2.hash)
self.assertEqual(self.message_hash(msg2), msg2.hash)
def test_fluent(self):
msg1 = Message("first message").seal()
msg2 = Message("second message").link(msg1).seal()
self.assertEqual("first message", msg1.data)
self.assertEqual("second message", msg2.data)
self.assertEqual(msg2.prev_hash, msg1.hash)
def test_good_unlinked_message_validates(self):
msg = Message("some data", "Alice", "Bob").seal()
msg.validate() # no exceptions raised
# sanity check the hashes
self.assertEqual(self.payload_hash(msg), msg.payload_hash)
self.assertEqual(self.message_hash(msg), msg.hash)
def test_good_linked_message_validates(self):
msg1 = Message("first").seal()
msg2 = Message("second").link(msg1).seal()
msg2.validate() # no exceptions raised
# sanity check the hashes
self.assertEqual(self.payload_hash(msg2), msg2.payload_hash)
self.assertEqual(self.message_hash(msg2), msg2.hash)
def test_tampering_invalidates_hashes(self):
msg = Message("some data")
msg.data = "more data"
self.assertNotEqual(self.payload_hash(msg), msg.payload_hash)
self.assertNotEqual(self.message_hash(msg), msg.hash)
msg = Message("some data", "Alice", "Bob")
msg.receiver = "Eve"
self.assertNotEqual(self.payload_hash(msg), msg.payload_hash)
self.assertNotEqual(self.message_hash(msg), msg.hash)
msg = Message("some data", "Alice", "Bob")
msg.sender = "Charlie"
self.assertNotEqual(self.payload_hash(msg), msg.payload_hash)
self.assertNotEqual(self.message_hash(msg), msg.hash)
msg = Message("some data")
msg.timestamp = time.time() + 100 # force different time
self.assertNotEqual(self.payload_hash(msg), msg.payload_hash)
self.assertNotEqual(self.message_hash(msg), msg.hash)
def test_message_tampering_implies_validation_exception(self):
msg = Message("first").seal()
msg.data = "changed"
self.assertRaises(InvalidMessage, msg.validate)
if __name__ == '__main__':
unittest.main()