2015-12-12 2 views
1

J'ai un serveur telnet que j'essaie de créer un test unitaire. Le serveur fonctionne correctement avec un client Telnet et devrait envoyer une invite dès que la connexion est établie. Envoyer sur la même prise fonctionne très bien. Toutefois, le client TCP du test d'unité refuse de recevoir des données et un délai d'expiration. Je suis nouveau à Elixir, donc, je peux manquer quelque chose de basique.Elixir gen_tcp.recv ne reçoit pas de données sur le test unitaire lorsque les clients telnet fonctionnent

opts = [:binary, packet: :line, active: false, reuseaddr: true] 
 
{:ok, socket} = :gen_tcp.connect('127.0.0.1', 4040, opts) 
 
{:ok, date_string} = Date.universal |> DateFormat.format("{ISO}") 
 
IO.puts "Socket #{inspect socket} Created #{date_string}" 
 
case :gen_tcp.recv(socket, 0, 5000) do 
 
    {:ok, data} -> IO.puts "Recevied data is #{data}" 
 
    {:error, reason} -> IO.puts "Error: Test Setup: First Receive: Reason: #{reason}" 
 
end

je reçois la sortie suivante

Socket #Port<0.5758> Created 2015-12-12T01:36:08.248+0000 
 
Error: Test Setup: First Receive: Reason: timeout

Il serait utile que quelqu'un peut faire la lumière sur ce qu'un novice Elixir fait mal

Répondre

0

Votre bug peut provenir de l'utilisation de l'option packet: :line. Comme vous le savez peut-être, cette option fait en sorte que les paquets sur le socket ne sont pas "considérés" (par exemple, ils ne sont pas envoyés en tant que messages si :active est true et ils ne sont pas retournés par :gen_tcp.recv/2-3 si :active est) jusqu'à ce qu'il y ait une nouvelle ligne.

Cela signifie que si votre serveur TCP envoie "foo" dans le socket, :gen_tcp.recv ne le retournera pas car il ne s'agit pas d'une "ligne". Envoi "foo/n" est ramassé par :gen_tcp.recv à la place.

Vérifiez votre serveur et qu'il envoie un paquet terminé par une nouvelle ligne, car c'est probablement la cause (je ne vois rien d'autre d'incorrect avec votre code :)).

+0

Merci beaucoup. Ce simple changement à cru a fait le travail. – davidj