#!/usr/bin/env elixir # ============================================================================= # Simple connectivity and packet test # ============================================================================= # This script verifies basic connectivity to the jPOS server and tests # a single SALE transaction to ensure the framework is working correctly. # # Usage: # elixir test_connectivity.exs [--host HOST] [--port PORT] # # Example: # elixir test_connectivity.exs # elixir test_connectivity.exs --host 192.168.1.100 --port 9103 # ============================================================================= Mix.install([]) Code.require_file("lib/iso8583/packet_builder.ex", __DIR__) Code.require_file("lib/iso8583/parser.ex", __DIR__) defmodule ConnectivityTest do def main(args) do config = parse_args(args, %{host: "localhost", port: 14001}) IO.puts("\n" <> String.duplicate("=", 60)) IO.puts("jPOS Server Connectivity Test") IO.puts(String.duplicate("=", 60)) IO.puts("Server: #{config.host}:#{config.port}") IO.puts(String.duplicate("=", 60)) # Test 1: Basic connectivity IO.puts("\n[1/3] Testing basic connectivity...") if !test_connectivity(config) do IO.puts("❌ FAILED: Cannot connect to server") IO.puts("\nPlease verify:") IO.puts(" 1. jPOS server is running") IO.puts(" 2. Server is listening on #{config.host}:#{config.port}") IO.puts(" 3. No firewall blocking the connection") System.halt(1) end IO.puts("✓ Connection successful") # Test 2: Send simple packet IO.puts("\n[2/3] Building test packet...") test_case = %{ test_id: "TEST-001", scenario: "connectivity_test", description: "Basic connectivity test - $10 Visa purchase", tid: "41448413", mid: "285414480000000", stan: "000001", amount: "000000001000", pan: "4111111111111111", processing_code: "000000", mti: "0200", nii: "782", expected_mti_response: "0210", expected_response_code: "00" } packet = ISO8583.PacketBuilder.build(test_case) IO.puts("✓ Packet built (#{byte_size(packet)} bytes)") IO.puts(" Hex: #{String.slice(Base.encode16(packet), 0, 40)}...") # Test 3: Send and receive IO.puts("\n[3/3] Sending packet and waiting for response...") case send_and_receive(packet, config) do {:ok, response} -> IO.puts("✓ Response received (#{byte_size(response)} bytes)") IO.puts(" Hex: #{String.slice(Base.encode16(response), 0, 40)}...") case ISO8583.Parser.parse(response) do {:ok, parsed} -> IO.puts("\n" <> String.duplicate("=", 60)) IO.puts("Response Parsed Successfully!") IO.puts(String.duplicate("=", 60)) IO.puts("MTI: #{parsed.mti}") IO.puts("Response Code: #{ISO8583.Parser.get_response_code(parsed) || "N/A"}") IO.puts("Approval Code: #{ISO8583.Parser.get_approval_code(parsed) || "N/A"}") IO.puts("STAN: #{ISO8583.Parser.get_stan(parsed) || "N/A"}") IO.puts("Fields: #{inspect(parsed.present_fields)}") IO.puts("\n✅ SUCCESS: Framework is working correctly!") IO.puts("\nYou can now run the full test suite:") IO.puts(" elixir run_tests.exs --type sale") {:error, reason} -> IO.puts("\n⚠️ WARNING: Response received but parsing failed") IO.puts("Error: #{inspect(reason)}") IO.puts("\nThis might indicate:") IO.puts(" 1. Server using different ISO8583 format") IO.puts(" 2. Response packet structure mismatch") IO.puts("\nRaw response hex:") IO.puts(Base.encode16(response)) end {:error, reason} -> IO.puts("❌ FAILED: #{inspect(reason)}") System.halt(1) end IO.puts("\n" <> String.duplicate("=", 60)) end defp test_connectivity(config) do host = String.to_charlist(config.host) case :gen_tcp.connect(host, config.port, [:binary, active: false], 3000) do {:ok, socket} -> :gen_tcp.close(socket) true {:error, _} -> false end end defp send_and_receive(packet, config) do host = String.to_charlist(config.host) case :gen_tcp.connect(host, config.port, [:binary, active: false], 5000) do {:ok, socket} -> case :gen_tcp.send(socket, packet) do :ok -> result = :gen_tcp.recv(socket, 0, 10_000) :gen_tcp.close(socket) result error -> :gen_tcp.close(socket) error end error -> error end end defp parse_args([], config), do: config defp parse_args(["--host", host | rest], config) do parse_args(rest, Map.put(config, :host, host)) end defp parse_args(["--port", port | rest], config) do parse_args(rest, Map.put(config, :port, String.to_integer(port))) end defp parse_args([_ | rest], config), do: parse_args(rest, config) end ConnectivityTest.main(System.argv())