Решение на 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>, нямаше да има нужда от тази проверка.)