78 lines
3.0 KiB
Ruby
78 lines
3.0 KiB
Ruby
# encoding: UTF-8
|
|
|
|
require_relative "test_helper"
|
|
require_relative "../lib/meow/telnet"
|
|
require_relative "../lib/meow/text_pipeline"
|
|
|
|
module MeowTextPipelineTest
|
|
Telnet = MeowClient::Telnet
|
|
|
|
def self.bytes(*values)
|
|
values.pack("C*")
|
|
end
|
|
|
|
MeowTest.test("ANSI CSI and OSC sequences are filtered across chunks") do
|
|
pipeline = MeowClient::TextPipeline.new("UTF-8")
|
|
records = []
|
|
records.concat(pipeline.feed("red\e[3".b).records)
|
|
records.concat(pipeline.feed("1m text\e]0;title\e".b).records)
|
|
records.concat(pipeline.feed("\\tail\r\n".b).records)
|
|
MeowTest.assert_equal(["red texttail"], records)
|
|
end
|
|
|
|
MeowTest.test("Line framing handles CRLF CR-NUL bare CR and LF across chunks") do
|
|
pipeline = MeowClient::TextPipeline.new("UTF-8")
|
|
MeowTest.assert_equal(["one"], pipeline.feed("one\r".b).records)
|
|
MeowTest.assert_equal(["two"], pipeline.feed("\ntwo\r".b).records)
|
|
MeowTest.assert_equal(["three"], pipeline.feed("\0three\n".b).records)
|
|
MeowTest.assert_equal(["four"], pipeline.feed("four\rfive".b).records)
|
|
MeowTest.assert_equal(["five"], pipeline.finish)
|
|
end
|
|
|
|
MeowTest.test("UTF-8 characters survive arbitrary byte boundaries") do
|
|
encoded = "Price: €\n".encode("UTF-8").b
|
|
pipeline = MeowClient::TextPipeline.new("UTF-8")
|
|
records = []
|
|
encoded.each_byte { |byte| records.concat(pipeline.feed(bytes(byte)).records) }
|
|
MeowTest.assert_equal(["Price: €"], records)
|
|
end
|
|
|
|
MeowTest.test("Invalid and incomplete UTF-8 are replaced safely") do
|
|
pipeline = MeowClient::TextPipeline.new("UTF-8")
|
|
invalid = pipeline.feed("bad\xC0\n".b)
|
|
MeowTest.assert_equal(["bad\uFFFD"], invalid.records)
|
|
|
|
incomplete = MeowClient::TextPipeline.new("UTF-8")
|
|
incomplete.feed("tail \xE2\x82".b)
|
|
MeowTest.assert_equal(["tail \uFFFD"], incomplete.finish)
|
|
end
|
|
|
|
MeowTest.test("Legacy encodings are converted to UTF-8") do
|
|
windows = MeowClient::TextPipeline.new("Windows-1252")
|
|
latin = MeowClient::TextPipeline.new("ISO-8859-1")
|
|
MeowTest.assert_equal(["€"], windows.feed("\x80\n".b).records)
|
|
MeowTest.assert_equal(["é"], latin.feed("\xE9\n".b).records)
|
|
end
|
|
|
|
MeowTest.test("Prompts can be detected flushed and finished") do
|
|
pipeline = MeowClient::TextPipeline.new("UTF-8")
|
|
MeowTest.assert_empty(pipeline.feed("Password: ".b).records)
|
|
MeowTest.assert(pipeline.prompt_due?(0))
|
|
MeowTest.assert_equal("Password: ", pipeline.flush_prompt)
|
|
MeowTest.refute(pipeline.prompt_due?(0))
|
|
|
|
pipeline.feed("unfinished".b)
|
|
MeowTest.assert_equal(["unfinished"], pipeline.finish)
|
|
end
|
|
|
|
MeowTest.test("Text pipeline propagates Telnet replies and echo state") do
|
|
pipeline = MeowClient::TextPipeline.new("UTF-8")
|
|
packet = "hello".b + bytes(Telnet::IAC, Telnet::WILL, Telnet::ECHO) + " world\r\n".b
|
|
result = pipeline.feed(packet)
|
|
MeowTest.assert_equal(["hello world"], result.records)
|
|
MeowTest.assert_equal([bytes(Telnet::IAC, Telnet::DO, Telnet::ECHO)], result.replies)
|
|
MeowTest.assert_equal([[:remote_echo, true]], result.events)
|
|
MeowTest.assert(pipeline.remote_echo?)
|
|
end
|
|
end
|