Решение на Network Packets от Стоян Ефтимов
Резултати
- 15 точки от тестове
- 1 бонус точка
- 16 точки общо
- 11 успешни тест(а)
- 4 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-15m5fc1/solution) Finished test [unoptimized + debuginfo] target(s) in 4.75s Running target/debug/deps/solution-a73e64ec87929bd0 running 10 tests test from_packet_data ... ok test test_basic_packets ... ok test test_deserialize ... ok test test_deserialize_corrupted_message ... ok test test_deserialize_invalid_checksum ... ok test test_deserialize_unknown_version ... ok test test_from_source ... ok test test_iteration ... ok test test_serialize ... ok test test_to_packet_data ... ok test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out Running target/debug/deps/solution_test-38971695424b36d5 running 15 tests test solution_test::test_construct_packet_from_unicode ... ok test solution_test::test_construct_packet_no_remainder ... ok test solution_test::test_construct_packet_with_remainder ... ok test solution_test::test_construct_packet_with_remainder_cyrillic ... ok test solution_test::test_consuming_packets ... ok test solution_test::test_deserialize_invalid_packet ... FAILED test solution_test::test_deserialize_packet ... FAILED test solution_test::test_deserialize_unicode_packet ... FAILED test solution_test::test_full_roundtrip ... ok test solution_test::test_full_roundtrip_for_zero_size_string ... ok test solution_test::test_invalid_packet_combination ... ok test solution_test::test_iterating_packets ... ok test solution_test::test_iterating_packets_for_zero_size_string ... ok test solution_test::test_serialize_packet ... FAILED test solution_test::test_zero_size ... ok failures: ---- solution_test::test_deserialize_invalid_packet stdout ---- thread 'main' panicked at 'assertion failed: Packet::deserialize(&data).is_ok()', tests/solution_test.rs:149:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. ---- solution_test::test_deserialize_packet stdout ---- thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidChecksum', src/libcore/result.rs:1165:5 ---- solution_test::test_deserialize_unicode_packet stdout ---- thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidChecksum', src/libcore/result.rs:1165:5 ---- solution_test::test_serialize_packet stdout ---- thread 'main' panicked at 'assertion failed: `(left == right)` left: `[0, 0, 1, 111]`, right: `[0, 0, 1, 107]`', tests/solution_test.rs:103:5 failures: solution_test::test_deserialize_invalid_packet solution_test::test_deserialize_packet solution_test::test_deserialize_unicode_packet solution_test::test_serialize_packet test result: FAILED. 11 passed; 4 failed; 0 ignored; 0 measured; 0 filtered out error: test failed, to rerun pass '--test solution_test'
История (2 версии и 5 коментара)
Стоян качи решение на 03.12.2019 01:23 (преди почти 6 години)
Не е задължително тук да бъде валиден utf8 низ съобщението. Чак по-долу, когато го съберем в низ, трябваше да се направи тази проверка. Интересното е, че това не fail-ва тестове, което ме учудва. Може би наша грешка, че не сме хванали този случай.
Не сме се разбрали тук за логиката на чексумата. Когато в условието пишем за "сумата от байтовете на съобщението" имахме предвид payload частта. Може би трябваше да сложим "payload", но думата "съобщение" също се използва консистентно за тази част в инструкциите:
- Байт 1: Размера на съобщението, което се съхранява в следващите байтове: N.
- Следващите точно N байта: Самото съобщение, в байтове. Термина, който ще използваме по-надолу за тази част от пакета е "payload".
Не е лесно да се изразим напълно ясно. "По-надолу"-то трябваше да бъде в инструкциите в кода, но сигурно си помислил, че щом не използваме "payload" сигурно имаме предвид всичко до момента. Ще ми се да беше питал, но какво да се прави. Загубата на 4 точки не мисля, че е твърде голяма драма.
Пак, тук правиш проверка за utf8-валидност на всеки индивидуален пакет, което няма винаги да работи. Спокойно можеш да имаш пакети, които са невалиден utf8, payload-овете им са просто байтове. Важното беше събраното съобщение да е ок.
Един начин да си опростиш тези тестове е с макрос:
macro_rules! assert_match {
($expr:expr, $pat:pat) => {
if let $pat = $expr {
// all good
} else {
assert!(false, "Expression {:?} does not match the pattern {:?}", $expr, stringify!($pat));
}
}
}
Тогава този тест ще е нещо такова:
assert_match!(Packet::deserialize(&data), Err(PacketError::InvalidPacket));
Добро решение. Не сме се разбрали с условието, но отвъд това е сравнително добре имплементирано. Все пак може да разгледаш останалите домашни за идеи.
Ще ти дам и една бонус точка за писането на тестове.
Не е задължително тук да бъде валиден utf8 низ съобщението. Чак по-долу, когато го съберем в низ, трябваше да се направи тази проверка. Интересното е, че това не fail-ва тестове, което ме учудва. Може би наша грешка, че не сме хванали този случай.
Не сме се разбрали тук за логиката на чексумата. Когато в условието пишем за "сумата от байтовете на съобщението" имахме предвид payload частта. Може би трябваше да сложим "payload", но думата "съобщение" също се използва консистентно за тази част в инструкциите:
Не е лесно да се изразим напълно ясно. "По-надолу"-то трябваше да бъде в инструкциите в кода, но сигурно си помислил, че щом не използваме "payload" сигурно имаме предвид всичко до момента. Ще ми се да беше питал, но какво да се прави. Загубата на 4 точки не мисля, че е твърде голяма драма.
Пак, тук правиш проверка за utf8-валидност на всеки индивидуален пакет, което няма винаги да работи. Спокойно можеш да имаш пакети, които са невалиден utf8, payload-овете им са просто байтове. Важното беше събраното съобщение да е ок.
Един начин да си опростиш тези тестове е с макрос:
Тогава този тест ще е нещо такова: