|
@@ -4,13 +4,38 @@ import (
|
|
|
"flag"
|
|
|
"fmt"
|
|
|
|
|
|
+ "log"
|
|
|
"net"
|
|
|
"os"
|
|
|
- "strings"
|
|
|
"testing"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
+const KEEP_LOGS = true
|
|
|
+
|
|
|
+func clear_socket(socket net.Conn, t *testing.T) string {
|
|
|
+ // Clear out the data that's pending in the socket.
|
|
|
+
|
|
|
+ buffer := make([]byte, 1204)
|
|
|
+ var r int
|
|
|
+ var err error
|
|
|
+
|
|
|
+ err = socket.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
+ if err != nil {
|
|
|
+ t.Error("socket.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ r, err = socket.Read(buffer)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("socket.Read: %#v", err)
|
|
|
+ }
|
|
|
+ // t.Errorf("Buffer : %#v\n", buffer[:r])
|
|
|
+ err = socket.SetReadDeadline(time.Time{})
|
|
|
+ if err != nil {
|
|
|
+ t.Error("socket.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ return string(buffer[:r])
|
|
|
+}
|
|
|
+
|
|
|
func TestDoorInputConnection(t *testing.T) {
|
|
|
var tmpFile *os.File
|
|
|
var err error
|
|
@@ -20,7 +45,11 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
// Remember to clean up the file afterwards
|
|
|
- defer os.Remove(tmpFile.Name())
|
|
|
+ if !KEEP_LOGS {
|
|
|
+ defer os.Remove(tmpFile.Name())
|
|
|
+ } else {
|
|
|
+ t.Logf("See: %s\n", tmpFile.Name())
|
|
|
+ }
|
|
|
|
|
|
// establish network socket connection to set Comm_handle
|
|
|
var server, client net.Conn
|
|
@@ -73,8 +102,10 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
d.Init("input-test")
|
|
|
|
|
|
defer d.Close()
|
|
|
- // clean up logfile
|
|
|
- defer os.Remove("input-test-12.log")
|
|
|
+ // clean up logfile - (filename is from Init name + node #)
|
|
|
+ if !KEEP_LOGS {
|
|
|
+ defer os.Remove("input-test-12.log")
|
|
|
+ }
|
|
|
|
|
|
// Ok!
|
|
|
if !Unicode {
|
|
@@ -89,43 +120,55 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
t.Errorf("Height not 43: %d", Height)
|
|
|
}
|
|
|
|
|
|
- // These are the commands sent to detect ... throw this all away.
|
|
|
- buffer = make([]byte, 128)
|
|
|
- err = server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
- if err != nil {
|
|
|
- t.Error("server.SetReadDeadLine:", err)
|
|
|
- }
|
|
|
- _, err = server.Read(buffer)
|
|
|
- if err != nil {
|
|
|
- t.Errorf("server.Read: %#v", err)
|
|
|
- }
|
|
|
- // t.Errorf("Buffer : %#v\n", buffer[:r])
|
|
|
- err = server.SetReadDeadline(time.Time{})
|
|
|
- if err != nil {
|
|
|
- t.Error("server.SetReadDeadLine:", err)
|
|
|
+ clear_socket(server, t)
|
|
|
+ // This should all be received by above (I think)...
|
|
|
+ /*
|
|
|
+ // These are the commands sent to detect ... throw this all away.
|
|
|
+ buffer = make([]byte, 128)
|
|
|
+ err = server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
+ if err != nil {
|
|
|
+ t.Error("server.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ _, err = server.Read(buffer)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("server.Read: %#v", err)
|
|
|
+ }
|
|
|
+ // t.Errorf("Buffer : %#v\n", buffer[:r])
|
|
|
+ err = server.SetReadDeadline(time.Time{})
|
|
|
+ if err != nil {
|
|
|
+ t.Error("server.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ keytest := map[string][]rune{
|
|
|
+ "\x1b": []rune{0x1b},
|
|
|
+ "\x0d\x00": []rune{0x0d},
|
|
|
+ "\x0d\x0a": []rune{0x0d},
|
|
|
+ "\x0dCQ": []rune{0x0d, 'C', 'Q'},
|
|
|
+ "\x0dA": []rune{0x0d, 'A'},
|
|
|
+ "\x0dCAT": []rune{0x0d, 'C', 'A', 'T'},
|
|
|
}
|
|
|
|
|
|
- keytest := map[string][]int{
|
|
|
- "\x1b": []int{0x1b},
|
|
|
- "\x0d\x00": []int{0x0d},
|
|
|
- "\x0d\x0a": []int{0x0d},
|
|
|
- "\x0dCQ": []int{0x0d, 'C', 'Q'},
|
|
|
- "\x0dA": []int{0x0d, 'A'},
|
|
|
- "\x0dCAT": []int{0x0d, 'C', 'A', 'T'},
|
|
|
- "\x00\x50\x00\x48\x00\x4b\x00\x4d": []int{XKEY_DOWN_ARROW, XKEY_UP_ARROW, XKEY_LEFT_ARROW, XKEY_RIGHT_ARROW},
|
|
|
- "\x00\x47\x00\x4f\x00\x49\x00\x51": []int{XKEY_HOME, XKEY_END, XKEY_PGUP, XKEY_PGDN},
|
|
|
- "\x00\x3b\x00\x3c\x00\x3d\x00\x3e": []int{XKEY_F1, XKEY_F2, XKEY_F3, XKEY_F4},
|
|
|
- "\x00\x3f\x00\x40\x00\x41\x00\x42": []int{XKEY_F5, XKEY_F6, XKEY_F7, XKEY_F8},
|
|
|
- "\x00\x43\x00\x44\x00\x52\x00\x53": []int{XKEY_F9, XKEY_F10, XKEY_INSERT, XKEY_DELETE},
|
|
|
- "\x1b[A\x1b[B\x1b[C\x1b[D": []int{XKEY_UP_ARROW, XKEY_DOWN_ARROW, XKEY_RIGHT_ARROW, XKEY_LEFT_ARROW},
|
|
|
- "\x1b[H\x1b[F\x1b[K\x1b[V\x1b[U": []int{XKEY_HOME, XKEY_END, XKEY_END, XKEY_PGUP, XKEY_PGDN},
|
|
|
- "\x1b[5~\x1b[6~": []int{XKEY_PGUP, XKEY_PGDN},
|
|
|
- "\x1b[@\x1b[2~\x1b[3~": []int{XKEY_INSERT, XKEY_INSERT, XKEY_DELETE},
|
|
|
- "\x1bOP\x1bOQ\x1bOR\x1bOS": []int{XKEY_F1, XKEY_F2, XKEY_F3, XKEY_F4},
|
|
|
- "\x1b[15~\x1b[17~\x1b[18~\x1b[19~": []int{XKEY_F5, XKEY_F6, XKEY_F7, XKEY_F8},
|
|
|
- "\x1b[20~\x1b[21~\x1b[23~\x1b[24~": []int{XKEY_F9, XKEY_F10, XKEY_F11, XKEY_F12},
|
|
|
+ keyextest := map[string][]Extended{
|
|
|
+ "\x00\x50\x00\x48\x00\x4b\x00\x4d": []Extended{DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW},
|
|
|
+ "\x00\x47\x00\x4f\x00\x49\x00\x51": []Extended{HOME, END, PAGE_UP, PAGE_DOWN},
|
|
|
+ "\x00\x3b\x00\x3c\x00\x3d\x00\x3e": []Extended{F1, F2, F3, F4},
|
|
|
+ "\x00\x3f\x00\x40\x00\x41\x00\x42": []Extended{F5, F6, F7, F8},
|
|
|
+ "\x00\x43\x00\x44\x00\x52\x00\x53": []Extended{F9, F10, INSERT, DELETE},
|
|
|
+ "\x1b[A\x1b[B\x1b[C\x1b[D": []Extended{UP_ARROW, DOWN_ARROW, RIGHT_ARROW, LEFT_ARROW},
|
|
|
+ "\x1b[H\x1b[F\x1b[K\x1b[V\x1b[U": []Extended{HOME, END, END, PAGE_UP, PAGE_DOWN},
|
|
|
+ "\x1b[5~\x1b[6~": []Extended{PAGE_UP, PAGE_DOWN},
|
|
|
+ "\x1b[@\x1b[2~\x1b[3~": []Extended{INSERT, INSERT, DELETE},
|
|
|
+ "\x1bOP\x1bOQ\x1bOR\x1bOS": []Extended{F1, F2, F3, F4},
|
|
|
+ "\x1b[15~\x1b[17~\x1b[18~\x1b[19~": []Extended{F5, F6, F7, F8},
|
|
|
+ "\x1b[20~\x1b[21~\x1b[23~\x1b[24~": []Extended{F9, F10, F11, F12},
|
|
|
}
|
|
|
|
|
|
+ t.Logf("Starting keytest\n")
|
|
|
+
|
|
|
+ keyWait := time.Duration(50 * time.Millisecond)
|
|
|
+ // 5 * time.Second) //50 * time.Millisecond)
|
|
|
+
|
|
|
for send, get := range keytest {
|
|
|
var buffer []byte = []byte(send)
|
|
|
_, err = server.Write(buffer)
|
|
@@ -134,7 +177,7 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
}
|
|
|
time.Sleep(time.Millisecond)
|
|
|
|
|
|
- var recv []int = make([]int, 0)
|
|
|
+ var recv []rune = make([]rune, 0)
|
|
|
var retries int = 0
|
|
|
for {
|
|
|
// input := d.WaitKey(0, 50)
|
|
@@ -142,21 +185,35 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
// not getting all of the data we Write above.
|
|
|
// data shows up on next read.
|
|
|
// input := d.WaitKey(0, 100) // because we are retrying, reduce the wait time
|
|
|
- input := d.WaitKey(0, 50)
|
|
|
+ input, _, err := d.WaitKey(keyWait)
|
|
|
+ t.Logf(">> %#v, %#v\n", input, err)
|
|
|
|
|
|
- if input != -1 {
|
|
|
+ if err == nil {
|
|
|
recv = append(recv, input)
|
|
|
- } else {
|
|
|
+ // } else {
|
|
|
// sometimes, running test using local loopback takes awhile for the characters
|
|
|
// to arrive.
|
|
|
+ if len(recv) != len(get) {
|
|
|
+ continue
|
|
|
+ /*
|
|
|
+ if retries < 5 {
|
|
|
+ retries++
|
|
|
+ t.Logf("Retry %d want %d got %d\n", retries, len(get), len(recv))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ */
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ t.Logf("WaitKey Err: %#v\n", err)
|
|
|
if len(recv) != len(get) {
|
|
|
if retries < 5 {
|
|
|
retries++
|
|
|
t.Logf("Retry %d want %d got %d\n", retries, len(get), len(recv))
|
|
|
continue
|
|
|
}
|
|
|
+ break
|
|
|
}
|
|
|
- break
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -176,30 +233,104 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- buffer = make([]byte, 128)
|
|
|
- err = server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
- if err != nil {
|
|
|
- t.Error("server.SetReadDeadLine:", err)
|
|
|
- }
|
|
|
- r, err := server.Read(buffer)
|
|
|
- // input_test.go:131: server.Read: &net.OpError{Op:"read", Net:"tcp", Source:(*net.TCPAddr)(0xc000012f00), Addr:(*net.TCPAddr)(0xc000012f30), Err:(*poll.DeadlineExceededError)(0x6c39c0)}
|
|
|
- if !strings.Contains(err.Error(), "i/o timeout") {
|
|
|
- t.Errorf("Expected poll.DeadlineExceededError: %s / %#v", err.Error(), err)
|
|
|
- }
|
|
|
- if r != 0 {
|
|
|
- t.Errorf("Buffer After KeyTest: %#v\n", buffer[:r])
|
|
|
- }
|
|
|
- err = server.SetReadDeadline(time.Time{})
|
|
|
- if err != nil {
|
|
|
- t.Error("server.SetReadDeadLine:", err)
|
|
|
+ t.Logf("Starting keyextest\n")
|
|
|
+
|
|
|
+ for send, get := range keyextest {
|
|
|
+ var buffer []byte = []byte(send)
|
|
|
+ _, err = server.Write(buffer)
|
|
|
+ if err != nil {
|
|
|
+ t.Error("server.Write:", err)
|
|
|
+ }
|
|
|
+ time.Sleep(time.Millisecond)
|
|
|
+
|
|
|
+ var recv []Extended = make([]Extended, 0)
|
|
|
+ var retries int = 0
|
|
|
+ for {
|
|
|
+ // input := d.WaitKey(0, 50)
|
|
|
+ // running go test -count > 1 sometimes fails --
|
|
|
+ // not getting all of the data we Write above.
|
|
|
+ // data shows up on next read.
|
|
|
+ // input := d.WaitKey(0, 100) // because we are retrying, reduce the wait time
|
|
|
+ _, ex, err := d.WaitKey(keyWait)
|
|
|
+
|
|
|
+ if err == nil {
|
|
|
+ recv = append(recv, ex)
|
|
|
+
|
|
|
+ // sometimes, running test using local loopback takes awhile for the characters
|
|
|
+ // to arrive.
|
|
|
+ if len(recv) != len(get) {
|
|
|
+ continue
|
|
|
+ /*
|
|
|
+ if retries < 5 {
|
|
|
+ retries++
|
|
|
+ t.Logf("Retry %d want %d got %d\n", retries, len(get), len(recv))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ */
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ t.Logf("WaitKey err: #%v\n", err)
|
|
|
+ if len(recv) != len(get) {
|
|
|
+ if retries < 5 {
|
|
|
+ retries++
|
|
|
+ t.Logf("Retry %d want %d got %d\n", retries, len(get), len(recv))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ break
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(recv) != len(get) {
|
|
|
+ t.Errorf("Send %#v, LEN expected %#v, got %#v", send, get, recv)
|
|
|
+ } else {
|
|
|
+ matches := true
|
|
|
+ for idx, i := range get {
|
|
|
+ if recv[idx] != i {
|
|
|
+ matches = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !matches {
|
|
|
+ t.Errorf("Send %#v, MATCH expected %#v, got %#v", send, get, recv)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- timeout := d.WaitKey(0, 50)
|
|
|
- if timeout != -1 {
|
|
|
+
|
|
|
+ clear_socket(server, t)
|
|
|
+
|
|
|
+ /*
|
|
|
+ buffer = make([]byte, 128)
|
|
|
+ err = server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
+ if err != nil {
|
|
|
+ t.Error("server.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ r, err := server.Read(buffer)
|
|
|
+ // input_test.go:131: server.Read: &net.OpError{Op:"read", Net:"tcp", Source:(*net.TCPAddr)(0xc000012f00), Addr:(*net.TCPAddr)(0xc000012f30), Err:(*poll.DeadlineExceededError)(0x6c39c0)}
|
|
|
+ if !strings.Contains(err.Error(), "i/o timeout") {
|
|
|
+ t.Errorf("Expected poll.DeadlineExceededError: %s / %#v", err.Error(), err)
|
|
|
+ }
|
|
|
+ if r != 0 {
|
|
|
+ t.Errorf("Buffer After KeyTest: %#v\n", buffer[:r])
|
|
|
+ }
|
|
|
+ err = server.SetReadDeadline(time.Time{})
|
|
|
+ if err != nil {
|
|
|
+ t.Error("server.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ t.Logf("Starting WaitKey timeout...\n")
|
|
|
+ _, _, timeout := d.WaitKey(keyWait)
|
|
|
+ if timeout == nil {
|
|
|
t.Errorf("Expected timeout, got %d / %X", timeout, timeout)
|
|
|
} else {
|
|
|
t.Logf("Ok! Buffer should be empty! -1 (timeout)")
|
|
|
}
|
|
|
|
|
|
+ t.Logf("Starting input test\n")
|
|
|
// Input test
|
|
|
buffer = []byte("1234567890\r")
|
|
|
_, err = server.Write(buffer)
|
|
@@ -214,17 +345,26 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
t.Errorf("Expected Input(5) = 12345, but got %#v", input)
|
|
|
}
|
|
|
|
|
|
+ // What's a good way to clear out the receive buffer here??
|
|
|
+
|
|
|
// I'm not sure what they extra characters are in the buffer here.
|
|
|
- buffer = make([]byte, 128)
|
|
|
- err = server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
- if err != nil {
|
|
|
- t.Error("server.SetReadDeadLine:", err)
|
|
|
- }
|
|
|
- r, err = server.Read(buffer)
|
|
|
- if err != nil {
|
|
|
- t.Errorf("server.Read: %#v", err)
|
|
|
- }
|
|
|
- var result string = string(buffer[:r])
|
|
|
+ var result string = clear_socket(server, t)
|
|
|
+
|
|
|
+ /*
|
|
|
+ buffer = make([]byte, 128)
|
|
|
+ err = server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
|
|
|
+ if err != nil {
|
|
|
+ t.Error("server.SetReadDeadLine:", err)
|
|
|
+ }
|
|
|
+ var r int
|
|
|
+
|
|
|
+ r, err = server.Read(buffer)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("server.Read: %#v", err)
|
|
|
+ }
|
|
|
+ var result string = string(buffer[:r])
|
|
|
+ */
|
|
|
+
|
|
|
expected := " \x08\x08\x08\x08\x0812345\x07\x07\x07\x07\x07"
|
|
|
if result != expected {
|
|
|
t.Errorf("Buffer Input(5): Expected %#v, got %#v\n", expected, result)
|
|
@@ -260,11 +400,16 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
t.Errorf("Expected Input(5) = 98765, but got %#v", input)
|
|
|
}
|
|
|
|
|
|
+ t.Logf("server close")
|
|
|
+ log.Println("server close")
|
|
|
+
|
|
|
server.Close()
|
|
|
|
|
|
- var hungup int = d.WaitKey(1, 0)
|
|
|
- if hungup != -2 {
|
|
|
- t.Errorf("Expected -2 (hangup), got %d", hungup)
|
|
|
+ time.Sleep(time.Millisecond)
|
|
|
+
|
|
|
+ _, _, err = d.WaitKey(keyWait)
|
|
|
+ if err != ErrDisconnected {
|
|
|
+ t.Errorf("Expected ErrDisconnected, got %#v", err)
|
|
|
}
|
|
|
|
|
|
if !d.Disconnect() {
|
|
@@ -277,24 +422,27 @@ func TestDoorInputConnection(t *testing.T) {
|
|
|
}
|
|
|
*/
|
|
|
|
|
|
- hungup = d.GetKey()
|
|
|
+ _, err = d.ReadRune() // GetKey()
|
|
|
|
|
|
- if hungup != -2 {
|
|
|
- t.Errorf("Expected -2 (hangup), got %d", hungup)
|
|
|
+ if err != ErrDisconnected {
|
|
|
+ t.Errorf("Expected ErrDisconnected, got %#v", err)
|
|
|
}
|
|
|
+
|
|
|
+ t.Logf("client close")
|
|
|
client.Close()
|
|
|
time.Sleep(time.Millisecond)
|
|
|
|
|
|
+ t.Logf("Input on closed server and client")
|
|
|
var blank string = d.Input(5)
|
|
|
|
|
|
if blank != "" {
|
|
|
t.Errorf("Input should return blank (hangup).")
|
|
|
}
|
|
|
|
|
|
- hungup = d.getch()
|
|
|
+ _, err = d.ReadRune() // getch()
|
|
|
|
|
|
- if hungup != -2 {
|
|
|
- t.Errorf("Expected -2 (hangup), got %d", hungup)
|
|
|
+ if err != ErrDisconnected {
|
|
|
+ t.Errorf("Expected ErrDisconnected, got %#v", err)
|
|
|
}
|
|
|
|
|
|
d.Write("\x00")
|