Фикс: исправлено исчезновение части уведомлений при открытии пуша

This commit is contained in:
2026-04-06 23:35:29 +05:00
parent 333908a4d9
commit a5945152c0
27 changed files with 2240 additions and 340 deletions

View File

@@ -153,6 +153,65 @@ final class SchemaParityTests: XCTestCase {
XCTAssertEqual(decoded.packetId, 0x06)
XCTAssertEqual(decodedMessage.attachments.first?.type, .call)
XCTAssertFalse(decodedMessage.isMalformed)
}
func testPacketMessageDecodeSupportsAttachmentMeta4Compatibility() throws {
let encoded = makePacketMessageData(attachmentMetaFieldCount: 4)
guard let decoded = PacketRegistry.decode(from: encoded),
let message = decoded.packet as? PacketMessage else {
XCTFail("Failed to decode packet with 4 attachment meta fields")
return
}
XCTAssertEqual(decoded.packetId, 0x06)
XCTAssertFalse(message.isMalformed)
XCTAssertEqual(message.fromPublicKey, "02from")
XCTAssertEqual(message.toPublicKey, "02to")
XCTAssertEqual(message.messageId, "msg-compat")
XCTAssertEqual(message.aesChachaKey, "aes-key")
XCTAssertEqual(message.attachments.count, 1)
XCTAssertEqual(message.attachments[0].transportTag, "tag-1")
XCTAssertEqual(message.attachments[0].transportServer, "cdn.rosetta.im")
}
func testPacketMessageDecodeSupportsAttachmentMeta0Compatibility() throws {
let encoded = makePacketMessageData(attachmentMetaFieldCount: 0)
guard let decoded = PacketRegistry.decode(from: encoded),
let message = decoded.packet as? PacketMessage else {
XCTFail("Failed to decode packet with 0 attachment meta fields")
return
}
XCTAssertEqual(decoded.packetId, 0x06)
XCTAssertFalse(message.isMalformed)
XCTAssertEqual(message.messageId, "msg-compat")
XCTAssertEqual(message.aesChachaKey, "aes-key")
XCTAssertEqual(message.attachments.count, 1)
XCTAssertEqual(message.attachments[0].transportTag, "")
XCTAssertEqual(message.attachments[0].transportServer, "")
}
func testPacketMessageDecodeMarksMalformedForTruncatedOrMisalignedPayload() throws {
let canonical = makePacketMessageData(attachmentMetaFieldCount: 2)
let truncated = canonical.dropLast(3)
let withTrailingByte = canonical + Data([0x00])
guard let decodedTruncated = PacketRegistry.decode(from: Data(truncated)),
let messageTruncated = decodedTruncated.packet as? PacketMessage else {
XCTFail("Failed to decode truncated packet wrapper")
return
}
XCTAssertTrue(messageTruncated.isMalformed)
XCTAssertFalse(messageTruncated.malformedFingerprint.isEmpty)
guard let decodedTrailing = PacketRegistry.decode(from: withTrailingByte),
let messageTrailing = decodedTrailing.packet as? PacketMessage else {
XCTFail("Failed to decode trailing-byte packet wrapper")
return
}
XCTAssertTrue(messageTrailing.isMalformed)
XCTAssertFalse(messageTrailing.malformedFingerprint.isEmpty)
}
func testSessionPacketContextResolverAcceptsGroupWireShape() throws {
@@ -188,4 +247,33 @@ final class SchemaParityTests: XCTestCase {
_ = stream
XCTAssertTrue(true)
}
private func makePacketMessageData(attachmentMetaFieldCount: Int) -> Data {
let stream = Rosetta.Stream()
stream.writeInt16(PacketMessage.packetId)
stream.writeString("02from")
stream.writeString("02to")
stream.writeString("ciphertext")
stream.writeString("chacha-key")
stream.writeInt64(1_710_000_000_000)
stream.writeString("hash")
stream.writeString("msg-compat")
stream.writeInt8(1)
stream.writeString("att-1")
stream.writeString("preview")
stream.writeString("blob")
stream.writeInt8(AttachmentType.image.rawValue)
if attachmentMetaFieldCount >= 2 {
stream.writeString("tag-1")
stream.writeString("cdn.rosetta.im")
}
if attachmentMetaFieldCount >= 4 {
stream.writeString("02encoded-for")
stream.writeString("desktop")
}
stream.writeString("aes-key")
return stream.toData()
}
}