diff --git a/lib/process_shared/shared_memory_io.rb b/lib/process_shared/shared_memory_io.rb index a21a8a0..dee31fb 100644 --- a/lib/process_shared/shared_memory_io.rb +++ b/lib/process_shared/shared_memory_io.rb @@ -198,6 +198,7 @@ module ProcessShared def read(length = nil, buffer = nil) length ||= (mem.size - pos) buffer ||= '' + buffer.force_encoding('ASCII-8BIT') unless RUBY_VERSION.start_with?('1.8') actual_length = [(mem.size - pos), length].min actual_length.times do diff --git a/spec/process_shared/shared_memory_io_spec.rb b/spec/process_shared/shared_memory_io_spec.rb new file mode 100644 index 0000000..7fcb26a --- /dev/null +++ b/spec/process_shared/shared_memory_io_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' +require 'process_shared' + +module ProcessShared + describe SharedMemoryIO do + + describe '#read' do + def binary(s) + (RUBY_VERSION == '1.8.7') ? s : s.force_encoding('ASCII-8BIT') + end + + def output_for(input) + mem = SharedMemory.new(16) + mem.put_bytes(0, input, 0, input.bytesize) + io = SharedMemoryIO.new(mem) + io.read(input.bytesize) + end + + it 'returns correct binary data for plain ASCII string' do + input = 'Hello' + output_for(input).must_equal binary(input) + end + + it 'returns correct binary data for UTF-8 string' do + input = 'Mária' + output_for(input).must_equal binary(input) + end + + it 'returns correct binary data for explicitly binary data' do + input = "\x00\xD1\x9B\x86\x00" + output_for(input).must_equal binary(input) + end + end + + end +end