github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/frame/frame_test.go (about)

     1  package frame
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"fmt"
     7  	"io"
     8  	"math/rand"
     9  	"net"
    10  	"os"
    11  	"sync"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/codingeasygo/util/xdebug"
    16  	"github.com/codingeasygo/util/xio"
    17  )
    18  
    19  type deadlineRWC struct {
    20  	io.ReadWriter
    21  }
    22  
    23  func (d *deadlineRWC) SetReadDeadline(t time.Time) error {
    24  	return nil
    25  }
    26  
    27  func (d *deadlineRWC) SetWriteDeadline(t time.Time) error {
    28  	return nil
    29  }
    30  
    31  func (d *deadlineRWC) Close() (err error) {
    32  	if c, ok := d.ReadWriter.(io.Closer); ok {
    33  		err = c.Close()
    34  	}
    35  	return
    36  }
    37  
    38  func TestReadWrite(t *testing.T) {
    39  	tester := xdebug.CaseTester{
    40  		0:  1,
    41  		11: 1,
    42  	}
    43  	//
    44  	if tester.Run() { //one frame 8
    45  		data1 := []byte("one")
    46  		buf := make([]byte, 1+len(data1))
    47  		buf[0] = byte(len(data1) + 1)
    48  		copy(buf[1:], data1)
    49  		raw := bytes.NewBuffer(buf)
    50  		proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024)
    51  		proc.SetTimeout(time.Second)
    52  		proc.SetLengthFieldLength(1)
    53  		proc.SetDataOffset(1)
    54  		f, err := proc.ReadFrame()
    55  		if err != nil || !bytes.Equal(f[1:], data1) {
    56  			t.Error(err)
    57  			return
    58  		}
    59  		_, err = proc.ReadFrame()
    60  		if err != io.EOF {
    61  			t.Error(err)
    62  			return
    63  		}
    64  	}
    65  	if tester.Run() { //one frame 16
    66  		data1 := []byte("one")
    67  		buf := make([]byte, 2+len(data1))
    68  		binary.BigEndian.PutUint16(buf, uint16(2+len(data1)))
    69  		copy(buf[2:], data1)
    70  		raw := bytes.NewBuffer(buf)
    71  		proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024)
    72  		proc.SetTimeout(time.Second)
    73  		proc.SetLengthFieldLength(2)
    74  		proc.SetLengthFieldMagic(0)
    75  		f, err := proc.ReadFrame()
    76  		if err != nil || !bytes.Equal(f[2:], data1) {
    77  			t.Error(err)
    78  			return
    79  		}
    80  		_, err = proc.ReadFrame()
    81  		if err != io.EOF {
    82  			t.Error(err)
    83  			return
    84  		}
    85  	}
    86  	if tester.Run() { //one frame 32
    87  		data1 := []byte("one")
    88  		buf := make([]byte, 4+len(data1))
    89  		binary.BigEndian.PutUint32(buf, uint32(4+len(data1)))
    90  		copy(buf[4:], data1)
    91  		raw := bytes.NewBuffer(buf)
    92  		proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024)
    93  		proc.SetLengthFieldMagic(1)
    94  		proc.SetTimeout(time.Second)
    95  		f, err := proc.ReadFrame()
    96  		if err != nil || !bytes.Equal(f[4:], data1) {
    97  			t.Error(err)
    98  			return
    99  		}
   100  		_, err = proc.ReadFrame()
   101  		if err != io.EOF {
   102  			t.Error(err)
   103  			return
   104  		}
   105  	}
   106  	if tester.Run() { //one frame splice
   107  		data1 := []byte("one")
   108  		r, w, _ := os.Pipe()
   109  		wait := sync.WaitGroup{}
   110  		wait.Add(1)
   111  		go func() {
   112  			proc := NewReadWriteCloser(nil, &deadlineRWC{ReadWriter: r}, 256*1024)
   113  			proc.SetLengthFieldMagic(1)
   114  			proc.SetTimeout(time.Second)
   115  			f, err := proc.ReadFrame()
   116  			if err != nil || !bytes.Equal(f[4:], data1) {
   117  				t.Error(err)
   118  				return
   119  			}
   120  			_, err = proc.ReadFrame()
   121  			if err != io.EOF {
   122  				t.Error(err)
   123  				return
   124  			}
   125  			wait.Done()
   126  		}()
   127  		buf := make([]byte, uint32(4+len(data1)))
   128  		binary.BigEndian.PutUint32(buf, uint32(4+len(data1)))
   129  		copy(buf[4:], data1)
   130  		w.Write(buf[0:3])
   131  		time.Sleep(time.Millisecond)
   132  		w.Write(buf[3:])
   133  		time.Sleep(time.Millisecond)
   134  		w.Close()
   135  		time.Sleep(time.Millisecond)
   136  		wait.Wait()
   137  	}
   138  	//
   139  	if tester.Run() { //two frame
   140  		data1 := []byte("two1")
   141  		data2 := []byte("two2")
   142  		buf := make([]byte, 8+len(data1)+len(data2))
   143  		binary.BigEndian.PutUint32(buf, uint32(4+len(data1)))
   144  		copy(buf[4:], data1)
   145  		binary.BigEndian.PutUint32(buf[4+len(data1):], uint32(4+len(data2)))
   146  		copy(buf[8+len(data1):], data2)
   147  		raw := bytes.NewBuffer(buf)
   148  		//
   149  		proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024)
   150  		proc.SetLengthFieldMagic(1)
   151  		proc.SetTimeout(time.Second)
   152  		f, err := proc.ReadFrame()
   153  		if err != nil || !bytes.Equal(f[4:], data1) {
   154  			t.Error(err)
   155  			return
   156  		}
   157  		f, err = proc.ReadFrame()
   158  		if err != nil || !bytes.Equal(f[4:], data2) {
   159  			t.Error(err)
   160  			return
   161  		}
   162  		_, err = proc.ReadFrame()
   163  		if err != io.EOF {
   164  			t.Error(err)
   165  			return
   166  		}
   167  	}
   168  	//
   169  	if tester.Run() { //two frame splice
   170  		data1 := []byte("splice1")
   171  		data2 := []byte("splice2")
   172  		r, w, _ := os.Pipe()
   173  		wait := sync.WaitGroup{}
   174  		wait.Add(1)
   175  		go func() {
   176  			proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: r}, 256*1024)
   177  			proc.SetLengthFieldMagic(1)
   178  			proc.SetTimeout(time.Second)
   179  			f, err := proc.ReadFrame()
   180  			if err != nil || !bytes.Equal(f[4:], data1) {
   181  				t.Error(err)
   182  				return
   183  			}
   184  			f, err = proc.ReadFrame()
   185  			if err != nil || !bytes.Equal(f[4:], data2) {
   186  				t.Error(err)
   187  				return
   188  			}
   189  			_, err = proc.ReadFrame()
   190  			if err != io.EOF {
   191  				t.Error(err)
   192  				return
   193  			}
   194  			wait.Done()
   195  		}()
   196  		buf := make([]byte, 1024)
   197  		binary.BigEndian.PutUint32(buf, uint32(4+len(data1)))
   198  		copy(buf[4:], data1)
   199  		binary.BigEndian.PutUint32(buf[4+len(data1):], uint32(4+len(data2)))
   200  		copy(buf[8+len(data1):], data2[:1])
   201  		w.Write(buf[:8+len(data1)+1])
   202  		time.Sleep(time.Millisecond)
   203  		w.Write(data2[1:])
   204  		time.Sleep(time.Millisecond)
   205  		w.Close()
   206  		time.Sleep(time.Millisecond)
   207  		wait.Wait()
   208  	}
   209  	//
   210  	if tester.Run() { //two frame splice 2
   211  		data1 := []byte("splice1")
   212  		data2 := []byte("splice2")
   213  		r, w, _ := os.Pipe()
   214  		wait := sync.WaitGroup{}
   215  		wait.Add(1)
   216  		go func() {
   217  			proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: r}, 256*1024)
   218  			proc.SetLengthFieldMagic(1)
   219  			proc.SetTimeout(time.Second)
   220  			f, err := proc.ReadFrame()
   221  			if err != nil || !bytes.Equal(f[4:], data1) {
   222  				t.Error(err)
   223  				return
   224  			}
   225  			f, err = proc.ReadFrame()
   226  			if err != nil || !bytes.Equal(f[4:], data2) {
   227  				t.Error(err)
   228  				return
   229  			}
   230  			_, err = proc.ReadFrame()
   231  			if err != io.EOF {
   232  				t.Error(err)
   233  				return
   234  			}
   235  			wait.Done()
   236  		}()
   237  		buf := make([]byte, 1024)
   238  		binary.BigEndian.PutUint32(buf, uint32(4+len(data1)))
   239  		copy(buf[4:], data1)
   240  		binary.BigEndian.PutUint32(buf[4+len(data1):], uint32(4+len(data2)))
   241  		copy(buf[8+len(data1):], data2)
   242  		w.Write(buf[:4+len(data1)+3])
   243  		time.Sleep(time.Millisecond)
   244  		w.Write(buf[4+len(data1)+3 : 4+len(data1)+4+len(data2)])
   245  		time.Sleep(time.Millisecond)
   246  		w.Close()
   247  		time.Sleep(time.Millisecond)
   248  		wait.Wait()
   249  	}
   250  	if tester.Run() { //test frame read write 8
   251  		r, w, _ := os.Pipe()
   252  		reader := NewReader(r, 1024)
   253  		reader.SetLengthFieldLength(1)
   254  		reader.SetLengthFieldMagic(0)
   255  		writer := NewWriter(&deadlineRWC{ReadWriter: w})
   256  		writer.SetWriteTimeout(time.Second)
   257  		writer.SetLengthFieldLength(1)
   258  		writer.SetLengthFieldMagic(0)
   259  		readed := bytes.NewBuffer(nil)
   260  		waiter := make(chan int, 1)
   261  		go func() {
   262  			io.Copy(readed, reader)
   263  			waiter <- 1
   264  		}()
   265  		writed := bytes.NewBuffer(nil)
   266  		count := rand.Intn(10) + 1
   267  		for i := 0; i < count; i++ {
   268  			fmt.Fprintf(writer, "data-%v\n", i)
   269  			fmt.Fprintf(writed, "data-%v\n", i)
   270  		}
   271  		w.Close()
   272  		<-waiter
   273  		if !bytes.Equal(readed.Bytes(), writed.Bytes()) {
   274  			fmt.Printf("readed:\n%v\n", (readed.Bytes()))
   275  			fmt.Printf("writed:\n%v\n", (writed.Bytes()))
   276  			t.Error("error")
   277  			return
   278  		}
   279  	}
   280  	if tester.Run() { //test frame read write 16
   281  		r, w, _ := os.Pipe()
   282  		reader := NewReader(r, 1024)
   283  		reader.SetLengthFieldLength(2)
   284  		reader.SetLengthFieldMagic(0)
   285  		writer := NewWriter(&deadlineRWC{ReadWriter: w})
   286  		writer.SetWriteTimeout(time.Second)
   287  		writer.SetLengthFieldLength(2)
   288  		writer.SetLengthFieldMagic(0)
   289  		readed := bytes.NewBuffer(nil)
   290  		waiter := make(chan int, 1)
   291  		go func() {
   292  			io.Copy(readed, reader)
   293  			waiter <- 1
   294  		}()
   295  		writed := bytes.NewBuffer(nil)
   296  		count := rand.Intn(10) + 1
   297  		for i := 0; i < count; i++ {
   298  			fmt.Fprintf(writer, "data-%v\n", i)
   299  			fmt.Fprintf(writed, "data-%v\n", i)
   300  		}
   301  		w.Close()
   302  		<-waiter
   303  		if !bytes.Equal(readed.Bytes(), writed.Bytes()) {
   304  			fmt.Printf("readed:\n%v\n", (readed.Bytes()))
   305  			fmt.Printf("writed:\n%v\n", (writed.Bytes()))
   306  			t.Error("error")
   307  			return
   308  		}
   309  	}
   310  	if tester.Run() { //test copy read
   311  		r, w, _ := os.Pipe()
   312  		reader := NewReader(r, 1024)
   313  		reader.SetLengthFieldMagic(1)
   314  		writer := NewWriter(&deadlineRWC{ReadWriter: w})
   315  		writer.SetLengthFieldMagic(1)
   316  		writer.SetWriteTimeout(time.Second)
   317  		readed := bytes.NewBuffer(nil)
   318  		waiter := make(chan int, 1)
   319  		go func() {
   320  			buf := make([]byte, 1024)
   321  			for {
   322  				n, err := reader.Read(buf)
   323  				if err != nil {
   324  					break
   325  				}
   326  				readed.Write(buf[0:n])
   327  			}
   328  			io.Copy(readed, reader)
   329  			waiter <- 1
   330  		}()
   331  		writed := bytes.NewBuffer(nil)
   332  		count := rand.Intn(10) + 1
   333  		for i := 0; i < count; i++ {
   334  			fmt.Fprintf(writer, "data-%v\n", i)
   335  			fmt.Fprintf(writed, "data-%v\n", i)
   336  		}
   337  		w.Close()
   338  		<-waiter
   339  		if !bytes.Equal(readed.Bytes(), writed.Bytes()) {
   340  			fmt.Printf("readed:\n%v\n", (readed.Bytes()))
   341  			fmt.Printf("writed:\n%v\n", (writed.Bytes()))
   342  			t.Error("error")
   343  			return
   344  		}
   345  	}
   346  	if tester.Run() { //test copy write to
   347  		r, w, _ := os.Pipe()
   348  		reader := NewReader(r, 1024)
   349  		reader.SetLengthFieldMagic(1)
   350  		writer := NewWriter(&deadlineRWC{ReadWriter: w})
   351  		writer.SetLengthFieldMagic(1)
   352  		writer.SetWriteTimeout(time.Second)
   353  		readed := bytes.NewBuffer(nil)
   354  		waiter := make(chan int, 1)
   355  		go func() {
   356  			io.Copy(readed, reader)
   357  			waiter <- 1
   358  		}()
   359  		writed := bytes.NewBuffer(nil)
   360  		count := rand.Intn(10) + 1
   361  		for i := 0; i < count; i++ {
   362  			fmt.Fprintf(writer, "data-%v\n", i)
   363  			fmt.Fprintf(writed, "data-%v\n", i)
   364  		}
   365  		w.Close()
   366  		<-waiter
   367  		if !bytes.Equal(readed.Bytes(), writed.Bytes()) {
   368  			fmt.Printf("readed:\n%v\n", (readed.Bytes()))
   369  			fmt.Printf("writed:\n%v\n", (writed.Bytes()))
   370  			t.Error("error")
   371  			return
   372  		}
   373  	}
   374  	if tester.Run() { //test copy write
   375  		cr, cw, _ := os.Pipe()
   376  		sr, sw, _ := os.Pipe()
   377  		reader := NewReader(cr, 1024)
   378  		reader.SetLengthFieldMagic(1)
   379  		writer := NewWriter(&deadlineRWC{ReadWriter: cw})
   380  		writer.SetLengthFieldMagic(1)
   381  		writer.SetWriteTimeout(time.Second)
   382  		readed := bytes.NewBuffer(nil)
   383  		waiter := make(chan int, 1)
   384  		go func() {
   385  			io.Copy(writer, sr)
   386  			waiter <- 1
   387  		}()
   388  		go func() {
   389  			io.Copy(readed, reader)
   390  			waiter <- 1
   391  		}()
   392  		writed := bytes.NewBuffer(nil)
   393  		count := rand.Intn(10) + 1
   394  		for i := 0; i < count; i++ {
   395  			fmt.Fprintf(sw, "data-%v\n", i)
   396  			fmt.Fprintf(writed, "data-%v\n", i)
   397  		}
   398  		time.Sleep(500 * time.Millisecond)
   399  		sw.Close()
   400  		<-waiter
   401  		if !bytes.Equal(readed.Bytes(), writed.Bytes()) {
   402  			fmt.Printf("readed:\n%v\n", (readed.Bytes()))
   403  			fmt.Printf("writed:\n%v\n", (writed.Bytes()))
   404  			t.Error("error")
   405  			return
   406  		}
   407  	}
   408  	if tester.Run() { //test too large
   409  		buf := make([]byte, 1024)
   410  		binary.BigEndian.PutUint32(buf, 1000000)
   411  		proc := NewReadWriter(nil, bytes.NewBuffer(buf), 1024)
   412  		_, err := proc.ReadFrame()
   413  		if err == nil {
   414  			t.Error(err)
   415  			return
   416  		}
   417  	}
   418  	if tester.Run() { //test frame header invalid
   419  		buf := make([]byte, 1024)
   420  		proc := NewReadWriter(nil, bytes.NewBuffer(buf), 1024)
   421  		_, err := proc.ReadFrame()
   422  		if err == nil {
   423  			t.Error(err)
   424  			return
   425  		}
   426  	}
   427  	if tester.Run() { //for cover
   428  		NewReadWriter(nil, nil, 1024).GetByteOrder()
   429  		NewReadWriter(nil, nil, 1024).SetByteOrder(binary.BigEndian)
   430  		NewReadWriter(nil, nil, 1024).GetLengthFieldMagic()
   431  		NewReadWriter(nil, nil, 1024).SetLengthFieldMagic(1)
   432  		NewReadWriter(nil, nil, 1024).GetLengthFieldOffset()
   433  		NewReadWriter(nil, nil, 1024).SetLengthFieldOffset(1)
   434  		NewReadWriter(nil, nil, 1024).GetLengthFieldLength()
   435  		NewReadWriter(nil, nil, 1024).SetLengthFieldLength(1)
   436  		NewReadWriter(nil, nil, 1024).GetLengthAdjustment()
   437  		NewReadWriter(nil, nil, 1024).SetLengthAdjustment(1)
   438  		NewReadWriter(nil, nil, 1024).BufferSize()
   439  	}
   440  	if tester.Run() { //test close
   441  		NewReadWriteCloser(nil, &net.TCPConn{}, 1024).Close()
   442  	}
   443  	if tester.Run() { //test string
   444  		fmt.Printf("%v\n", NewReader(bytes.NewBuffer(nil), 1024))
   445  		fmt.Printf("%v\n", NewWriter(bytes.NewBuffer(nil)))
   446  		fmt.Printf("%v\n", NewReadWriteCloser(nil, nil, 1024))
   447  	}
   448  }
   449  
   450  func TestPiper(t *testing.T) {
   451  	piper := NewBasePiper(xio.PiperF(func(conn io.ReadWriteCloser, target string) (err error) {
   452  		err = fmt.Errorf("error")
   453  		return
   454  	}), 1024)
   455  	piper.PipeConn(nil, "target")
   456  	piper.Close()
   457  }
   458  
   459  func TestRaw(t *testing.T) {
   460  	tester := xdebug.CaseTester{
   461  		0: 0,
   462  		3: 1,
   463  	}
   464  	if tester.Run() { //read/write frame
   465  		r, w, _ := os.Pipe()
   466  		reader := NewReader(r, DefaultBufferSize)
   467  		writer := NewWriter(w)
   468  		go func() {
   469  			buffer := bytes.NewBufferString("abc")
   470  			src := NewRawReadWriter(nil, &deadlineRWC{ReadWriter: buffer}, DefaultBufferSize)
   471  			src.SetTimeout(time.Second)
   472  			frame, err := src.ReadFrame()
   473  			if err != nil {
   474  				t.Error(err)
   475  				return
   476  			}
   477  			_, err = writer.WriteFrame(frame)
   478  			if err != nil {
   479  				t.Error(err)
   480  				return
   481  			}
   482  			src.Close()
   483  		}()
   484  		buffer := bytes.NewBuffer(nil)
   485  		dst := NewRawReadWriteCloser(nil, &deadlineRWC{ReadWriter: buffer}, DefaultBufferSize)
   486  		dst.SetTimeout(time.Second)
   487  		frame, err := reader.ReadFrame()
   488  		if err != nil {
   489  			t.Error(err)
   490  			return
   491  		}
   492  		_, err = dst.WriteFrame(frame)
   493  		if err != nil {
   494  			t.Error(err)
   495  			return
   496  		}
   497  		if buffer.String() != "abc" {
   498  			t.Error("error")
   499  			return
   500  		}
   501  		dst.Close()
   502  	}
   503  	if tester.Run() { //read/write from
   504  		src := NewRawReadWriteCloser(nil, &deadlineRWC{ReadWriter: bytes.NewBufferString("abc")}, DefaultBufferSize)
   505  		src.SetReadTimeout(time.Second)
   506  		src.WriteTo(os.Stdout)
   507  
   508  		dst := NewRawWrapWriter(&deadlineRWC{ReadWriter: os.Stdout})
   509  		dst.SetWriteTimeout(time.Second)
   510  		dst.ReadFrom(bytes.NewBufferString("abc"))
   511  
   512  		fmt.Printf("src->%v\n", src)
   513  		fmt.Printf("dst->%v\n", dst)
   514  
   515  		src.BufferSize()
   516  	}
   517  	if tester.Run() { //read placeholder
   518  		src := NewRawReadWriteCloser(nil, &deadlineRWC{ReadWriter: bytes.NewBufferString("abc")}, DefaultBufferSize)
   519  		src.SetDataPrefix([]byte("123"))
   520  		frame, err := src.ReadFrame()
   521  		if err != nil || string(frame[src.GetDataOffset():]) != "123abc" {
   522  			t.Errorf("%v", err)
   523  			return
   524  		}
   525  	}
   526  }
   527  
   528  func TestPass(t *testing.T) {
   529  	tester := xdebug.CaseTester{
   530  		0: 1,
   531  		9: 1,
   532  	}
   533  	if tester.Run() {
   534  		buffer := bytes.NewBuffer(nil)
   535  		wrapper := NewPassWriter(buffer, 1024)
   536  		writer := NewBaseWriter(wrapper)
   537  		n, err := writer.Write([]byte("abc"))
   538  		if err != nil || wrapper.length > 0 || buffer.String() != "abc" {
   539  			t.Errorf("%v,%v", err, n)
   540  			return
   541  		}
   542  	}
   543  	if tester.Run() {
   544  		buffer := bytes.NewBuffer(nil)
   545  		wrapper := NewPassWriter(buffer, 1024)
   546  		wrapper.Write([]byte{0})
   547  		wrapper.Write([]byte{0, 0, 7})
   548  		wrapper.Write([]byte{97, 98, 99})
   549  		if wrapper.length > 0 || buffer.String() != "abc" {
   550  			t.Errorf("%v,%v", wrapper.length, buffer)
   551  			return
   552  		}
   553  	}
   554  	if tester.Run() {
   555  		buffer := bytes.NewBuffer(nil)
   556  		wrapper := NewPassWriter(buffer, 1024)
   557  		wrapper.Write([]byte{0})
   558  		wrapper.Write([]byte{0, 0})
   559  		wrapper.Write([]byte{7})
   560  		wrapper.Write([]byte{97, 98, 99})
   561  		if wrapper.length > 0 || buffer.String() != "abc" {
   562  			t.Errorf("%v,%v", wrapper.length, buffer)
   563  			return
   564  		}
   565  	}
   566  	if tester.Run() {
   567  		buffer := bytes.NewBuffer(nil)
   568  		wrapper := NewPassWriter(buffer, 1024)
   569  		wrapper.Write([]byte{0, 0, 0, 7})
   570  		wrapper.Write([]byte{97, 98, 99})
   571  		if wrapper.length > 0 || buffer.String() != "abc" {
   572  			t.Errorf("%v,%v", wrapper.length, buffer)
   573  			return
   574  		}
   575  	}
   576  	if tester.Run() {
   577  		buffer := bytes.NewBuffer(nil)
   578  		wrapper := NewPassWriter(buffer, 1024)
   579  		wrapper.Write([]byte{0, 0, 0, 7, 97})
   580  		wrapper.Write([]byte{98, 99})
   581  		if wrapper.length > 0 || buffer.String() != "abc" {
   582  			t.Errorf("%v,%v", wrapper.length, buffer)
   583  			return
   584  		}
   585  	}
   586  	if tester.Run() {
   587  		buffer := bytes.NewBuffer(nil)
   588  		wrapper := NewPassWriter(buffer, 1024)
   589  		wrapper.Write([]byte{0, 0, 0, 7, 97})
   590  		wrapper.Write([]byte{98})
   591  		wrapper.Write([]byte{99})
   592  		if wrapper.length > 0 || buffer.String() != "abc" {
   593  			t.Errorf("%v,%v", wrapper.length, buffer)
   594  			return
   595  		}
   596  	}
   597  	if tester.Run() {
   598  		buffer := bytes.NewBuffer(nil)
   599  		wrapper := NewPassWriter(buffer, 1024)
   600  		wrapper.Write([]byte{0, 0, 0, 7, 97, 98, 99, 0, 0})
   601  		wrapper.Write([]byte{0, 7, 97, 98, 99})
   602  		if wrapper.length > 0 || buffer.String() != "abcabc" {
   603  			t.Errorf("%v,%v", wrapper.length, buffer)
   604  			return
   605  		}
   606  	}
   607  	if tester.Run() {
   608  		buffer := bytes.NewBuffer(nil)
   609  		wrapper := NewPassWriter(buffer, 1024)
   610  		wrapper.Write([]byte{0, 0, 0, 7, 97, 98, 99, 0, 0, 0, 7, 97, 98, 99})
   611  		if wrapper.length > 0 || buffer.String() != "abcabc" {
   612  			t.Errorf("%v,%v", wrapper.length, buffer)
   613  			return
   614  		}
   615  	}
   616  	if tester.Run() {
   617  		buffer := make([]byte, 1024)
   618  		data := bytes.NewBuffer([]byte("abc"))
   619  		wrapper := NewPassReader(data)
   620  		reader := NewBaseReader(wrapper, 1024)
   621  		n, err := reader.Read(buffer)
   622  		if err != nil || string(buffer[0:n]) != "abc" {
   623  			t.Errorf("%v,%v", err, n)
   624  			return
   625  		}
   626  		wrapper.Close()
   627  		NewPassReadCloser(NewRawReadWriteCloser(nil, nil, 1024))
   628  		wrapper = NewPassReader(NewRawReadWriteCloser(nil, nil, 1024))
   629  		wrapper.Close()
   630  	}
   631  	//
   632  	//test error
   633  	if tester.Run() {
   634  		buffer := bytes.NewBuffer(nil)
   635  		wrapper := NewPassWriter(buffer, 1024)
   636  		_, err := wrapper.Write([]byte{255, 255, 255, 7, 97, 98, 99})
   637  		if err != ErrFrameTooLarge {
   638  			t.Errorf("%v,%v", wrapper.length, buffer)
   639  			return
   640  		}
   641  	}
   642  	if tester.Run() {
   643  		buffer := bytes.NewBuffer(nil)
   644  		wrapper := NewPassWriter(buffer, 1024)
   645  		wrapper.Write([]byte{255, 255})
   646  		_, err := wrapper.Write([]byte{255, 7, 97, 98, 99})
   647  		if err != ErrFrameTooLarge {
   648  			t.Errorf("%v,%v", wrapper.length, buffer)
   649  			return
   650  		}
   651  	}
   652  }
   653  
   654  type errrWriter struct {
   655  }
   656  
   657  func (e *errrWriter) Write(p []byte) (n int, err error) {
   658  	err = fmt.Errorf("error")
   659  	return
   660  }
   661  
   662  func (e *errrWriter) Close() (err error) {
   663  	return
   664  }
   665  
   666  func TestError(t *testing.T) {
   667  	func() {
   668  		defer func() {
   669  			recover()
   670  		}()
   671  		NewBaseReader(nil, -1)
   672  	}()
   673  	func() {
   674  		defer func() {
   675  			recover()
   676  		}()
   677  		NewReadWriter(nil, nil, -1)
   678  	}()
   679  	func() {
   680  		defer func() {
   681  			recover()
   682  		}()
   683  		NewReadWriteCloser(nil, nil, -1)
   684  	}()
   685  	func() {
   686  		defer func() {
   687  			recover()
   688  		}()
   689  		rwc := NewReadWriteCloser(nil, nil, 1024)
   690  		rwc.SetLengthFieldLength(10)
   691  		rwc.WriteFrame(nil)
   692  	}()
   693  	func() {
   694  		defer func() {
   695  			recover()
   696  		}()
   697  		rwc := NewReadWriteCloser(nil, nil, 1024)
   698  		rwc.SetLengthFieldLength(10)
   699  		rwc.ReadHead([]byte("12222"))
   700  	}()
   701  	func() {
   702  		defer func() {
   703  			recover()
   704  		}()
   705  		rwc := NewReadWriteCloser(nil, nil, 1024)
   706  		rwc.SetLengthFieldLength(10)
   707  		rwc.WriteHead([]byte("12222"))
   708  	}()
   709  	func() {
   710  		defer func() {
   711  			recover()
   712  		}()
   713  		NewRawWrapReader(nil, -1)
   714  	}()
   715  	func() {
   716  		defer func() {
   717  			recover()
   718  		}()
   719  		NewRawReadWriter(nil, nil, -1)
   720  	}()
   721  	func() {
   722  		defer func() {
   723  			recover()
   724  		}()
   725  		NewRawReadWriteCloser(nil, nil, -1)
   726  	}()
   727  	func() {
   728  		NewPassWriter(&errrWriter{}, 1024)
   729  		wrapper := NewPassWriteCloser(&errrWriter{}, 1024)
   730  		wrapper.Write([]byte{0, 0, 0, 7, 97, 98, 99})
   731  		wrapper.Write([]byte{0, 0, 0, 7})
   732  		wrapper.Write([]byte{97, 98, 99})
   733  		wrapper.Close()
   734  	}()
   735  }
   736  
   737  func TestEqual(t *testing.T) {
   738  	var a = bytes.NewBuffer(nil)
   739  	var b = bytes.NewBuffer(nil)
   740  	var r io.Reader
   741  	var w io.Writer
   742  
   743  	r, w = a, a
   744  	fmt.Printf("--->%v\n", interface{}(r) == interface{}(w))
   745  
   746  	r, w = a, b
   747  	fmt.Printf("--->%v\n", interface{}(r) == interface{}(w))
   748  }