class Nonnative::FaultInjectionProxy

Attributes

connections[R]
logger[R]
mutex[R]
state[R]
tcp_server[R]
thread[R]

Public Class Methods

new(service) click to toggle source
Calls superclass method Nonnative::Proxy::new
# File lib/nonnative/fault_injection_proxy.rb, line 5
def initialize(service)
  @connections = Concurrent::Hash.new
  @logger = Logger.new(service.proxy.log)
  @mutex = Mutex.new
  @state = :none

  super service
end

Public Instance Methods

close_all() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 24
def close_all
  apply_state :close_all
end
delay() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 28
def delay
  apply_state :delay
end
invalid_data() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 32
def invalid_data
  apply_state :invalid_data
end
port() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 40
def port
  service.proxy.port
end
reset() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 36
def reset
  apply_state :none
end
start() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 14
def start
  @tcp_server = ::TCPServer.new('0.0.0.0', service.port)
  @thread = Thread.new { perform_start }
end
stop() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 19
def stop
  thread&.terminate
  tcp_server&.close
end

Private Instance Methods

accept_connection(local_socket) click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 58
def accept_connection(local_socket)
  id = Thread.current.object_id
  socket_info = local_socket.inspect

  error = connect(local_socket)
  if error
    logger.error "could not handle the connection for '#{id}' with socket '#{socket_info}' and error '#{error}'"
  else
    logger.info "handled connection for '#{id}' with socket '#{socket_info}'"
  end

  connections.delete(id)
end
apply_state(state) click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 86
def apply_state(state)
  mutex.synchronize do
    @state = state
    close_connections
  end
end
close_connections() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 81
def close_connections
  connections.each_value(&:terminate)
  connections.clear
end
connect(local_socket) click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 72
def connect(local_socket)
  pair = SocketPairFactory.create(read_state, service.proxy)
  pair.connect(local_socket)
rescue StandardError => e
  local_socket.close

  e
end
perform_start() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 48
def perform_start
  loop do
    thread = Thread.start(tcp_server.accept) do |local_socket|
      accept_connection local_socket
    end

    connections[thread.object_id] = thread
  end
end
read_state() click to toggle source
# File lib/nonnative/fault_injection_proxy.rb, line 93
def read_state
  mutex.synchronize { state }
end