Class: Nonnative::FaultInjectionProxy

Inherits:
Proxy
  • Object
show all
Defined in:
lib/nonnative/fault_injection_proxy.rb

Overview

Fault-injection proxy for TCP services.

This proxy accepts incoming TCP connections and forwards traffic to the configured upstream (‘service.proxy.host` / `service.proxy.port`) via a socket-pair implementation. It can also inject failures to help validate client resilience.

This class exposes a small public control surface for tests:

  • #close_all: close connections immediately on accept

  • #delay: delay reads by a configured duration (default: 2 seconds)

  • #invalid_data: corrupt outbound data by shuffling characters

  • #reset: return to healthy pass-through behavior

State changes terminate any active connections so new connections observe the new behavior.

## Wiring

When enabled, your test/client should typically connect to #host:#port (the proxy endpoint), and the proxy will connect onward to the underlying service.

## Configuration

The proxy is configured via the runner’s ‘proxy` hash:

  • ‘kind`: `“fault_injection”`

  • ‘host` / `port`: where the proxy should be reached by clients (exposed via #host/#port)

  • ‘log`: file path used by this proxy’s internal logger

  • ‘wait`: sleep interval (seconds) applied after state changes

  • ‘options`:

    • ‘delay`: delay duration in seconds used by #delay

Instance Method Summary collapse

Constructor Details

#initialize(service) ⇒ FaultInjectionProxy

Returns a new instance of FaultInjectionProxy.

Parameters:



39
40
41
42
43
44
45
46
# File 'lib/nonnative/fault_injection_proxy.rb', line 39

def initialize(service)
  @connections = Concurrent::Hash.new
  @logger = Logger.new(service.proxy.log)
  @mutex = Mutex.new
  @state = :none

  super
end

Instance Method Details

#close_allvoid

This method returns an undefined value.

Forces new connections to be closed immediately.



74
75
76
# File 'lib/nonnative/fault_injection_proxy.rb', line 74

def close_all
  apply_state :close_all
end

#delayvoid

This method returns an undefined value.

Delays reads before forwarding.

The delay duration is controlled by ‘service.proxy.options` and defaults to 2 seconds.



83
84
85
# File 'lib/nonnative/fault_injection_proxy.rb', line 83

def delay
  apply_state :delay
end

#hostString

Returns the host clients should connect to when using this proxy.

Returns:

  • (String)


104
105
106
# File 'lib/nonnative/fault_injection_proxy.rb', line 104

def host
  service.proxy.host
end

#invalid_datavoid

This method returns an undefined value.

Corrupts forwarded data by shuffling characters.



90
91
92
# File 'lib/nonnative/fault_injection_proxy.rb', line 90

def invalid_data
  apply_state :invalid_data
end

#portInteger

Returns the port clients should connect to when using this proxy.

Returns:

  • (Integer)


111
112
113
# File 'lib/nonnative/fault_injection_proxy.rb', line 111

def port
  service.proxy.port
end

#resetvoid

This method returns an undefined value.

Resets the proxy back to healthy pass-through behavior.



97
98
99
# File 'lib/nonnative/fault_injection_proxy.rb', line 97

def reset
  apply_state :none
end

#startvoid

This method returns an undefined value.

Starts the proxy accept loop in a background thread.

This binds a TCP server on the underlying runner’s ‘service.host` / `service.port`. Clients should connect to #host:#port.



54
55
56
57
58
59
# File 'lib/nonnative/fault_injection_proxy.rb', line 54

def start
  @tcp_server = ::TCPServer.new(service.host, service.port)
  @thread = Thread.new { perform_start }

  Nonnative.logger.info "started with host '#{service.host}' and port '#{service.port}' for proxy 'fault_injection'"
end

#stopvoid

This method returns an undefined value.

Stops the proxy and closes its listening socket.



64
65
66
67
68
69
# File 'lib/nonnative/fault_injection_proxy.rb', line 64

def stop
  thread&.terminate
  tcp_server&.close

  Nonnative.logger.info "stopped with host '#{service.host}' and port '#{service.port}' for proxy 'fault_injection'"
end