github.com/LQR471814/websocket-ftp/server@v0.4.0/server_test.go (about) 1 package server 2 3 import ( 4 "bytes" 5 "crypto/rand" 6 "io/ioutil" 7 "log" 8 "math" 9 "net" 10 "os" 11 "os/exec" 12 "strings" 13 "testing" 14 ) 15 16 type TestFile struct { 17 name string 18 data []byte 19 recvdata []byte 20 } 21 22 type TestHooks struct { 23 files []*TestFile 24 choice bool 25 } 26 27 func (h TestHooks) OnTransferRequest(t *Transfer) chan bool { 28 log.Println("Got requests", t.Data.Files) 29 c := make(chan bool, 1) 30 c <- h.choice 31 return c 32 } 33 34 func (h TestHooks) OnTransferUpdate(t *Transfer) { 35 log.Println( 36 "Progress", 37 t.State.Received, 38 "/", 39 t.Data.Files[t.State.CurrentFile].Size, 40 ) 41 } 42 43 func (h TestHooks) OnTransferComplete(t *Transfer, f File) { 44 log.Println("Transfer complete ->", t.Data, f) 45 for _, r := range h.files { 46 if strings.Contains(r.name, f.Name) { 47 log.Println("File", f.Name, "has been transferred") 48 r.recvdata = t.Output[f.ID()].(*bytes.Buffer).Bytes() 49 } 50 } 51 } 52 53 func (h TestHooks) OnAllTransfersComplete(t *Transfer) { 54 log.Println("Transfer", t.ID, "is complete") 55 } 56 57 func AssertEqualBytes(name string, b1 []byte, b2 []byte, t *testing.T) { 58 if !bytes.Equal(b1, b2) { 59 const cutoff = 16 60 61 if len(b1) > cutoff { 62 b1 = b1[:cutoff] 63 } 64 65 if len(b2) > cutoff { 66 b2 = b2[:cutoff] 67 } 68 69 t.Errorf( 70 "Transferred result is not equivalent to source!"+ 71 "\nFile %v Source: %v != Destination: %v", 72 name, b1, b2, 73 ) 74 } 75 } 76 77 func RunClient(ip string, files []*TestFile) { 78 argFiles := []string{} 79 for _, f := range files { 80 argFiles = append(argFiles, "--files") 81 argFiles = append(argFiles, f.name) 82 } 83 84 cmd := exec.Cmd{ 85 Path: "node", 86 Args: append([]string{ 87 "node", "./test_client/index.js", 88 "--url", "ws://127.0.0.1:3000", 89 }, argFiles...), 90 } 91 92 stdout, err := cmd.StdoutPipe() 93 if err != nil { 94 log.Fatal(err) 95 } 96 97 cmd.Stderr = cmd.Stdout 98 99 err = cmd.Start() 100 if err != nil { 101 log.Fatal(err) 102 } 103 104 for { 105 buff := make([]byte, 1024) 106 n, err := stdout.Read(buff) 107 if n > 0 { 108 log.Print("[Client] ", string(buff[:n])) 109 } 110 if err != nil { 111 break 112 } 113 } 114 } 115 116 func RunServer(ip string, files []*TestFile, choice bool) (*WSFTPServer, net.Listener) { 117 ln, err := net.Listen("tcp", ip) 118 if err != nil { 119 log.Fatal(err) 120 } 121 122 server := NewServer(ServerConfig{ 123 Handlers: TestHooks{files, choice}, 124 Verbose: true, 125 }) 126 127 go server.ServeWith(ln) 128 129 return server, ln 130 } 131 132 const generatedFilename = "test_files/TEST_LARGE.bin" 133 134 func GenerateLargeFile() { 135 f, err := os.Open(generatedFilename) 136 if err != nil { 137 f, err = os.Create(generatedFilename) 138 if err != nil { 139 log.Fatal(err) 140 } 141 142 buff := make([]byte, int(math.Pow(2, 27))) 143 rand.Read(buff) 144 145 _, err := f.Write(buff) 146 if err != nil { 147 log.Fatal(err) 148 } 149 } 150 f.Close() 151 } 152 153 func TestGeneric(t *testing.T) { 154 var err error 155 os.Chdir("..") 156 157 GenerateLargeFile() 158 159 testFiles := []*TestFile{ 160 {name: "test_files/TEST_FILE1.txt"}, 161 {name: "test_files/TEST_FILE2.jpg"}, 162 {name: "test_files/TEST_FILE3.flp"}, 163 {name: generatedFilename}, 164 } 165 166 for _, tf := range testFiles { 167 tf.recvdata = make([]byte, 0) 168 tf.data, err = ioutil.ReadFile(tf.name) 169 if err != nil { 170 log.Fatal(err) 171 } 172 } 173 174 server, ln := RunServer("127.0.0.1:3000", testFiles, false) 175 RunClient("ws://127.0.0.1:3000", testFiles) 176 server.Close() 177 ln.Close() 178 179 server, ln = RunServer("127.0.0.1:3000", testFiles, true) 180 RunClient("ws://127.0.0.1:3000", testFiles[0:1]) 181 RunClient("ws://127.0.0.1:3000", testFiles[1:]) 182 server.Close() 183 ln.Close() 184 185 for _, tf := range testFiles { 186 AssertEqualBytes(tf.name, tf.data, tf.recvdata, t) 187 } 188 }