aprs.me/test/support
2025-06-16 13:11:58 -05:00
..
fixtures add auth 2023-01-29 13:29:25 -06:00
aprs_is_mock.ex storing fix 2025-06-16 13:11:58 -05:00
conn_case.ex auto style things 2023-12-17 12:11:57 -06:00
data_case.ex update everything 2025-01-22 12:12:39 -06:00
README.md dont connect to is server in test 2025-06-16 12:45:35 -05:00

Test Environment APRS Isolation

This directory contains support files to ensure that the APRS.me application does not make external network connections during testing.

Overview

The APRS.me application normally connects to external APRS-IS (Automatic Packet Reporting System - Internet Service) servers to receive real-time amateur radio packet data. During testing, we need to prevent these external connections to ensure:

  1. Test Isolation: Tests run independently without external dependencies
  2. Network Security: No unintended external connections during CI/CD
  3. Performance: Tests run faster without network delays
  4. Reliability: Tests don't fail due to external service availability

Implementation

Configuration-Based Prevention

The primary mechanism is environment-based configuration in config/test.exs:

# Disable APRS-IS external connections in test environment
config :aprs,
  aprs_is_server: nil,
  aprs_is_port: nil,
  aprs_is_default_filter: nil,
  aprs_is_login_id: nil,
  aprs_is_password: nil,
  disable_aprs_connection: true

Application-Level Guards

The Aprs.Application module only starts the APRS-IS supervisor in :prod and :dev environments:

children =
  if Application.get_env(:aprs, :env) in [:prod, :dev] do
    children ++ [Aprs.Is.IsSupervisor]
  else
    children
  end

Module-Level Safeguards

The Aprs.Is module includes additional safeguards to prevent accidental connections:

  • Early termination if started in test environment
  • Connection blocking in the connect_to_aprs_is/2 function
  • Safe fallback responses for status queries

Mock Implementation

The AprsIsMock module (aprs_is_mock.ex) provides a test-safe implementation that:

  • Mimics the interface of the real Aprs.Is module
  • Returns realistic status information without external connections
  • Allows simulation of packet reception for testing
  • Provides connection state simulation for comprehensive testing

Usage in Tests

Basic Setup

The mock is automatically configured in test_helper.exs:

# Ensure no external APRS connections during tests
Application.put_env(:aprs, :disable_aprs_connection, true)
Code.require_file("support/aprs_is_mock.ex", __DIR__)

Using the Mock

# Start the mock in your test setup
{:ok, _pid} = AprsIsMock.start_link()

# Get status (no external connection)
status = AprsIsMock.get_status()

# Simulate packet reception
test_packet = %{sender: "TEST-1", latitude: 33.0, longitude: -96.0}
AprsIsMock.simulate_packet(test_packet)

# Simulate connection state changes
AprsIsMock.simulate_connection_state(true)  # connected
AprsIsMock.simulate_connection_state(false) # disconnected

Testing Network Isolation

The Aprs.IsTest module includes comprehensive tests to verify:

  • APRS.Is module doesn't start in test environment
  • Configuration properly disables connections
  • No real APRS servers are contacted
  • Mock provides expected functionality

Verification

To verify that external connections are properly blocked:

  1. Run the test suite: mix test test/aprs/is_test.exs
  2. Check configuration: Ensure test config sets disable_aprs_connection: true
  3. Monitor network: During test runs, no connections should be made to APRS-IS servers
  4. Review logs: Test environment should log connection prevention messages

Security Notes

  • Never commit real APRS credentials to test configurations
  • Use placeholder values like "TEST" for callsigns in tests
  • Ensure production credentials are only available in production environment
  • Regularly audit test configurations to prevent credential leakage

Common APRS-IS Servers (Blocked in Tests)

The following servers should never be contacted during testing:

  • rotate.aprs2.net (Primary rotation server)
  • dallas.aprs2.net (Dallas server)
  • seattle.aprs2.net (Seattle server)
  • chicago.aprs2.net (Chicago server)
  • atlanta.aprs2.net (Atlanta server)

Any test configuration pointing to these servers indicates a misconfiguration.

Troubleshooting

Tests Hanging or Timing Out

If tests hang, check:

  • APRS.Is process isn't starting (Process.whereis(Aprs.Is) should return nil)
  • Test configuration has disable_aprs_connection: true
  • No real server addresses in test config

External Connection Errors in Tests

If you see TCP connection errors during tests:

  • Verify the application supervision tree excludes APRS-IS in test
  • Check that Mix.env() returns :test
  • Ensure test_helper.exs properly configures the environment

Mock Not Working

If the mock doesn't provide expected responses:

  • Verify AprsIsMock is properly loaded in test_helper.exs
  • Check that the mock is started in test setup
  • Ensure mock methods match the real module's interface

Contributing

When adding new APRS-related functionality:

  1. Update the mock to include new methods
  2. Add test coverage for network isolation
  3. Verify configuration prevents external connections
  4. Document any new test isolation requirements