| 226 | test("response_code", 0, 0b1111) |
| 227 | |
| 228 | def test_packing(self): |
| 229 | def assert_eq(m: dns.DNSMessage, b: bytes) -> None: |
| 230 | m_b = dns.DNSMessage.unpack(b, m.timestamp) |
| 231 | assert m_b == m |
| 232 | assert m_b.packed == m.packed |
| 233 | |
| 234 | assert_eq( |
| 235 | tutils.tdnsreq(), |
| 236 | b"\x00\x2a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x06google\x00\x00\x01\x00\x01", |
| 237 | ) |
| 238 | with pytest.raises(struct.error): |
| 239 | dns.DNSMessage.unpack( |
| 240 | b"\x00\x2a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x06google\x00\x00\x01\x00\x01\x00" |
| 241 | ) |
| 242 | assert_eq( |
| 243 | tutils.tdnsresp(), |
| 244 | ( |
| 245 | b"\x00\x2a\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00\x03dns\x06google\x00\x00\x01\x00\x01" |
| 246 | b"\xc0\x0c\x00\x01\x00\x01\x00\x00\x00 \x00\x04\x08\x08\x08\x08\xc0\x0c\x00\x01\x00\x01" |
| 247 | b"\x00\x00\x00 \x00\x04\x08\x08\x04\x04" |
| 248 | ), |
| 249 | ) |
| 250 | with pytest.raises(struct.error): # question error |
| 251 | dns.DNSMessage.unpack( |
| 252 | b"\x00\x2a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x06goo" |
| 253 | ) |
| 254 | with pytest.raises(struct.error): # rr length error |
| 255 | dns.DNSMessage.unpack( |
| 256 | b"\x00\x2a\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00\x03dns\x06google\x00\x00\x01\x00\x01" |
| 257 | + b"\xc0\x0c\x00\x01\x00\x01\x00\x00\x00 \x00\x04\x08\x08\x08\x08\xc0\x0c\x00\x01\x00\x01\x00\x00\x00 \x00\x04\x08\x08\x04" |
| 258 | ) |
| 259 | txt = dns.DNSMessage.unpack( |
| 260 | b"V\x1a\x81\x80\x00\x01\x00\x01\x00\x01\x00\x01\x05alive\x06github\x03com\x00\x00" |
| 261 | + b"\x10\x00\x01\xc0\x0c\x00\x05\x00\x01\x00\x00\x0b\xc6\x00\x07\x04live\xc0\x12\xc0\x12\x00\x06\x00\x01" |
| 262 | + b"\x00\x00\x03\x84\x00H\x07ns-1707\tawsdns-21\x02co\x02uk\x00\x11awsdns-hostmaster\x06amazon\xc0\x19\x00" |
| 263 | + b"\x00\x00\x01\x00\x00\x1c \x00\x00\x03\x84\x00\x12u\x00\x00\x01Q\x80\x00\x00)\x02\x00\x00\x00\x00\x00\x00\x00" |
| 264 | ) |
| 265 | assert txt.answers[0].domain_name == "live.github.com" |
| 266 | invalid_rr_domain_name = dns.DNSMessage.unpack( |
| 267 | b"V\x1a\x81\x80\x00\x01\x00\x01\x00\x01\x00\x01\x05alive\x06github\x03com\x00\x00" |
| 268 | + b"\x10\x00\x01\xc0\x0c\x00\x05\x00\x01\x00\x00\x0b\xc6\x00\x07\x99live\xc0\x12\xc0\x12\x00\x06\x00\x01" |
| 269 | + b"\x00\x00\x03\x84\x00H\x07ns-1707\tawsdns-21\x02co\x02uk\x00\x11awsdns-hostmaster\x06amazon\xc0\x19\x00" |
| 270 | + b"\x00\x00\x01\x00\x00\x1c \x00\x00\x03\x84\x00\x12u\x00\x00\x01Q\x80\x00\x00)\x02\x00\x00\x00\x00\x00\x00\x00" |
| 271 | ) |
| 272 | assert ( |
| 273 | invalid_rr_domain_name.answers[0].data == b"\x99live\x06github\x03com\x00" |
| 274 | ) |
| 275 | valid_compressed_rr_data = dns.DNSMessage.unpack( |
| 276 | b"\x10}\x81\x80\x00\x01\x00\x01\x00\x00\x00\x01\x06google\x03com\x00\x00\x06\x00\x01\xc0\x0c\x00\x06\x00" |
| 277 | + b"\x01\x00\x00\x00\x0c\x00&\x03ns1\xc0\x0c\tdns-admin\xc0\x0c&~gw\x00\x00\x03\x84\x00\x00\x03\x84\x00" |
| 278 | + b"\x00\x07\x08\x00\x00\x00<\x00\x00)\x02\x00\x00\x00\x00\x00\x00\x00" |
| 279 | ) |
| 280 | assert ( |
| 281 | valid_compressed_rr_data.answers[0].data |
| 282 | == b"\x03ns1\x06google\x03com\x00\tdns-admin\x06google\x03com\x00&~gw\x00\x00\x03\x84\x00\x00\x03\x84\x00" |
| 283 | + b"\x00\x07\x08\x00\x00\x00<" |
| 284 | ) |
| 285 | A_record_data_contains_pointer_label = dns.DNSMessage.unpack( |