#! /usr/local/bin/octave -q

## Tests for octave sockets
##

function fail = dotest()
  page_screen_output(0);
  fail = 0;

  # Create the sockets
  ## Server socket
  server = socket(AF_INET, SOCK_STREAM, 0);
  if ( server < 0 )
    ++fail;
    return
  end

  rc = bind(server,9001);
  if ( rc ~= 0 )
    ++fail;
    return
  end

  rc = listen(server,1);
  if ( rc ~= 0 )
    ++fail;
    return
  end

  ## Client socket
  client = socket(AF_INET, SOCK_STREAM, 0);
  if ( client < 0 )
    ++fail;
    return
  end

  # Create the connection and accept the connection
  server_info = struct("addr", "127.0.0.1", "port", 9001);
  rc = connect(client, server_info);
  if ( rc ~= 0 )
    ++fail;
    return
  end

  server_data = accept(server);
  if ( server_data < 0 )
    ++fail;
    return
  end

  # Send and receive data

  ## Send as string from client
  msg = "Hello socket-land!";
  rc = send(client, msg);
  if ( rc ~= length(msg) )
    ++fail;
    return
  end

  ## Receive at server
  [msg_s, len_s] = recv(server_data, 100);
  if ( msg_s == -1 || len_s ~= length(msg) )
    ++fail;
    return
  end

  ## Send back out from server
  rc = send(server_data, msg_s);
  if ( rc ~= length(msg_s) )
    ++fail;
    return
  end

  ## Receive at client
  [msg_c, len_c] = recv(client, 100);
  if ( msg_c == -1 || len_c ~= length(msg) )
    ++fail;
    return
  end

  ## Compare original string with recv string
  msg_in = num2str(msg_c, '%c');
  if ( msg_in ~= msg )
    ++fail;
    return
  end

  disconnect(client);
  disconnect(server_data);
  disconnect(server);

endfunction

fail = dotest();
printf('Number of failures: %d\n', fail);
