this repo has no description
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

jetstream: better websocket tests

+92 -40
+92 -40
src/jetstream.zig
··· 331 331 pong, 332 332 }; 333 333 334 - fn next(self: *FrameIterator) !?Data { 335 - if (self.idx + 2 >= self.bytes.len) return null; 334 + const Byte1 = packed struct { 335 + opcode: enum(u4) { 336 + continuation = 0x0, 337 + text = 0x1, 338 + binary = 0x2, 339 + close = 0x8, 340 + ping = 0x9, 341 + pong = 0xA, 342 + _, 343 + }, 344 + reserved: u3, 345 + final: bool, 346 + }; 336 347 337 - const Byte1 = packed struct { 338 - opcode: enum(u4) { 339 - continuation = 0x0, 340 - text = 0x1, 341 - binary = 0x2, 342 - close = 0x8, 343 - ping = 0x9, 344 - pong = 0xA, 345 - _, 346 - }, 347 - reserved: u3, 348 - final: bool, 349 - }; 348 + const Byte2 = packed struct { 349 + len: u7, 350 + mask: bool, 351 + }; 350 352 351 - const Byte2 = packed struct { 352 - len: u7, 353 - mask: bool, 354 - }; 353 + fn next(self: *FrameIterator) !?Data { 354 + if (self.idx + 2 >= self.bytes.len) return null; 355 355 356 356 const byte1: Byte1 = @bitCast(self.bytes[self.idx]); 357 357 const byte2: Byte2 = @bitCast(self.bytes[self.idx + 1]); ··· 405 405 } 406 406 }; 407 407 408 - fn testHandler(_: *ourio.Ring, task: ourio.Task) anyerror!void { 409 - const s = try task.result.?.userbytes; 410 - const value = try std.json.parseFromSlice(std.json.Value, std.testing.allocator, s, .{}); 411 - defer value.deinit(); 412 - const pretty = try std.json.stringifyAlloc(std.testing.allocator, value.value, .{ .whitespace = .indent_2 }); 413 - defer std.testing.allocator.free(pretty); 414 - std.log.err("json={s}", .{pretty}); 408 + test "FrameIterator: valid" { 409 + const byte1: FrameIterator.Byte1 = .{ 410 + .opcode = .text, 411 + .reserved = 0, 412 + .final = true, 413 + }; 414 + const byte2: FrameIterator.Byte2 = .{ 415 + .len = 3, 416 + .mask = false, 417 + }; 418 + 419 + var buf: [5]u8 = undefined; 420 + buf[0] = @bitCast(byte1); 421 + buf[1] = @bitCast(byte2); 422 + buf[2] = 'f'; 423 + buf[3] = 'o'; 424 + buf[4] = 'o'; 425 + 426 + var iter: FrameIterator = .{ .bytes = &buf }; 427 + const data = try iter.next(); 428 + try std.testing.expectEqualStrings("foo", data.?.text); 429 + const last = try iter.next(); 430 + try std.testing.expect(last == null); 415 431 } 416 432 417 - test { 418 - const gpa = std.testing.allocator; 433 + test "FrameIterator: short read" { 434 + const byte1: FrameIterator.Byte1 = .{ 435 + .opcode = .text, 436 + .reserved = 0, 437 + .final = true, 438 + }; 439 + const byte2: FrameIterator.Byte2 = .{ 440 + .len = 3, 441 + .mask = false, 442 + }; 419 443 420 - var bundle: std.crypto.Certificate.Bundle = .{}; 421 - try bundle.rescan(gpa); 422 - defer bundle.deinit(gpa); 444 + var buf: [3]u8 = undefined; 445 + buf[0] = @bitCast(byte1); 446 + buf[1] = @bitCast(byte2); 447 + buf[2] = 'f'; 423 448 424 - var io: ourio.Ring = try .init(gpa, 16); 425 - defer io.deinit(); 449 + var iter: FrameIterator = .{ .bytes = &buf }; 450 + const data = try iter.next(); 451 + try std.testing.expect(data == null); 452 + } 426 453 427 - var resolver: stda.net.dns.Resolver = undefined; 428 - try resolver.init(gpa, &io, .{}); 429 - try io.run(.until_done); 454 + test "FrameIterator: valid, multiple" { 455 + const byte1: FrameIterator.Byte1 = .{ 456 + .opcode = .text, 457 + .reserved = 0, 458 + .final = true, 459 + }; 460 + const byte2: FrameIterator.Byte2 = .{ 461 + .len = 3, 462 + .mask = false, 463 + }; 430 464 431 - var stream: Stream = undefined; 432 - try stream.init(gpa, &io, bundle, .{}, &resolver, .{ .cb = testHandler }); 433 - defer stream.deinit(); 465 + var buf: [10]u8 = undefined; 466 + buf[0] = @bitCast(byte1); 467 + buf[1] = @bitCast(byte2); 468 + buf[2] = 'f'; 469 + buf[3] = 'o'; 470 + buf[4] = 'o'; 471 + buf[5] = @bitCast(byte1); 472 + buf[6] = @bitCast(byte2); 473 + buf[7] = 'f'; 474 + buf[8] = 'o'; 475 + buf[9] = 'o'; 434 476 435 - try io.run(.until_done); 477 + var iter: FrameIterator = .{ .bytes = &buf }; 478 + { 479 + const data = try iter.next(); 480 + try std.testing.expectEqualStrings("foo", data.?.text); 481 + } 482 + { 483 + const data = try iter.next(); 484 + try std.testing.expectEqualStrings("foo", data.?.text); 485 + } 486 + const last = try iter.next(); 487 + try std.testing.expect(last == null); 436 488 }