Решение на Network Packets от Любослав Карев
Резултати
- 11 точки от тестове
- 1 бонус точка
- 12 точки общо
- 8 успешни тест(а)
- 7 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-1fxr6l6/solution) Finished test [unoptimized + debuginfo] target(s) in 5.16s Running target/debug/deps/solution-a73e64ec87929bd0 running 4 tests test tests::test_advanced_iteration ... ok test tests::test_advanced_packets ... ok test tests::test_basic_iteration ... ok test tests::test_basic_packets ... ok test result: ok. 4 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 ... thread '<unnamed>' panicked at 'assertion failed: `(left == right)` left: `""`, right: `"foo bar baz"`', tests/solution_test.rs:204:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. FAILED 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 ... thread '<unnamed>' panicked at 'assertion failed: `(left == right)` left: `"foo bar baz"`, right: `""`', tests/solution_test.rs:215:9 FAILED test solution_test::test_full_roundtrip_for_zero_size_string ... ok test solution_test::test_invalid_packet_combination ... thread '<unnamed>' panicked at 'Expression Ok("") does not match the pattern "Err(PacketError::CorruptedMessage)"', tests/solution_test.rs:239:9 FAILED 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_consuming_packets stdout ---- thread 'main' panicked at 'assertion failed: `(left == right)` left: `""`, right: `"foo bar baz"`', tests/solution_test.rs:197:5 ---- solution_test::test_deserialize_invalid_packet stdout ---- thread 'main' panicked at 'assertion failed: Packet::deserialize(&data).is_ok()', tests/solution_test.rs:149:5 ---- 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_full_roundtrip stdout ---- thread 'main' panicked at 'assertion failed: `(left == right)` left: `"foo bar baz"`, right: `""`', tests/solution_test.rs:210:5 ---- solution_test::test_invalid_packet_combination stdout ---- thread 'main' panicked at 'Expression Ok("") does not match the pattern "Err(PacketError::CorruptedMessage)"', tests/solution_test.rs:232: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_consuming_packets solution_test::test_deserialize_invalid_packet solution_test::test_deserialize_packet solution_test::test_deserialize_unicode_packet solution_test::test_full_roundtrip solution_test::test_invalid_packet_combination solution_test::test_serialize_packet test result: FAILED. 8 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out error: test failed, to rerun pass '--test solution_test'
История (3 версии и 8 коментара)
Любослав качи решение на 03.12.2019 11:55 (преди почти 6 години)
Любослав качи решение на 03.12.2019 14:15 (преди почти 6 години)
И с теб не сме се разбрали за логиката на чексумата. Когато в условието пишем за "сумата от байтовете на съобщението" имахме предвид payload частта. Може би трябваше да сложим "payload", но думата "съобщение" също се използва консистентно за тази част в инструкциите:
- Байт 1: Размера на съобщението, което се съхранява в следващите байтове: N.
- Следващите точно N байта: Самото съобщение, в байтове. Термина, който ще използваме по-надолу за тази част от пакета е "payload".
Не е лесно да се изразим напълно ясно. "По-надолу"-то трябваше да бъде в инструкциите в кода, но сигурно си помислил, че щом не използваме "payload" сигурно имаме предвид всичко до момента. Ще ми се да беше питал, но какво да се прави.
Подведох се леко от условието, но и че като се прави checksum, се взима всичко.
По принцип си прав, да, може би имаше логика да checksum-нем payload-а + header-ите. Цялото нещо е малко arbitrary, така че eh, така го измислихме. Догодина може би различно :).
Би могъл да използваш метода .extend_from_slice
за тези два цикъла.
По принцип идеята на това Packet::from_source
да връща остатък беше да използвате този остатък за следващата итерация. И това работи, разбира се, и в някои отношения, даже е по-удобно. Ако бих имплементирал логиката по този начин, бих накарал from_source
да връща само един елемент, и даже да не приема packet_size
, но разбира се ти нямаше как да правиш промени по интерфейса.
Не е необходимо всеки индивидуален пакет да бъде utf8-валиден низ. Пакетите съдържат просто поредици от байтове, отсечени в произволна точка, идеята беше съчетанието от байтове да бъде низ, понеже се конструира от низ. (И то конкретно в имплементацията за String
. Ако искахме имплементация примерно за Vec<u8>
, нямаше да има нужда от тази проверка.)
Добро решение, жалко, че не сме се разбрали за условието. Давам ти бонус точка за тестовете.
👍
И с теб не сме се разбрали за логиката на чексумата. Когато в условието пишем за "сумата от байтовете на съобщението" имахме предвид payload частта. Може би трябваше да сложим "payload", но думата "съобщение" също се използва консистентно за тази част в инструкциите:
Не е лесно да се изразим напълно ясно. "По-надолу"-то трябваше да бъде в инструкциите в кода, но сигурно си помислил, че щом не използваме "payload" сигурно имаме предвид всичко до момента. Ще ми се да беше питал, но какво да се прави.
Подведох се леко от условието, но и че като се прави checksum, се взима всичко.
По принцип си прав, да, може би имаше логика да checksum-нем payload-а + header-ите. Цялото нещо е малко arbitrary, така че eh, така го измислихме. Догодина може би различно :).
Би могъл да използваш метода
.extend_from_slice
за тези два цикъла.По принцип идеята на това
Packet::from_source
да връща остатък беше да използвате този остатък за следващата итерация. И това работи, разбира се, и в някои отношения, даже е по-удобно. Ако бих имплементирал логиката по този начин, бих накаралfrom_source
да връща само един елемент, и даже да не приемаpacket_size
, но разбира се ти нямаше как да правиш промени по интерфейса.Не е необходимо всеки индивидуален пакет да бъде utf8-валиден низ. Пакетите съдържат просто поредици от байтове, отсечени в произволна точка, идеята беше съчетанието от байтове да бъде низ, понеже се конструира от низ. (И то конкретно в имплементацията за
String
. Ако искахме имплементация примерно заVec<u8>
, нямаше да има нужда от тази проверка.)