@@ -104,7 +104,7 @@ func TestIPPortScanCmdOptsInitCliFlags(t *testing.T) {
104104 err := cmd .ParseFlags (strings .Split (
105105 strings .Join ([]string {
106106 "--json -i eth0 --srcip 192.168.0.1 --srcmac 00:11:22:33:44:55 -r 500/7s --exit-delay 10s --exclude ips.txt" ,
107- "--gwmac 11:22:33:44:55:66 -f ip_file.jsonl -a arp.cache" ,
107+ "--gwmac 11:22:33:44:55:66 -f ip_file.jsonl -a arp.cache --ports-file ports.txt " ,
108108 "-p 23-57,71-2733" ,
109109 }, " " ), " " ))
110110
@@ -122,6 +122,7 @@ func TestIPPortScanCmdOptsInitCliFlags(t *testing.T) {
122122 require .Equal (t , "arp.cache" , opts .arpCacheFile )
123123
124124 require .Equal (t , "23-57,71-2733" , opts .rawPortRanges )
125+ require .Equal (t , "ports.txt" , opts .portFile )
125126}
126127
127128func TestIPPortScanCmdOptsParseRawOptions (t * testing.T ) {
@@ -157,11 +158,12 @@ func TestGenericScanCmdOptsInitCliFlags(t *testing.T) {
157158
158159 opts .initCliFlags (cmd )
159160 err := cmd .ParseFlags (strings .Split (
160- "--json -p 23-57,71-2733 -f ip_file.jsonl -w 300 -r 500/7s --exit-delay 10s --exclude ips.txt" , " " ))
161+ "--json -p 23-57,71-2733 -f ip_file.jsonl -w 300 -r 500/7s --exit-delay 10s --exclude ips.txt --ports-file ports.txt " , " " ))
161162
162163 require .NoError (t , err )
163164 require .Equal (t , true , opts .json )
164165 require .Equal (t , "23-57,71-2733" , opts .rawPortRanges )
166+ require .Equal (t , "ports.txt" , opts .portFile )
165167 require .Equal (t , "ip_file.jsonl" , opts .ipFile )
166168 require .Equal (t , 300 , opts .workers )
167169 require .Equal (t , "500/7s" , opts .rawRateLimit )
@@ -928,6 +930,131 @@ func TestParseExcludeFile(t *testing.T) {
928930 }
929931}
930932
933+ func TestParsePortsFileWithInvalidFile (t * testing.T ) {
934+ t .Parallel ()
935+ _ , err := parsePortsFile (func () (io.ReadCloser , error ) {
936+ return nil , errors .New ("open file error" )
937+ })
938+ require .Error (t , err )
939+ }
940+
941+ func TestParsePortsFile (t * testing.T ) {
942+ t .Parallel ()
943+
944+ tests := []struct {
945+ name string
946+ input string
947+ expected []* scan.PortRange
948+ err bool
949+ }{
950+ {
951+ name : "OnePort" ,
952+ input : "80" ,
953+ expected : []* scan.PortRange {
954+ {StartPort : 80 , EndPort : 80 },
955+ },
956+ },
957+ {
958+ name : "OnePortRange" ,
959+ input : "80-443" ,
960+ expected : []* scan.PortRange {
961+ {StartPort : 80 , EndPort : 443 },
962+ },
963+ },
964+ {
965+ name : "TwoPorts" ,
966+ input : "80\n 443" ,
967+ expected : []* scan.PortRange {
968+ {StartPort : 80 , EndPort : 80 },
969+ {StartPort : 443 , EndPort : 443 },
970+ },
971+ },
972+ {
973+ name : "TwoPortRanges" ,
974+ input : "80-443\n 1123-1679" ,
975+ expected : []* scan.PortRange {
976+ {StartPort : 80 , EndPort : 443 },
977+ {StartPort : 1123 , EndPort : 1679 },
978+ },
979+ },
980+ {
981+ name : "ParseError" ,
982+ input : "abc" ,
983+ err : true ,
984+ },
985+ {
986+ name : "ParseErrorAfterOnePort" ,
987+ input : "80\n abc" ,
988+ err : true ,
989+ },
990+ {
991+ name : "WithNewLines" ,
992+ input : "\n \n 80\n \n " ,
993+ expected : []* scan.PortRange {
994+ {StartPort : 80 , EndPort : 80 },
995+ },
996+ },
997+ {
998+ name : "WithSpaces" ,
999+ input : " 80 " ,
1000+ expected : []* scan.PortRange {
1001+ {StartPort : 80 , EndPort : 80 },
1002+ },
1003+ },
1004+ {
1005+ name : "WithNewLinesAndSpaces" ,
1006+ input : "\n \n 80\n \n " ,
1007+ expected : []* scan.PortRange {
1008+ {StartPort : 80 , EndPort : 80 },
1009+ },
1010+ },
1011+ {
1012+ name : "WithComment" ,
1013+ input : "# comment\n 80" ,
1014+ expected : []* scan.PortRange {
1015+ {StartPort : 80 , EndPort : 80 },
1016+ },
1017+ },
1018+ {
1019+ name : "WithSpaceAndComment" ,
1020+ input : " # comment\n 80" ,
1021+ expected : []* scan.PortRange {
1022+ {StartPort : 80 , EndPort : 80 },
1023+ },
1024+ },
1025+ {
1026+ name : "WithCommentOnLine" ,
1027+ input : "80 # comment" ,
1028+ expected : []* scan.PortRange {
1029+ {StartPort : 80 , EndPort : 80 },
1030+ },
1031+ },
1032+ }
1033+
1034+ for _ , vtt := range tests {
1035+ tt := vtt
1036+ t .Run (tt .name , func (t * testing.T ) {
1037+ t .Parallel ()
1038+
1039+ done := make (chan interface {})
1040+ go func () {
1041+ defer close (done )
1042+
1043+ ports , err := parsePortsFile (func () (io.ReadCloser , error ) {
1044+ return ioutil .NopCloser (strings .NewReader (tt .input )), nil
1045+ })
1046+ if tt .err {
1047+ require .Error (t , err )
1048+ return
1049+ }
1050+ require .NoError (t , err )
1051+ require .Equal (t , tt .expected , ports )
1052+ }()
1053+ waitDone (t , done )
1054+ })
1055+ }
1056+ }
1057+
9311058func waitDone (t * testing.T , done <- chan interface {}) {
9321059 t .Helper ()
9331060 select {
0 commit comments