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  }