Закинул общий репозиторий
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package workers
|
||||
|
||||
import (
|
||||
"SynAck/internal/delivery"
|
||||
"SynAck/internal/services/decorators"
|
||||
"SynAck/internal/services/producers"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Worker struct {
|
||||
Decorator decorators.DialerDecorator
|
||||
Delivery delivery.Delivery
|
||||
Producer producers.Producer
|
||||
}
|
||||
|
||||
func (w Worker) ScanPorts(addr string, grt int) []int {
|
||||
tcp := w.Delivery.GetTcpNetwork()
|
||||
wg := sync.WaitGroup{}
|
||||
|
||||
psChan := make(chan int, w.Producer.GetCountPorts())
|
||||
go w.Producer.WritePsToChan(psChan)
|
||||
var m sync.Mutex
|
||||
|
||||
var result []int
|
||||
for i := 0; i < grt; i++ {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for p := range psChan {
|
||||
dial := w.Decorator.DialPort(tcp, addr, p)
|
||||
if dial != 0 {
|
||||
m.Lock()
|
||||
result = append(result, dial)
|
||||
m.Unlock()
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package workers
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type DialerStub struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
type DeliveryStub struct {
|
||||
}
|
||||
|
||||
type ProducerStub struct {
|
||||
psChan chan int
|
||||
}
|
||||
|
||||
func (ps ProducerStub) WritePsToChan(psChan chan int) {
|
||||
for i := 1; i <= cap(psChan); i++ {
|
||||
psChan <- i
|
||||
}
|
||||
close(psChan)
|
||||
}
|
||||
|
||||
func (ps ProducerStub) GetCountPorts() int {
|
||||
return 5
|
||||
}
|
||||
|
||||
func (ds DeliveryStub) GetTcpNetwork() string {
|
||||
return "tcp"
|
||||
}
|
||||
|
||||
func (d *DialerStub) DialPort(network, addr string, p int) int {
|
||||
args := d.Called(network, addr, p)
|
||||
return args.Int(0)
|
||||
}
|
||||
|
||||
func TestScanPorts(t *testing.T) {
|
||||
addr := "scanme.nmap.org"
|
||||
grt := 5
|
||||
|
||||
delivery := DeliveryStub{}
|
||||
|
||||
dialer := &DialerStub{}
|
||||
dialer.On("DialPort", delivery.GetTcpNetwork(), addr, mock.Anything).Once().Return(1)
|
||||
dialer.On("DialPort", delivery.GetTcpNetwork(), addr, mock.Anything).Once().Return(2)
|
||||
dialer.On("DialPort", delivery.GetTcpNetwork(), addr, mock.Anything).Once().Return(3)
|
||||
dialer.On("DialPort", delivery.GetTcpNetwork(), addr, mock.Anything).Once().Return(4)
|
||||
dialer.On("DialPort", delivery.GetTcpNetwork(), addr, mock.Anything).Once().Return(5)
|
||||
|
||||
producer := ProducerStub{}
|
||||
psChan := make(chan int, producer.GetCountPorts())
|
||||
|
||||
w := Worker{Decorator: dialer, Delivery: delivery, Producer: &producer}
|
||||
|
||||
producer.WritePsToChan(psChan)
|
||||
result := w.ScanPorts(addr, grt)
|
||||
|
||||
exp := []int{1, 2, 3, 4, 5}
|
||||
for _, act := range result {
|
||||
assert.Contains(t, exp, act)
|
||||
}
|
||||
}
|
||||
|
||||
func TestScanPortsWhenEmpty(t *testing.T) {
|
||||
addr := "scanme.nmap.org"
|
||||
grt := 5
|
||||
|
||||
producer := ProducerStub{}
|
||||
cntPs := producer.GetCountPorts()
|
||||
|
||||
delivery := DeliveryStub{}
|
||||
|
||||
dialer := &DialerStub{}
|
||||
dialer.On("DialPort", delivery.GetTcpNetwork(), addr, mock.Anything).Times(cntPs).Return(0)
|
||||
psChan := make(chan int, cntPs)
|
||||
|
||||
w := Worker{Decorator: dialer, Delivery: delivery, Producer: &producer}
|
||||
|
||||
producer.WritePsToChan(psChan)
|
||||
result := w.ScanPorts(addr, grt)
|
||||
|
||||
assert.Empty(t, result)
|
||||
}
|
||||
Reference in New Issue
Block a user