github.com/kelleygo/clashcore@v1.0.2/transport/hysteria/core/frag_test.go (about)

     1  package core
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  func Test_fragUDPMessage(t *testing.T) {
     9  	type args struct {
    10  		m       udpMessage
    11  		maxSize int
    12  	}
    13  	tests := []struct {
    14  		name string
    15  		args args
    16  		want []udpMessage
    17  	}{
    18  		{
    19  			"no frag",
    20  			args{
    21  				udpMessage{
    22  					SessionID: 123,
    23  					HostLen:   4,
    24  					Host:      "test",
    25  					Port:      123,
    26  					MsgID:     123,
    27  					FragID:    0,
    28  					FragCount: 1,
    29  					DataLen:   5,
    30  					Data:      []byte("hello"),
    31  				},
    32  				100,
    33  			},
    34  			[]udpMessage{
    35  				udpMessage{
    36  					SessionID: 123,
    37  					HostLen:   4,
    38  					Host:      "test",
    39  					Port:      123,
    40  					MsgID:     123,
    41  					FragID:    0,
    42  					FragCount: 1,
    43  					DataLen:   5,
    44  					Data:      []byte("hello"),
    45  				},
    46  			},
    47  		},
    48  		{
    49  			"2 frags",
    50  			args{
    51  				udpMessage{
    52  					SessionID: 123,
    53  					HostLen:   4,
    54  					Host:      "test",
    55  					Port:      123,
    56  					MsgID:     123,
    57  					FragID:    0,
    58  					FragCount: 1,
    59  					DataLen:   5,
    60  					Data:      []byte("hello"),
    61  				},
    62  				22,
    63  			},
    64  			[]udpMessage{
    65  				udpMessage{
    66  					SessionID: 123,
    67  					HostLen:   4,
    68  					Host:      "test",
    69  					Port:      123,
    70  					MsgID:     123,
    71  					FragID:    0,
    72  					FragCount: 2,
    73  					DataLen:   4,
    74  					Data:      []byte("hell"),
    75  				},
    76  				udpMessage{
    77  					SessionID: 123,
    78  					HostLen:   4,
    79  					Host:      "test",
    80  					Port:      123,
    81  					MsgID:     123,
    82  					FragID:    1,
    83  					FragCount: 2,
    84  					DataLen:   1,
    85  					Data:      []byte("o"),
    86  				},
    87  			},
    88  		},
    89  		{
    90  			"4 frags",
    91  			args{
    92  				udpMessage{
    93  					SessionID: 123,
    94  					HostLen:   4,
    95  					Host:      "test",
    96  					Port:      123,
    97  					MsgID:     123,
    98  					FragID:    0,
    99  					FragCount: 1,
   100  					DataLen:   20,
   101  					Data:      []byte("wow wow wow lol lmao"),
   102  				},
   103  				23,
   104  			},
   105  			[]udpMessage{
   106  				udpMessage{
   107  					SessionID: 123,
   108  					HostLen:   4,
   109  					Host:      "test",
   110  					Port:      123,
   111  					MsgID:     123,
   112  					FragID:    0,
   113  					FragCount: 4,
   114  					DataLen:   5,
   115  					Data:      []byte("wow w"),
   116  				},
   117  				udpMessage{
   118  					SessionID: 123,
   119  					HostLen:   4,
   120  					Host:      "test",
   121  					Port:      123,
   122  					MsgID:     123,
   123  					FragID:    1,
   124  					FragCount: 4,
   125  					DataLen:   5,
   126  					Data:      []byte("ow wo"),
   127  				},
   128  				udpMessage{
   129  					SessionID: 123,
   130  					HostLen:   4,
   131  					Host:      "test",
   132  					Port:      123,
   133  					MsgID:     123,
   134  					FragID:    2,
   135  					FragCount: 4,
   136  					DataLen:   5,
   137  					Data:      []byte("w lol"),
   138  				},
   139  				udpMessage{
   140  					SessionID: 123,
   141  					HostLen:   4,
   142  					Host:      "test",
   143  					Port:      123,
   144  					MsgID:     123,
   145  					FragID:    3,
   146  					FragCount: 4,
   147  					DataLen:   5,
   148  					Data:      []byte(" lmao"),
   149  				},
   150  			},
   151  		},
   152  	}
   153  	for _, tt := range tests {
   154  		t.Run(tt.name, func(t *testing.T) {
   155  			if got := fragUDPMessage(tt.args.m, tt.args.maxSize); !reflect.DeepEqual(got, tt.want) {
   156  				t.Errorf("fragUDPMessage() = %v, want %v", got, tt.want)
   157  			}
   158  		})
   159  	}
   160  }
   161  
   162  func Test_defragger_Feed(t *testing.T) {
   163  	d := &defragger{}
   164  	type args struct {
   165  		m udpMessage
   166  	}
   167  	tests := []struct {
   168  		name string
   169  		args args
   170  		want *udpMessage
   171  	}{
   172  		{
   173  			"no frag",
   174  			args{
   175  				udpMessage{
   176  					SessionID: 123,
   177  					HostLen:   4,
   178  					Host:      "test",
   179  					Port:      123,
   180  					MsgID:     123,
   181  					FragID:    0,
   182  					FragCount: 1,
   183  					DataLen:   5,
   184  					Data:      []byte("hello"),
   185  				},
   186  			},
   187  			&udpMessage{
   188  				SessionID: 123,
   189  				HostLen:   4,
   190  				Host:      "test",
   191  				Port:      123,
   192  				MsgID:     123,
   193  				FragID:    0,
   194  				FragCount: 1,
   195  				DataLen:   5,
   196  				Data:      []byte("hello"),
   197  			},
   198  		},
   199  		{
   200  			"frag 1 - 1/3",
   201  			args{
   202  				udpMessage{
   203  					SessionID: 123,
   204  					HostLen:   4,
   205  					Host:      "test",
   206  					Port:      123,
   207  					MsgID:     666,
   208  					FragID:    0,
   209  					FragCount: 3,
   210  					DataLen:   5,
   211  					Data:      []byte("hello"),
   212  				},
   213  			},
   214  			nil,
   215  		},
   216  		{
   217  			"frag 1 - 2/3",
   218  			args{
   219  				udpMessage{
   220  					SessionID: 123,
   221  					HostLen:   4,
   222  					Host:      "test",
   223  					Port:      123,
   224  					MsgID:     666,
   225  					FragID:    1,
   226  					FragCount: 3,
   227  					DataLen:   8,
   228  					Data:      []byte(" shitty "),
   229  				},
   230  			},
   231  			nil,
   232  		},
   233  		{
   234  			"frag 1 - 3/3",
   235  			args{
   236  				udpMessage{
   237  					SessionID: 123,
   238  					HostLen:   4,
   239  					Host:      "test",
   240  					Port:      123,
   241  					MsgID:     666,
   242  					FragID:    2,
   243  					FragCount: 3,
   244  					DataLen:   7,
   245  					Data:      []byte("world!!"),
   246  				},
   247  			},
   248  			&udpMessage{
   249  				SessionID: 123,
   250  				HostLen:   4,
   251  				Host:      "test",
   252  				Port:      123,
   253  				MsgID:     666,
   254  				FragID:    0,
   255  				FragCount: 1,
   256  				DataLen:   20,
   257  				Data:      []byte("hello shitty world!!"),
   258  			},
   259  		},
   260  		{
   261  			"frag 2 - 1/2",
   262  			args{
   263  				udpMessage{
   264  					SessionID: 123,
   265  					HostLen:   4,
   266  					Host:      "test",
   267  					Port:      123,
   268  					MsgID:     777,
   269  					FragID:    0,
   270  					FragCount: 2,
   271  					DataLen:   5,
   272  					Data:      []byte("hello"),
   273  				},
   274  			},
   275  			nil,
   276  		},
   277  		{
   278  			"frag 3 - 2/2",
   279  			args{
   280  				udpMessage{
   281  					SessionID: 123,
   282  					HostLen:   4,
   283  					Host:      "test",
   284  					Port:      123,
   285  					MsgID:     778,
   286  					FragID:    1,
   287  					FragCount: 2,
   288  					DataLen:   5,
   289  					Data:      []byte(" moto"),
   290  				},
   291  			},
   292  			nil,
   293  		},
   294  		{
   295  			"frag 2 - 2/2",
   296  			args{
   297  				udpMessage{
   298  					SessionID: 123,
   299  					HostLen:   4,
   300  					Host:      "test",
   301  					Port:      123,
   302  					MsgID:     777,
   303  					FragID:    1,
   304  					FragCount: 2,
   305  					DataLen:   5,
   306  					Data:      []byte(" moto"),
   307  				},
   308  			},
   309  			nil,
   310  		},
   311  		{
   312  			"frag 2 - 1/2 re",
   313  			args{
   314  				udpMessage{
   315  					SessionID: 123,
   316  					HostLen:   4,
   317  					Host:      "test",
   318  					Port:      123,
   319  					MsgID:     777,
   320  					FragID:    0,
   321  					FragCount: 2,
   322  					DataLen:   5,
   323  					Data:      []byte("hello"),
   324  				},
   325  			},
   326  			&udpMessage{
   327  				SessionID: 123,
   328  				HostLen:   4,
   329  				Host:      "test",
   330  				Port:      123,
   331  				MsgID:     777,
   332  				FragID:    0,
   333  				FragCount: 1,
   334  				DataLen:   10,
   335  				Data:      []byte("hello moto"),
   336  			},
   337  		},
   338  	}
   339  	for _, tt := range tests {
   340  		t.Run(tt.name, func(t *testing.T) {
   341  			if got := d.Feed(tt.args.m); !reflect.DeepEqual(got, tt.want) {
   342  				t.Errorf("Feed() = %v, want %v", got, tt.want)
   343  			}
   344  		})
   345  	}
   346  }