# encoding: UTF-8
require 'winrm/psrp/message'
describe WinRM::PSRP::Message do
context 'all fields provided' do
let(:payload) { 'this is my payload' }
subject do
described_class.new(
'bc1bfbba-8215-4a04-b2df-7a3ac0310e16',
WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_output],
payload,
'4218a578-0f18-4b19-82c3-46b433319126')
end
it 'sets the destination to server LE' do
expect(subject.bytes[0..3]).to eq([2, 0, 0, 0])
end
it 'sets the message type LE' do
expect(subject.bytes[4..7]).to eq([4, 16, 4, 0])
end
it 'sets the runspace pool id' do
expect(subject.bytes[8..23]).to eq(
[186, 251, 27, 188, 21, 130, 4, 74, 178, 223, 122, 58, 192, 49, 14, 22])
end
it 'sets the pipeline id' do
expect(subject.bytes[24..39]).to eq(
[120, 165, 24, 66, 24, 15, 25, 75, 130, 195, 70, 180, 51, 49, 145, 38])
end
it 'prefixes the blob with BOM' do
expect(subject.bytes[40..42]).to eq([239, 187, 191])
end
it 'contains at least the first 8 bytes of the XML payload' do
expect(subject.bytes[43..-1]).to eq(payload.bytes)
end
it 'parses the data' do
expect(subject.parsed_data).to be_a(WinRM::PSRP::MessageData::PipelineOutput)
end
end
context 'create' do
it 'raises error when message type is not valid' do
expect do
WinRM::PSRP::Message.new(
'bc1bfbba-8215-4a04-b2df-7a3ac0310e16',
0x00000000,
%(),
'4218a578-0f18-4b19-82c3-46b433319126')
end.to raise_error(RuntimeError)
end
end
context 'no command id' do
subject(:msg) do
payload = <<-HERE.unindent
2.3
2.01.1.0.1
HERE
WinRM::PSRP::Message.new(
'bc1bfbba-8215-4a04-b2df-7a3ac0310e16',
WinRM::PSRP::Message::MESSAGE_TYPES[:session_capability],
payload)
end
it 'sets the pipeline id to empty' do
expect(msg.bytes[24..39]).to eq([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
end
end
end