Comments (11)
" I am ashamed π" - Never, don't be.
This project is awesome and it will only get better with these proposals
from go-smtp-mock.
Fantastic turnaround time! πππππ
I'm really appreciate your intention, report with extended comments and PR to get smtpmock
better. Thank you, Benjamin! It was a pleasure to have a code-time with you π»
from go-smtp-mock.
I've played with the code and seemingly fixed the race conditions, at least as they occur in the repo's own tests. Will push it soon as a PR where we can discuss the approach.
from go-smtp-mock.
PR: #125
from go-smtp-mock.
from go-smtp-mock.
@benjamin-rood Hello! Good catch π Thanks for your report. Seems like it an urgent issue, I'll take a look as soon as possible. I will be grateful for suggestions.
from go-smtp-mock.
Thanks for your prompt acknowledgement, Vladislav. Yes, it's very urgent, I think!
I will be grateful for suggestions.
To begin with, can you tell me: Am I doing it the correct way, by creating a mock server instance in TestMain
?
Secondly, is this the first time you have encountered any reports of race conditions?
The only possible issue I can notice on the caller sideβi.e. my code, SMTPTransport.Send(...)
being testedβis that on encountering an error I'm not sending a signal to the server to finish the session before bailing out and returning an error. So, I will fix that in my code to rule out that as a cause, but, at a minimum you will need to use the sync.RWMutex
in any reads as well as part of the writes. The lock doesn't automagically work, readers and writers both need to use it.
from go-smtp-mock.
Just cloned this repo and ran the tests with the -race
flag. Race condition detected, so we can rule out my use of the library as the cause.
β― go test -race ./...
==================
WARNING: DATA RACE
Read at 0x00c0001a6708 by goroutine 46:
github.com/mocktools/go-smtp-mock.TestServerStop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server_test.go:407 +0x553
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Previous write at 0x00c0001a6708 by goroutine 49:
github.com/mocktools/go-smtp-mock.(*Server).Stop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server.go:101 +0x94
Goroutine 46 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:1486 +0x724
github.com/mocktools/go-smtp-mock.TestServerStop()
/wrk/github.com/mocktools/go-smtp-mock/server_test.go:391 +0x44
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Goroutine 49 (running) created at:
github.com/mocktools/go-smtp-mock.(*Server).Stop()
/wrk/github.com/mocktools/go-smtp-mock/server.go:98 +0x11d
github.com/mocktools/go-smtp-mock.TestServerStop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server_test.go:406 +0x524
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
==================
--- FAIL: TestServerStop (1.00s)
--- FAIL: TestServerStop/when_server_active_stops_current_server,_graceful_shutdown_case (0.00s)
testing.go:1312: race detected during execution of test
testing.go:1312: race detected during execution of test
==================
WARNING: DATA RACE
Read at 0x00c00060f488 by goroutine 25:
github.com/mocktools/go-smtp-mock.TestNew.func3()
/wrk/github.com/mocktools/go-smtp-mock/smtpmock_test.go:158 +0x3f7
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Previous write at 0x00c00060f488 by goroutine 21:
github.com/mocktools/go-smtp-mock.(*Server).Stop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server.go:101 +0x94
Goroutine 25 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:1486 +0x724
github.com/mocktools/go-smtp-mock.TestNew()
/wrk/github.com/mocktools/go-smtp-mock/smtpmock_test.go:141 +0x84
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Goroutine 21 (finished) created at:
github.com/mocktools/go-smtp-mock.(*Server).Stop()
/wrk/github.com/mocktools/go-smtp-mock/server.go:98 +0x11d
github.com/mocktools/go-smtp-mock.TestNew.func3()
/wrk/github.com/mocktools/go-smtp-mock/smtpmock_test.go:154 +0x351
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
==================
--- FAIL: TestNew (0.03s)
--- FAIL: TestNew/successful_iteration_with_new_server (0.03s)
testing.go:1312: race detected during execution of test
testing.go:1312: race detected during execution of test
FAIL
FAIL github.com/mocktools/go-smtp-mock 1.373s
ok github.com/mocktools/go-smtp-mock/cmd 0.028s
? github.com/mocktools/go-smtp-mock/cmd/version [no test files]
FAIL
Full verbose output:
β― go test -race -v ./...
=== RUN TestNewConfiguration
=== RUN TestNewConfiguration/creates_new_configuration_with_default_settings
=== RUN TestNewConfiguration/creates_new_configuration_with_custom_settings
--- PASS: TestNewConfiguration (0.00s)
--- PASS: TestNewConfiguration/creates_new_configuration_with_default_settings (0.00s)
--- PASS: TestNewConfiguration/creates_new_configuration_with_custom_settings (0.00s)
=== RUN TestConfigurationAttrAssignDefaultValues
=== RUN TestConfigurationAttrAssignDefaultValues/assignes_default_values
--- PASS: TestConfigurationAttrAssignDefaultValues (0.00s)
--- PASS: TestConfigurationAttrAssignDefaultValues/assignes_default_values (0.00s)
=== RUN TestNewHandlerData
=== RUN TestNewHandlerData/returns_new_handlerData
--- PASS: TestNewHandlerData (0.00s)
--- PASS: TestNewHandlerData/returns_new_handlerData (0.00s)
=== RUN TestHandlerDataRun
=== RUN TestHandlerDataRun/when_successful_DATA_request
=== RUN TestHandlerDataRun/when_failure_DATA_request,_invalid_command_sequence
=== RUN TestHandlerDataRun/when_failure_DATA_request,_invalid_command
--- PASS: TestHandlerDataRun (0.00s)
--- PASS: TestHandlerDataRun/when_successful_DATA_request (0.00s)
--- PASS: TestHandlerDataRun/when_failure_DATA_request,_invalid_command_sequence (0.00s)
--- PASS: TestHandlerDataRun/when_failure_DATA_request,_invalid_command (0.00s)
=== RUN TestHandlerDataClearMessage
=== RUN TestHandlerDataClearMessage/erases_all_handler_message_data_from_DATA_command
--- PASS: TestHandlerDataClearMessage (0.00s)
--- PASS: TestHandlerDataClearMessage/erases_all_handler_message_data_from_DATA_command (0.00s)
=== RUN TestHandlerDataProcessIncomingMessage
--- PASS: TestHandlerDataProcessIncomingMessage (0.00s)
=== RUN TestHandlerDataWriteResult
=== RUN TestHandlerDataWriteResult/when_successful_request_received
=== RUN TestHandlerDataWriteResult/when_failed_request_received
--- PASS: TestHandlerDataWriteResult (0.00s)
--- PASS: TestHandlerDataWriteResult/when_successful_request_received (0.00s)
--- PASS: TestHandlerDataWriteResult/when_failed_request_received (0.00s)
=== RUN TestHandlerDataIsInvalidCmdSequence
=== RUN TestHandlerDataIsInvalidCmdSequence/when_none_of_the_previous_command_was_successful
=== RUN TestHandlerDataIsInvalidCmdSequence/when_rcptto_previous_command_was_failure
=== RUN TestHandlerDataIsInvalidCmdSequence/when_mailfrom,_rcptto_previous_commands_were_failure
=== RUN TestHandlerDataIsInvalidCmdSequence/when_all_of_the_previous_commands_was_successful
--- PASS: TestHandlerDataIsInvalidCmdSequence (0.00s)
--- PASS: TestHandlerDataIsInvalidCmdSequence/when_none_of_the_previous_command_was_successful (0.00s)
--- PASS: TestHandlerDataIsInvalidCmdSequence/when_rcptto_previous_command_was_failure (0.00s)
--- PASS: TestHandlerDataIsInvalidCmdSequence/when_mailfrom,_rcptto_previous_commands_were_failure (0.00s)
--- PASS: TestHandlerDataIsInvalidCmdSequence/when_all_of_the_previous_commands_was_successful (0.00s)
=== RUN TestHandlerDataIsInvalidCmd
=== RUN TestHandlerDataIsInvalidCmd/when_request_includes_invalid_command_DATA
=== RUN TestHandlerDataIsInvalidCmd/when_request_includes_valid_command_DATA
--- PASS: TestHandlerDataIsInvalidCmd (0.00s)
--- PASS: TestHandlerDataIsInvalidCmd/when_request_includes_invalid_command_DATA (0.00s)
--- PASS: TestHandlerDataIsInvalidCmd/when_request_includes_valid_command_DATA (0.00s)
=== RUN TestHandlerDataIsInvalidRequest
=== RUN TestHandlerDataIsInvalidRequest/when_request_includes_invalid_DATA_command_sequence
=== RUN TestHandlerDataIsInvalidRequest/when_request_includes_invalid_command_DATA
=== RUN TestHandlerDataIsInvalidRequest/when_valid_DATA_request
--- PASS: TestHandlerDataIsInvalidRequest (0.00s)
--- PASS: TestHandlerDataIsInvalidRequest/when_request_includes_invalid_DATA_command_sequence (0.00s)
--- PASS: TestHandlerDataIsInvalidRequest/when_request_includes_invalid_command_DATA (0.00s)
--- PASS: TestHandlerDataIsInvalidRequest/when_valid_DATA_request (0.00s)
=== RUN TestNewHandlerHelo
=== RUN TestNewHandlerHelo/returns_new_handlerHelo
--- PASS: TestNewHandlerHelo (0.00s)
--- PASS: TestNewHandlerHelo/returns_new_handlerHelo (0.00s)
=== RUN TestHandlerHeloRun
=== RUN TestHandlerHeloRun/when_successful_HELO_request
=== RUN TestHandlerHeloRun/when_failure_HELO_request,_invalid_command_argument
=== RUN TestHandlerHeloRun/when_failure_HELO_request,_blacklisted_HELO_domain
--- PASS: TestHandlerHeloRun (0.01s)
--- PASS: TestHandlerHeloRun/when_successful_HELO_request (0.00s)
--- PASS: TestHandlerHeloRun/when_failure_HELO_request,_invalid_command_argument (0.00s)
--- PASS: TestHandlerHeloRun/when_failure_HELO_request,_blacklisted_HELO_domain (0.00s)
=== RUN TestHandlerHeloClearMessage
=== RUN TestHandlerHeloClearMessage/erases_all_handler_message_data
--- PASS: TestHandlerHeloClearMessage (0.00s)
--- PASS: TestHandlerHeloClearMessage/erases_all_handler_message_data (0.00s)
=== RUN TestHandlerHeloWriteResult
=== RUN TestHandlerHeloWriteResult/when_successful_request_received
=== RUN TestHandlerHeloWriteResult/when_failed_request_received
--- PASS: TestHandlerHeloWriteResult (0.00s)
--- PASS: TestHandlerHeloWriteResult/when_successful_request_received (0.00s)
--- PASS: TestHandlerHeloWriteResult/when_failed_request_received (0.00s)
=== RUN TestHandlerHeloIsInvalidCmdArg
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_invalid_command_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_valid_command_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_localhost_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_valid_ip_address_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_valid_address_literal_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_invalid_ip_address_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_invalid_address_literal_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_malformed_(left)_address_literal_HELO_argument
=== RUN TestHandlerHeloIsInvalidCmdArg/when_request_includes_malformed_(right)_address_literal_HELO_argument
--- PASS: TestHandlerHeloIsInvalidCmdArg (0.02s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_invalid_command_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_valid_command_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_localhost_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_valid_ip_address_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_valid_address_literal_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_invalid_ip_address_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_invalid_address_literal_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_malformed_(left)_address_literal_HELO_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidCmdArg/when_request_includes_malformed_(right)_address_literal_HELO_argument (0.00s)
=== RUN TestHandlerHeloHeloDomain
=== RUN TestHandlerHeloHeloDomain/when_request_includes_valid_domain_name
=== RUN TestHandlerHeloHeloDomain/when_request_includes_localhost
=== RUN TestHandlerHeloHeloDomain/when_request_not_includes_valid_domain_name
--- PASS: TestHandlerHeloHeloDomain (0.01s)
--- PASS: TestHandlerHeloHeloDomain/when_request_includes_valid_domain_name (0.00s)
--- PASS: TestHandlerHeloHeloDomain/when_request_includes_localhost (0.00s)
--- PASS: TestHandlerHeloHeloDomain/when_request_not_includes_valid_domain_name (0.00s)
=== RUN TestHandlerHeloIsBlacklistedDomain
=== RUN TestHandlerHeloIsBlacklistedDomain/when_request_includes_blacklisted_domain_name
=== RUN TestHandlerHeloIsBlacklistedDomain/when_request_not_includes_blacklisted_domain_name
--- PASS: TestHandlerHeloIsBlacklistedDomain (0.00s)
--- PASS: TestHandlerHeloIsBlacklistedDomain/when_request_includes_blacklisted_domain_name (0.00s)
--- PASS: TestHandlerHeloIsBlacklistedDomain/when_request_not_includes_blacklisted_domain_name (0.00s)
=== RUN TestHandlerHeloIsInvalidRequest
=== RUN TestHandlerHeloIsInvalidRequest/when_request_includes_invalid_HELO_command_argument
=== RUN TestHandlerHeloIsInvalidRequest/when_valid_HELO_request
=== RUN TestHandlerHeloIsInvalidRequest/when_valid_HELO_request#01
=== RUN TestHandlerHeloIsInvalidRequest/when_valid_HELO_request#02
=== RUN TestHandlerHeloIsInvalidRequest/when_valid_HELO_request#03
=== RUN TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain
=== RUN TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain#01
=== RUN TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain#02
=== RUN TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain#03
--- PASS: TestHandlerHeloIsInvalidRequest (0.03s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_request_includes_invalid_HELO_command_argument (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_valid_HELO_request (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_valid_HELO_request#01 (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_valid_HELO_request#02 (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_valid_HELO_request#03 (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain#01 (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain#02 (0.00s)
--- PASS: TestHandlerHeloIsInvalidRequest/when_request_includes_blacklisted_HELO_domain#03 (0.01s)
=== RUN TestNewHandlerMailfrom
=== RUN TestNewHandlerMailfrom/returns_new_handlerMailfrom
--- PASS: TestNewHandlerMailfrom (0.00s)
--- PASS: TestNewHandlerMailfrom/returns_new_handlerMailfrom (0.00s)
=== RUN TestHandlerMailfromRun
=== RUN TestHandlerMailfromRun/when_successful_MAILFROM_request
=== RUN TestHandlerMailfromRun/when_failure_MAILFROM_request,_invalid_command_sequence
=== RUN TestHandlerMailfromRun/when_failure_MAILFROM_request,_invalid_command_argument
=== RUN TestHandlerMailfromRun/when_failure_MAILFROM_request,_request_includes_blacklisted_MAILFROM_email
--- PASS: TestHandlerMailfromRun (0.01s)
--- PASS: TestHandlerMailfromRun/when_successful_MAILFROM_request (0.00s)
--- PASS: TestHandlerMailfromRun/when_failure_MAILFROM_request,_invalid_command_sequence (0.00s)
--- PASS: TestHandlerMailfromRun/when_failure_MAILFROM_request,_invalid_command_argument (0.00s)
--- PASS: TestHandlerMailfromRun/when_failure_MAILFROM_request,_request_includes_blacklisted_MAILFROM_email (0.01s)
=== RUN TestHandlerMailfromClearMessage
=== RUN TestHandlerMailfromClearMessage/erases_all_handler_message_data_from_MAILFROM_command
--- PASS: TestHandlerMailfromClearMessage (0.00s)
--- PASS: TestHandlerMailfromClearMessage/erases_all_handler_message_data_from_MAILFROM_command (0.00s)
=== RUN TestHandlerMailfromWriteResult
=== RUN TestHandlerMailfromWriteResult/when_successful_request_received
=== RUN TestHandlerMailfromWriteResult/when_failed_request_received
--- PASS: TestHandlerMailfromWriteResult (0.00s)
--- PASS: TestHandlerMailfromWriteResult/when_successful_request_received (0.00s)
--- PASS: TestHandlerMailfromWriteResult/when_failed_request_received (0.00s)
=== RUN TestHandlerMailfromIsInvalidCmdSequence
=== RUN TestHandlerMailfromIsInvalidCmdSequence/when_helo_previous_command_was_failure_
=== RUN TestHandlerMailfromIsInvalidCmdSequence/when_helo_previous_command_was_successful_
--- PASS: TestHandlerMailfromIsInvalidCmdSequence (0.00s)
--- PASS: TestHandlerMailfromIsInvalidCmdSequence/when_helo_previous_command_was_failure_ (0.00s)
--- PASS: TestHandlerMailfromIsInvalidCmdSequence/when_helo_previous_command_was_successful_ (0.00s)
=== RUN TestHandlerMaifromIsInvalidCmdArg
=== RUN TestHandlerMaifromIsInvalidCmdArg/when_request_includes_invalid_command_MAILFROM_argument
=== RUN TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_without_<>_sign
=== RUN TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_without_<>_sign_without_space
=== RUN TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_with_<>_sign
=== RUN TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_with_<>_sign_without_space
--- PASS: TestHandlerMaifromIsInvalidCmdArg (0.01s)
--- PASS: TestHandlerMaifromIsInvalidCmdArg/when_request_includes_invalid_command_MAILFROM_argument (0.00s)
--- PASS: TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_without_<>_sign (0.00s)
--- PASS: TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_without_<>_sign_without_space (0.00s)
--- PASS: TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_with_<>_sign (0.00s)
--- PASS: TestHandlerMaifromIsInvalidCmdArg/when_request_includes_valid_command_MAILFROM_argument_with_<>_sign_without_space (0.00s)
=== RUN TestHandlerMailfromMailfromEmail
=== RUN TestHandlerMailfromMailfromEmail/when_request_includes_valid_email_address_without_<>_sign
=== RUN TestHandlerMailfromMailfromEmail/when_request_includes_valid_email_address_with_<>_sign
=== RUN TestHandlerMailfromMailfromEmail/when_request_includes_invalid_email_address
--- PASS: TestHandlerMailfromMailfromEmail (0.00s)
--- PASS: TestHandlerMailfromMailfromEmail/when_request_includes_valid_email_address_without_<>_sign (0.00s)
--- PASS: TestHandlerMailfromMailfromEmail/when_request_includes_valid_email_address_with_<>_sign (0.00s)
--- PASS: TestHandlerMailfromMailfromEmail/when_request_includes_invalid_email_address (0.00s)
=== RUN TestHandlerHeloIsBlacklistedEmail
=== RUN TestHandlerHeloIsBlacklistedEmail/when_request_includes_blacklisted_domain_name
=== RUN TestHandlerHeloIsBlacklistedEmail/when_request_not_includes_blacklisted_domain_name
--- PASS: TestHandlerHeloIsBlacklistedEmail (0.01s)
--- PASS: TestHandlerHeloIsBlacklistedEmail/when_request_includes_blacklisted_domain_name (0.00s)
--- PASS: TestHandlerHeloIsBlacklistedEmail/when_request_not_includes_blacklisted_domain_name (0.00s)
=== RUN TestHandlerMailfromIsInvalidRequest
=== RUN TestHandlerMailfromIsInvalidRequest/when_request_includes_invalid_MAILFROM_command_sequence,_the_previous_command_is_not_successful
=== RUN TestHandlerMailfromIsInvalidRequest/when_request_includes_invalid_MAILFROM_command_argument
=== RUN TestHandlerMailfromIsInvalidRequest/when_request_includes_blacklisted_MAILFROM_email
=== RUN TestHandlerMailfromIsInvalidRequest/when_valid_MAILFROM_request
--- PASS: TestHandlerMailfromIsInvalidRequest (0.02s)
--- PASS: TestHandlerMailfromIsInvalidRequest/when_request_includes_invalid_MAILFROM_command_sequence,_the_previous_command_is_not_successful (0.00s)
--- PASS: TestHandlerMailfromIsInvalidRequest/when_request_includes_invalid_MAILFROM_command_argument (0.00s)
--- PASS: TestHandlerMailfromIsInvalidRequest/when_request_includes_blacklisted_MAILFROM_email (0.01s)
--- PASS: TestHandlerMailfromIsInvalidRequest/when_valid_MAILFROM_request (0.01s)
=== RUN TestNewHandlerMessage
=== RUN TestNewHandlerMessage/returns_new_handlerMessage
--- PASS: TestNewHandlerMessage (0.00s)
--- PASS: TestNewHandlerMessage/returns_new_handlerMessage (0.00s)
=== RUN TestHandlerMessageRun
=== RUN TestHandlerMessageRun/when_read_request_error
=== RUN TestHandlerMessageRun/when_message_size_limit_reached
=== RUN TestHandlerMessageRun/when_message_received
--- PASS: TestHandlerMessageRun (0.00s)
--- PASS: TestHandlerMessageRun/when_read_request_error (0.00s)
--- PASS: TestHandlerMessageRun/when_message_size_limit_reached (0.00s)
--- PASS: TestHandlerMessageRun/when_message_received (0.00s)
=== RUN TestHandlerMessageWriteResult
=== RUN TestHandlerMessageWriteResult/when_successful_request_received
=== RUN TestHandlerMessageWriteResult/when_failed_request_received
--- PASS: TestHandlerMessageWriteResult (0.00s)
--- PASS: TestHandlerMessageWriteResult/when_successful_request_received (0.00s)
--- PASS: TestHandlerMessageWriteResult/when_failed_request_received (0.00s)
=== RUN TestNewHandlerQuit
=== RUN TestNewHandlerQuit/returns_new_handlerQuit
--- PASS: TestNewHandlerQuit (0.00s)
--- PASS: TestNewHandlerQuit/returns_new_handlerQuit (0.00s)
=== RUN TestHandlerQuitRun
=== RUN TestHandlerQuitRun/when_successful_QUIT_request
=== RUN TestHandlerQuitRun/when_failure_QUIT_request
--- PASS: TestHandlerQuitRun (0.00s)
--- PASS: TestHandlerQuitRun/when_successful_QUIT_request (0.00s)
--- PASS: TestHandlerQuitRun/when_failure_QUIT_request (0.00s)
=== RUN TestHandlerQuitIsInvalidRequest
=== RUN TestHandlerQuitIsInvalidRequest/when_request_includes_invalid_QUIT_command
=== RUN TestHandlerQuitIsInvalidRequest/when_request_includes_valid_QUIT_command
--- PASS: TestHandlerQuitIsInvalidRequest (0.00s)
--- PASS: TestHandlerQuitIsInvalidRequest/when_request_includes_invalid_QUIT_command (0.00s)
--- PASS: TestHandlerQuitIsInvalidRequest/when_request_includes_valid_QUIT_command (0.00s)
=== RUN TestNewHandlerRcptto
=== RUN TestNewHandlerRcptto/returns_new_handlerRcptto
--- PASS: TestNewHandlerRcptto (0.00s)
--- PASS: TestNewHandlerRcptto/returns_new_handlerRcptto (0.00s)
=== RUN TestHandlerRcpttoRun
=== RUN TestHandlerRcpttoRun/when_successful_RCPTTO_request
=== RUN TestHandlerRcpttoRun/when_failure_RCPTTO_request,_invalid_command_sequence
=== RUN TestHandlerRcpttoRun/when_failure_RCPTTO_request,_invalid_command_argument
=== RUN TestHandlerRcpttoRun/when_failure_RCPTTO_request,_request_includes_blacklisted_RCPTTO_email
=== RUN TestHandlerRcpttoRun/when_failure_RCPTTO_request,_request_includes_not_registered_RCPTTO_email
--- PASS: TestHandlerRcpttoRun (0.02s)
--- PASS: TestHandlerRcpttoRun/when_successful_RCPTTO_request (0.01s)
--- PASS: TestHandlerRcpttoRun/when_failure_RCPTTO_request,_invalid_command_sequence (0.00s)
--- PASS: TestHandlerRcpttoRun/when_failure_RCPTTO_request,_invalid_command_argument (0.00s)
--- PASS: TestHandlerRcpttoRun/when_failure_RCPTTO_request,_request_includes_blacklisted_RCPTTO_email (0.01s)
--- PASS: TestHandlerRcpttoRun/when_failure_RCPTTO_request,_request_includes_not_registered_RCPTTO_email (0.01s)
=== RUN TestHandlerRcpttoClearMessage
=== RUN TestHandlerRcpttoClearMessage/erases_all_handler_message_data_from_RCPTTO_command
--- PASS: TestHandlerRcpttoClearMessage (0.00s)
--- PASS: TestHandlerRcpttoClearMessage/erases_all_handler_message_data_from_RCPTTO_command (0.00s)
=== RUN TestHandlerRcpttoWriteResult
=== RUN TestHandlerRcpttoWriteResult/when_successful_request_received
=== RUN TestHandlerRcpttoWriteResult/when_failed_request_received
--- PASS: TestHandlerRcpttoWriteResult (0.00s)
--- PASS: TestHandlerRcpttoWriteResult/when_successful_request_received (0.00s)
--- PASS: TestHandlerRcpttoWriteResult/when_failed_request_received (0.00s)
=== RUN TestHandlerRcpttoIsInvalidCmdSequence
=== RUN TestHandlerRcpttoIsInvalidCmdSequence/when_none_of_the_previous_command_was_successful
=== RUN TestHandlerRcpttoIsInvalidCmdSequence/when_mailfrom_previous_command_was_failure
=== RUN TestHandlerRcpttoIsInvalidCmdSequence/when_all_of_the_previous_commands_was_successful
--- PASS: TestHandlerRcpttoIsInvalidCmdSequence (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdSequence/when_none_of_the_previous_command_was_successful (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdSequence/when_mailfrom_previous_command_was_failure (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdSequence/when_all_of_the_previous_commands_was_successful (0.00s)
=== RUN TestHandlerRcpttoIsInvalidCmdArg
=== RUN TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_invalid_command_RCPTTO_argument
=== RUN TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_without_<>_sign
=== RUN TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_without_<>_sign_without_space
=== RUN TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_with_<>_sign
=== RUN TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_with_<>_sign_withoyt_space
--- PASS: TestHandlerRcpttoIsInvalidCmdArg (0.02s)
--- PASS: TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_invalid_command_RCPTTO_argument (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_without_<>_sign (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_without_<>_sign_without_space (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_with_<>_sign (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidCmdArg/when_request_includes_valid_command_RCPTTO_argument_with_<>_sign_withoyt_space (0.00s)
=== RUN TestHandlerRcpttoRcpttoEmail
=== RUN TestHandlerRcpttoRcpttoEmail/when_request_includes_valid_email_address_without_<>_sign
=== RUN TestHandlerRcpttoRcpttoEmail/when_request_includes_valid_email_address_with_<>_sign
=== RUN TestHandlerRcpttoRcpttoEmail/when_request_includes_invalid_email_address
--- PASS: TestHandlerRcpttoRcpttoEmail (0.01s)
--- PASS: TestHandlerRcpttoRcpttoEmail/when_request_includes_valid_email_address_without_<>_sign (0.00s)
--- PASS: TestHandlerRcpttoRcpttoEmail/when_request_includes_valid_email_address_with_<>_sign (0.00s)
--- PASS: TestHandlerRcpttoRcpttoEmail/when_request_includes_invalid_email_address (0.00s)
=== RUN TestHandlerRcpttoIsBlacklistedEmail
=== RUN TestHandlerRcpttoIsBlacklistedEmail/when_request_includes_blacklisted_domain_name
=== RUN TestHandlerRcpttoIsBlacklistedEmail/when_request_not_includes_blacklisted_domain_name
--- PASS: TestHandlerRcpttoIsBlacklistedEmail (0.00s)
--- PASS: TestHandlerRcpttoIsBlacklistedEmail/when_request_includes_blacklisted_domain_name (0.00s)
--- PASS: TestHandlerRcpttoIsBlacklistedEmail/when_request_not_includes_blacklisted_domain_name (0.00s)
=== RUN TestHandlerRcpttoIsNotRegisteredEmail
=== RUN TestHandlerRcpttoIsNotRegisteredEmail/when_request_includes_blacklisted_domain_name
=== RUN TestHandlerRcpttoIsNotRegisteredEmail/when_request_not_includes_blacklisted_domain_name
--- PASS: TestHandlerRcpttoIsNotRegisteredEmail (0.01s)
--- PASS: TestHandlerRcpttoIsNotRegisteredEmail/when_request_includes_blacklisted_domain_name (0.00s)
--- PASS: TestHandlerRcpttoIsNotRegisteredEmail/when_request_not_includes_blacklisted_domain_name (0.00s)
=== RUN TestHandlerRcpttoIsInvalidRequest
=== RUN TestHandlerRcpttoIsInvalidRequest/when_request_includes_invalid_RCPTTO_command_sequence
=== RUN TestHandlerRcpttoIsInvalidRequest/when_request_includes_invalid_RCPTTO_command_argument
=== RUN TestHandlerRcpttoIsInvalidRequest/when_request_includes_blacklisted_RCPTTO_email
=== RUN TestHandlerRcpttoIsInvalidRequest/when_request_includes_not_registered_RCPTTO_email
=== RUN TestHandlerRcpttoIsInvalidRequest/when_valid_RCPTTO_request
--- PASS: TestHandlerRcpttoIsInvalidRequest (0.02s)
--- PASS: TestHandlerRcpttoIsInvalidRequest/when_request_includes_invalid_RCPTTO_command_sequence (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidRequest/when_request_includes_invalid_RCPTTO_command_argument (0.00s)
--- PASS: TestHandlerRcpttoIsInvalidRequest/when_request_includes_blacklisted_RCPTTO_email (0.01s)
--- PASS: TestHandlerRcpttoIsInvalidRequest/when_request_includes_not_registered_RCPTTO_email (0.01s)
--- PASS: TestHandlerRcpttoIsInvalidRequest/when_valid_RCPTTO_request (0.01s)
=== RUN TestNewHandlerRset
=== RUN TestNewHandlerRset/returns_new_handlerRset
--- PASS: TestNewHandlerRset (0.00s)
--- PASS: TestNewHandlerRset/returns_new_handlerRset (0.00s)
=== RUN TestHandlerRsetRun
=== RUN TestHandlerRsetRun/when_successful_RSET_request
=== RUN TestHandlerRsetRun/when_failure_RSET_request,_invalid_command_sequence
=== RUN TestHandlerRsetRun/when_failure_RSET_request,_invalid_command
--- PASS: TestHandlerRsetRun (0.00s)
--- PASS: TestHandlerRsetRun/when_successful_RSET_request (0.00s)
--- PASS: TestHandlerRsetRun/when_failure_RSET_request,_invalid_command_sequence (0.00s)
--- PASS: TestHandlerRsetRun/when_failure_RSET_request,_invalid_command (0.00s)
=== RUN TestHandlerRsetClearMessage
=== RUN TestHandlerRsetClearMessage/when_not_multiple_message_receiving_condition_erases_all_message_data_except_HELO/EHLO_command_context
=== RUN TestHandlerRsetClearMessage/when_multiple_message_receiving_condition_does_not_updated_message
--- PASS: TestHandlerRsetClearMessage (0.00s)
--- PASS: TestHandlerRsetClearMessage/when_not_multiple_message_receiving_condition_erases_all_message_data_except_HELO/EHLO_command_context (0.00s)
--- PASS: TestHandlerRsetClearMessage/when_multiple_message_receiving_condition_does_not_updated_message (0.00s)
=== RUN TestHandlerRsetWriteResult
=== RUN TestHandlerRsetWriteResult/when_successful_request_received
=== RUN TestHandlerRsetWriteResult/when_failed_request_received
--- PASS: TestHandlerRsetWriteResult (0.00s)
--- PASS: TestHandlerRsetWriteResult/when_successful_request_received (0.00s)
--- PASS: TestHandlerRsetWriteResult/when_failed_request_received (0.00s)
=== RUN TestHandlerRsetIsInvalidCmdSequence
=== RUN TestHandlerRsetIsInvalidCmdSequence/when_helo_previous_command_was_failure_
=== RUN TestHandlerRsetIsInvalidCmdSequence/when_helo_previous_command_was_successful_
--- PASS: TestHandlerRsetIsInvalidCmdSequence (0.00s)
--- PASS: TestHandlerRsetIsInvalidCmdSequence/when_helo_previous_command_was_failure_ (0.00s)
--- PASS: TestHandlerRsetIsInvalidCmdSequence/when_helo_previous_command_was_successful_ (0.00s)
=== RUN TestHandlerRsetIsInvalidCmdArg
=== RUN TestHandlerRsetIsInvalidCmdArg/when_request_includes_invalid_RSET_command
=== RUN TestHandlerRsetIsInvalidCmdArg/when_request_includes_valid_RSET_command
--- PASS: TestHandlerRsetIsInvalidCmdArg (0.00s)
--- PASS: TestHandlerRsetIsInvalidCmdArg/when_request_includes_invalid_RSET_command (0.00s)
--- PASS: TestHandlerRsetIsInvalidCmdArg/when_request_includes_valid_RSET_command (0.00s)
=== RUN TestHandlerRsetIsInvalidRequest
=== RUN TestHandlerRsetIsInvalidRequest/when_request_includes_invalid_RSET_command_sequence,_the_previous_command_is_not_successful
=== RUN TestHandlerRsetIsInvalidRequest/when_request_includes_invalid_RSET_command
=== RUN TestHandlerRsetIsInvalidRequest/when_valid_RSET_request
--- PASS: TestHandlerRsetIsInvalidRequest (0.00s)
--- PASS: TestHandlerRsetIsInvalidRequest/when_request_includes_invalid_RSET_command_sequence,_the_previous_command_is_not_successful (0.00s)
--- PASS: TestHandlerRsetIsInvalidRequest/when_request_includes_invalid_RSET_command (0.00s)
--- PASS: TestHandlerRsetIsInvalidRequest/when_valid_RSET_request (0.00s)
=== RUN TestHandlerClearError
=== RUN TestHandlerClearError/erases_session_error
--- PASS: TestHandlerClearError (0.00s)
--- PASS: TestHandlerClearError/erases_session_error (0.00s)
=== RUN TestNewRegex
=== RUN TestNewRegex/valid_regex_pattern
=== RUN TestNewRegex/invalid_regex_pattern
--- PASS: TestNewRegex (0.00s)
--- PASS: TestNewRegex/valid_regex_pattern (0.00s)
--- PASS: TestNewRegex/invalid_regex_pattern (0.00s)
=== RUN TestMatchRegex
=== RUN TestMatchRegex/valid_regex_pattern,_matched_string
=== RUN TestMatchRegex/valid_regex_pattern,_not_matched_string
=== RUN TestMatchRegex/invalid_regex_pattern
--- PASS: TestMatchRegex (0.00s)
--- PASS: TestMatchRegex/valid_regex_pattern,_matched_string (0.00s)
--- PASS: TestMatchRegex/valid_regex_pattern,_not_matched_string (0.00s)
--- PASS: TestMatchRegex/invalid_regex_pattern (0.00s)
=== RUN TestRegexCaptureGroup
=== RUN TestRegexCaptureGroup/returns_string_when_regex_capture_group_found
=== RUN TestRegexCaptureGroup/returns_empty_string_when_regex_not_matched
=== RUN TestRegexCaptureGroup/returns_empty_string_when_regex_capture_group_not_found
--- PASS: TestRegexCaptureGroup (0.00s)
--- PASS: TestRegexCaptureGroup/returns_string_when_regex_capture_group_found (0.00s)
--- PASS: TestRegexCaptureGroup/returns_empty_string_when_regex_not_matched (0.00s)
--- PASS: TestRegexCaptureGroup/returns_empty_string_when_regex_capture_group_not_found (0.00s)
=== RUN TestIsIncluded
=== RUN TestIsIncluded/item_found_in_slice
=== RUN TestIsIncluded/item_not_found_in_slice
--- PASS: TestIsIncluded (0.00s)
--- PASS: TestIsIncluded/item_found_in_slice (0.00s)
--- PASS: TestIsIncluded/item_not_found_in_slice (0.00s)
=== RUN TestServerWithPortNumber
=== RUN TestServerWithPortNumber/returns_server_with_port_number
--- PASS: TestServerWithPortNumber (0.00s)
--- PASS: TestServerWithPortNumber/returns_server_with_port_number (0.00s)
=== RUN TestNewLogger
=== RUN TestNewLogger/when_log_to_stdout,_server_activity_enabled
=== RUN TestNewLogger/when_log_to_stdout,_server_activity_disabled
--- PASS: TestNewLogger (0.00s)
--- PASS: TestNewLogger/when_log_to_stdout,_server_activity_enabled (0.00s)
--- PASS: TestNewLogger/when_log_to_stdout,_server_activity_disabled (0.00s)
=== RUN TestEventLoggerInfoActivity
=== RUN TestEventLoggerInfoActivity/when_log_to_stdout_and_server_activity_enabled
=== RUN TestEventLoggerInfoActivity/when_log_to_stdout_disabled,_server_activity_enabled
=== RUN TestEventLoggerInfoActivity/when_log_to_stdout_enabled,_server_activity_disabled
--- PASS: TestEventLoggerInfoActivity (0.00s)
--- PASS: TestEventLoggerInfoActivity/when_log_to_stdout_and_server_activity_enabled (0.00s)
--- PASS: TestEventLoggerInfoActivity/when_log_to_stdout_disabled,_server_activity_enabled (0.00s)
--- PASS: TestEventLoggerInfoActivity/when_log_to_stdout_enabled,_server_activity_disabled (0.00s)
=== RUN TestEventLoggerInfo
=== RUN TestEventLoggerInfo/when_log_to_stdout_enabled
=== RUN TestEventLoggerInfo/when_log_to_stdout_disabled
--- PASS: TestEventLoggerInfo (0.00s)
--- PASS: TestEventLoggerInfo/when_log_to_stdout_enabled (0.00s)
--- PASS: TestEventLoggerInfo/when_log_to_stdout_disabled (0.00s)
=== RUN TestEventLoggerWarning
=== RUN TestEventLoggerWarning/when_log_to_stdout_enabled
=== RUN TestEventLoggerWarning/when_log_to_stdout_disabled
--- PASS: TestEventLoggerWarning (0.00s)
--- PASS: TestEventLoggerWarning/when_log_to_stdout_enabled (0.00s)
--- PASS: TestEventLoggerWarning/when_log_to_stdout_disabled (0.00s)
=== RUN TestEventLoggerError
=== RUN TestEventLoggerError/when_log_to_stdout_enabled
=== RUN TestEventLoggerError/when_log_to_stdout_disabled
--- PASS: TestEventLoggerError (0.00s)
--- PASS: TestEventLoggerError/when_log_to_stdout_enabled (0.00s)
--- PASS: TestEventLoggerError/when_log_to_stdout_disabled (0.00s)
=== RUN TestMessageHeloRequest
=== RUN TestMessageHeloRequest/getter_for_heloRequest_field
--- PASS: TestMessageHeloRequest (0.00s)
--- PASS: TestMessageHeloRequest/getter_for_heloRequest_field (0.00s)
=== RUN TestMessageHeloResponse
=== RUN TestMessageHeloResponse/getter_for_heloRequest_field
--- PASS: TestMessageHeloResponse (0.00s)
--- PASS: TestMessageHeloResponse/getter_for_heloRequest_field (0.00s)
=== RUN TestMessageHelo
=== RUN TestMessageHelo/getter_for_helo_field
--- PASS: TestMessageHelo (0.00s)
--- PASS: TestMessageHelo/getter_for_helo_field (0.00s)
=== RUN TestMessageMailfromRequest
=== RUN TestMessageMailfromRequest/getter_for_mailfromRequest_field
--- PASS: TestMessageMailfromRequest (0.00s)
--- PASS: TestMessageMailfromRequest/getter_for_mailfromRequest_field (0.00s)
=== RUN TestMessageMailfromResponse
=== RUN TestMessageMailfromResponse/getter_for_mailfromResponse_field
--- PASS: TestMessageMailfromResponse (0.00s)
--- PASS: TestMessageMailfromResponse/getter_for_mailfromResponse_field (0.00s)
=== RUN TestMessageMailfrom
=== RUN TestMessageMailfrom/getter_for_mailfrom_field
--- PASS: TestMessageMailfrom (0.00s)
--- PASS: TestMessageMailfrom/getter_for_mailfrom_field (0.00s)
=== RUN TestMessageRcpttoRequest
=== RUN TestMessageRcpttoRequest/getter_for_rcpttoRequest_field
--- PASS: TestMessageRcpttoRequest (0.00s)
--- PASS: TestMessageRcpttoRequest/getter_for_rcpttoRequest_field (0.00s)
=== RUN TestMessageRcpttoResponse
=== RUN TestMessageRcpttoResponse/getter_for_rcpttoResponse_field
--- PASS: TestMessageRcpttoResponse (0.00s)
--- PASS: TestMessageRcpttoResponse/getter_for_rcpttoResponse_field (0.00s)
=== RUN TestMessageRcptto
=== RUN TestMessageRcptto/getter_for_rcptto_field
--- PASS: TestMessageRcptto (0.00s)
--- PASS: TestMessageRcptto/getter_for_rcptto_field (0.00s)
=== RUN TestMessageDataRequest
=== RUN TestMessageDataRequest/getter_for_dataRequest_field
--- PASS: TestMessageDataRequest (0.00s)
--- PASS: TestMessageDataRequest/getter_for_dataRequest_field (0.00s)
=== RUN TestMessageDataResponse
=== RUN TestMessageDataResponse/getter_for_dataResponse_field
--- PASS: TestMessageDataResponse (0.00s)
--- PASS: TestMessageDataResponse/getter_for_dataResponse_field (0.00s)
=== RUN TestMessageData
=== RUN TestMessageData/getter_for_data_field
--- PASS: TestMessageData (0.00s)
--- PASS: TestMessageData/getter_for_data_field (0.00s)
=== RUN TestMessageMsgRequest
=== RUN TestMessageMsgRequest/getter_for_msgRequest_field
--- PASS: TestMessageMsgRequest (0.00s)
--- PASS: TestMessageMsgRequest/getter_for_msgRequest_field (0.00s)
=== RUN TestMessageMsgResponse
=== RUN TestMessageMsgResponse/getter_for_msgRequest_field
--- PASS: TestMessageMsgResponse (0.00s)
--- PASS: TestMessageMsgResponse/getter_for_msgRequest_field (0.00s)
=== RUN TestMessageMsg
=== RUN TestMessageMsg/getter_for_msg_field
--- PASS: TestMessageMsg (0.00s)
--- PASS: TestMessageMsg/getter_for_msg_field (0.00s)
=== RUN TestMessageRsetRequest
=== RUN TestMessageRsetRequest/getter_for_rsetRequest_field
--- PASS: TestMessageRsetRequest (0.00s)
--- PASS: TestMessageRsetRequest/getter_for_rsetRequest_field (0.00s)
=== RUN TestMessageRsetResponse
=== RUN TestMessageRsetResponse/getter_for_rsetRequest_field
--- PASS: TestMessageRsetResponse (0.00s)
--- PASS: TestMessageRsetResponse/getter_for_rsetRequest_field (0.00s)
=== RUN TestMessageRset
=== RUN TestMessageRset/getter_for_rset_field
--- PASS: TestMessageRset (0.00s)
--- PASS: TestMessageRset/getter_for_rset_field (0.00s)
=== RUN TestMessageQuitSent
=== RUN TestMessageQuitSent/getter_for_quitSent_field
--- PASS: TestMessageQuitSent (0.00s)
--- PASS: TestMessageQuitSent/getter_for_quitSent_field (0.00s)
=== RUN TestMessageIsConsistent
=== RUN TestMessageIsConsistent/when_consistent
=== RUN TestMessageIsConsistent/when_not_consistent_MAILFROM
=== RUN TestMessageIsConsistent/when_not_consistent_RCPTTO
=== RUN TestMessageIsConsistent/when_not_consistent_DATA
=== RUN TestMessageIsConsistent/when_not_consistent_MSG
--- PASS: TestMessageIsConsistent (0.00s)
--- PASS: TestMessageIsConsistent/when_consistent (0.00s)
--- PASS: TestMessageIsConsistent/when_not_consistent_MAILFROM (0.00s)
--- PASS: TestMessageIsConsistent/when_not_consistent_RCPTTO (0.00s)
--- PASS: TestMessageIsConsistent/when_not_consistent_DATA (0.00s)
--- PASS: TestMessageIsConsistent/when_not_consistent_MSG (0.00s)
=== RUN TestMessagesAppend
=== RUN TestMessagesAppend/addes_message_pointer_into_items_slice
--- PASS: TestMessagesAppend (0.00s)
--- PASS: TestMessagesAppend/addes_message_pointer_into_items_slice (0.00s)
=== RUN TestNewServer
=== RUN TestNewServer/creates_new_server
--- PASS: TestNewServer (0.00s)
--- PASS: TestNewServer/creates_new_server (0.00s)
=== RUN TestServerNewMessage
=== RUN TestServerNewMessage/pushes_new_message_into_server.messages,_returns_this_message
--- PASS: TestServerNewMessage (0.00s)
--- PASS: TestServerNewMessage/pushes_new_message_into_server.messages,_returns_this_message (0.00s)
=== RUN TestServerNewMessageWithHeloContext
=== RUN TestServerNewMessageWithHeloContext/pushes_new_message_into_server.messages_with_helo_context_from_other_message,_returns_this_message
--- PASS: TestServerNewMessageWithHeloContext (0.00s)
--- PASS: TestServerNewMessageWithHeloContext/pushes_new_message_into_server.messages_with_helo_context_from_other_message,_returns_this_message (0.00s)
=== RUN TestServerIsInvalidCmd
=== RUN TestServerIsInvalidCmd/when_valid_command
=== RUN TestServerIsInvalidCmd/when_valid_command#01
=== RUN TestServerIsInvalidCmd/when_valid_command#02
=== RUN TestServerIsInvalidCmd/when_valid_command#03
=== RUN TestServerIsInvalidCmd/when_valid_command#04
=== RUN TestServerIsInvalidCmd/when_valid_command#05
=== RUN TestServerIsInvalidCmd/when_invalid_command
--- PASS: TestServerIsInvalidCmd (0.00s)
--- PASS: TestServerIsInvalidCmd/when_valid_command (0.00s)
--- PASS: TestServerIsInvalidCmd/when_valid_command#01 (0.00s)
--- PASS: TestServerIsInvalidCmd/when_valid_command#02 (0.00s)
--- PASS: TestServerIsInvalidCmd/when_valid_command#03 (0.00s)
--- PASS: TestServerIsInvalidCmd/when_valid_command#04 (0.00s)
--- PASS: TestServerIsInvalidCmd/when_valid_command#05 (0.00s)
--- PASS: TestServerIsInvalidCmd/when_invalid_command (0.00s)
=== RUN TestServerRecognizeCommand
=== RUN TestServerRecognizeCommand/captures_the_first_word_divided_by_spaces,_converts_it_to_upper_case
--- PASS: TestServerRecognizeCommand (0.00s)
--- PASS: TestServerRecognizeCommand/captures_the_first_word_divided_by_spaces,_converts_it_to_upper_case (0.00s)
=== RUN TestServerAddToWaitGroup
=== RUN TestServerAddToWaitGroup/increases_count_of_goroutines_by_one
--- PASS: TestServerAddToWaitGroup (0.00s)
--- PASS: TestServerAddToWaitGroup/increases_count_of_goroutines_by_one (0.00s)
=== RUN TestServerRemoveFromWaitGroup
=== RUN TestServerRemoveFromWaitGroup/decreases_count_of_goroutines_by_one
--- PASS: TestServerRemoveFromWaitGroup (0.00s)
--- PASS: TestServerRemoveFromWaitGroup/decreases_count_of_goroutines_by_one (0.00s)
=== RUN TestServerIsAbleToEndSession
=== RUN TestServerIsAbleToEndSession/when_quit_command_has_been_sent
=== RUN TestServerIsAbleToEndSession/when_quit_command_has_not_been_sent,_error_has_been_found,_fail_fast_scenario_has_been_enabled
=== RUN TestServerIsAbleToEndSession/when_quit_command_has_not_been_sent,_no_errors
=== RUN TestServerIsAbleToEndSession/when_quit_command_has_not_been_sent,_error_has_been_found,_fail_fast_scenario_has_not_been_enabled
--- PASS: TestServerIsAbleToEndSession (0.00s)
--- PASS: TestServerIsAbleToEndSession/when_quit_command_has_been_sent (0.00s)
--- PASS: TestServerIsAbleToEndSession/when_quit_command_has_not_been_sent,_error_has_been_found,_fail_fast_scenario_has_been_enabled (0.00s)
--- PASS: TestServerIsAbleToEndSession/when_quit_command_has_not_been_sent,_no_errors (0.00s)
--- PASS: TestServerIsAbleToEndSession/when_quit_command_has_not_been_sent,_error_has_been_found,_fail_fast_scenario_has_not_been_enabled (0.00s)
=== RUN TestServerHandleSession
=== RUN TestServerHandleSession/when_complex_successful_session,_multiple_message_receiving_scenario_disabled
=== RUN TestServerHandleSession/when_complex_successful_session,_multiple_message_receiving_scenario_enabled
=== RUN TestServerHandleSession/when_invalid_command,_fail_fast_scenario_disabled
=== RUN TestServerHandleSession/when_invalid_command,_session_error,_fail_fast_scenario_enabled
=== RUN TestServerHandleSession/when_server_quit_channel_was_closed
=== RUN TestServerHandleSession/when_read_request_session_error
--- PASS: TestServerHandleSession (0.10s)
--- PASS: TestServerHandleSession/when_complex_successful_session,_multiple_message_receiving_scenario_disabled (0.04s)
--- PASS: TestServerHandleSession/when_complex_successful_session,_multiple_message_receiving_scenario_enabled (0.05s)
--- PASS: TestServerHandleSession/when_invalid_command,_fail_fast_scenario_disabled (0.00s)
--- PASS: TestServerHandleSession/when_invalid_command,_session_error,_fail_fast_scenario_enabled (0.01s)
--- PASS: TestServerHandleSession/when_server_quit_channel_was_closed (0.00s)
--- PASS: TestServerHandleSession/when_read_request_session_error (0.00s)
=== RUN TestServerStart
=== RUN TestServerStart/when_no_errors_happens_during_starting_and_running_the_server_with_default_port
=== RUN TestServerStart/when_no_errors_happens_during_starting_and_running_the_server_with_custom_port
=== RUN TestServerStart/when_active_server_doesn't_start_current_server
=== RUN TestServerStart/when_listener_error_happens_during_starting_the_server_doesn't_start_current_server
--- PASS: TestServerStart (0.01s)
--- PASS: TestServerStart/when_no_errors_happens_during_starting_and_running_the_server_with_default_port (0.01s)
--- PASS: TestServerStart/when_no_errors_happens_during_starting_and_running_the_server_with_custom_port (0.00s)
--- PASS: TestServerStart/when_active_server_doesn't_start_current_server (0.00s)
--- PASS: TestServerStart/when_listener_error_happens_during_starting_the_server_doesn't_start_current_server (0.00s)
=== RUN TestServerStop
=== RUN TestServerStop/when_server_active_stops_current_server,_graceful_shutdown_case
==================
WARNING: DATA RACE
Read at 0x00c0004a44c8 by goroutine 49:
github.com/mocktools/go-smtp-mock.TestServerStop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server_test.go:407 +0x553
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Previous write at 0x00c0004a44c8 by goroutine 45:
github.com/mocktools/go-smtp-mock.(*Server).Stop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server.go:101 +0x94
Goroutine 49 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:1486 +0x724
github.com/mocktools/go-smtp-mock.TestServerStop()
/wrk/github.com/mocktools/go-smtp-mock/server_test.go:391 +0x44
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Goroutine 45 (running) created at:
github.com/mocktools/go-smtp-mock.(*Server).Stop()
/wrk/github.com/mocktools/go-smtp-mock/server.go:98 +0x11d
github.com/mocktools/go-smtp-mock.TestServerStop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server_test.go:406 +0x524
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
==================
testing.go:1312: race detected during execution of test
=== RUN TestServerStop/when_server_active_stops_current_server,_force_shutdown_case
=== RUN TestServerStop/when_server_is_inactive_doesn't_stop_current_server
=== CONT TestServerStop
testing.go:1312: race detected during execution of test
--- FAIL: TestServerStop (1.00s)
--- FAIL: TestServerStop/when_server_active_stops_current_server,_graceful_shutdown_case (0.00s)
--- PASS: TestServerStop/when_server_active_stops_current_server,_force_shutdown_case (1.00s)
--- PASS: TestServerStop/when_server_is_inactive_doesn't_stop_current_server (0.00s)
=== RUN TestServerMessages
=== RUN TestServerMessages/when_there_are_no_messages_on_the_server
=== RUN TestServerMessages/when_there_are_messages_on_the_server
--- PASS: TestServerMessages (0.00s)
--- PASS: TestServerMessages/when_there_are_no_messages_on_the_server (0.00s)
--- PASS: TestServerMessages/when_there_are_messages_on_the_server (0.00s)
=== RUN TestTimeNow
=== RUN TestTimeNow/wrappes_time.Now()_in_function
--- PASS: TestTimeNow (0.00s)
--- PASS: TestTimeNow/wrappes_time.Now()_in_function (0.00s)
=== RUN TestTimeSleep
=== RUN TestTimeSleep/wrappes_time.Sleep()_in_function,_returns_delay
--- PASS: TestTimeSleep (0.00s)
--- PASS: TestTimeSleep/wrappes_time.Sleep()_in_function,_returns_delay (0.00s)
=== RUN TestSessionIsErrorFound
=== RUN TestSessionIsErrorFound/when_error_exists
=== RUN TestSessionIsErrorFound/when_error_not_exists
--- PASS: TestSessionIsErrorFound (0.00s)
--- PASS: TestSessionIsErrorFound/when_error_exists (0.00s)
--- PASS: TestSessionIsErrorFound/when_error_not_exists (0.00s)
=== RUN TestSessionAddError
=== RUN TestSessionAddError/assigns_error_to_session.err
--- PASS: TestSessionAddError (0.00s)
--- PASS: TestSessionAddError/assigns_error_to_session.err (0.00s)
=== RUN TestSessionClearError
=== RUN TestSessionClearError/clears_session.err
--- PASS: TestSessionClearError (0.00s)
--- PASS: TestSessionClearError/clears_session.err (0.00s)
=== RUN TestSessionSetTimeout
=== RUN TestSessionSetTimeout/sets_connection_deadline_for_session
=== RUN TestSessionSetTimeout/when_connection_error
--- PASS: TestSessionSetTimeout (0.00s)
--- PASS: TestSessionSetTimeout/sets_connection_deadline_for_session (0.00s)
--- PASS: TestSessionSetTimeout/when_connection_error (0.00s)
=== RUN TestSessionDiscardBufin
=== RUN TestSessionDiscardBufin/discardes_the_bufin_remnants
=== RUN TestSessionDiscardBufin/discardes_the_bufin_remnants_with_error
--- PASS: TestSessionDiscardBufin (0.00s)
--- PASS: TestSessionDiscardBufin/discardes_the_bufin_remnants (0.00s)
--- PASS: TestSessionDiscardBufin/discardes_the_bufin_remnants_with_error (0.00s)
=== RUN TestNewSession
=== RUN TestNewSession/creates_new_SMTP_session
--- PASS: TestNewSession (0.00s)
--- PASS: TestNewSession/creates_new_SMTP_session (0.00s)
=== RUN TestSessionReadRequest
=== RUN TestSessionReadRequest/extracts_trimmed_string_from_bufin_without_error
=== RUN TestSessionReadRequest/extracts_string_from_bufin_with_error
--- PASS: TestSessionReadRequest (0.00s)
--- PASS: TestSessionReadRequest/extracts_trimmed_string_from_bufin_without_error (0.00s)
--- PASS: TestSessionReadRequest/extracts_string_from_bufin_with_error (0.00s)
=== RUN TestSessionReadBytes
=== RUN TestSessionReadBytes/extracts_line_in_bytes_from_bufin_without_error
=== RUN TestSessionReadBytes/extracts_line_in_bytes_from_bufin_with_error
--- PASS: TestSessionReadBytes (0.00s)
--- PASS: TestSessionReadBytes/extracts_line_in_bytes_from_bufin_without_error (0.00s)
--- PASS: TestSessionReadBytes/extracts_line_in_bytes_from_bufin_with_error (0.00s)
=== RUN TestSessionResponseDelay
=== RUN TestSessionResponseDelay/when_default_session_response_delay
=== RUN TestSessionResponseDelay/when_custom_session_response_delay
--- PASS: TestSessionResponseDelay (0.00s)
--- PASS: TestSessionResponseDelay/when_default_session_response_delay (0.00s)
--- PASS: TestSessionResponseDelay/when_custom_session_response_delay (0.00s)
=== RUN TestSessionWriteResponse
=== RUN TestSessionWriteResponse/writes_server_response_to_bufout_without_response_delay_and_error
=== RUN TestSessionWriteResponse/writes_server_response_to_bufout_with_response_delay_and_without_error
=== RUN TestSessionWriteResponse/writes_server_response_to_bufout_with_error
--- PASS: TestSessionWriteResponse (0.00s)
--- PASS: TestSessionWriteResponse/writes_server_response_to_bufout_without_response_delay_and_error (0.00s)
--- PASS: TestSessionWriteResponse/writes_server_response_to_bufout_with_response_delay_and_without_error (0.00s)
--- PASS: TestSessionWriteResponse/writes_server_response_to_bufout_with_error (0.00s)
=== RUN TestSessionFinish
=== RUN TestSessionFinish/closes_session_connection_without_error
=== RUN TestSessionFinish/closes_session_connection_with_error
--- PASS: TestSessionFinish (0.00s)
--- PASS: TestSessionFinish/closes_session_connection_without_error (0.00s)
--- PASS: TestSessionFinish/closes_session_connection_with_error (0.00s)
=== RUN TestNew
=== RUN TestNew/creates_new_server_with_default_configuration_settings
=== RUN TestNew/creates_new_server_with_custom_configuration_settings
=== RUN TestNew/successful_iteration_with_new_server
==================
WARNING: DATA RACE
Read at 0x00c0001a7c68 by goroutine 31:
github.com/mocktools/go-smtp-mock.TestNew.func3()
/wrk/github.com/mocktools/go-smtp-mock/smtpmock_test.go:158 +0x3f7
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Previous write at 0x00c0001a7c68 by goroutine 27:
github.com/mocktools/go-smtp-mock.(*Server).Stop.func1()
/wrk/github.com/mocktools/go-smtp-mock/server.go:101 +0x94
Goroutine 31 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:1486 +0x724
github.com/mocktools/go-smtp-mock.TestNew()
/wrk/github.com/mocktools/go-smtp-mock/smtpmock_test.go:141 +0x84
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
Goroutine 27 (finished) created at:
github.com/mocktools/go-smtp-mock.(*Server).Stop()
/wrk/github.com/mocktools/go-smtp-mock/server.go:98 +0x11d
github.com/mocktools/go-smtp-mock.TestNew.func3()
/wrk/github.com/mocktools/go-smtp-mock/smtpmock_test.go:154 +0x351
testing.tRunner()
/usr/local/go/src/testing/testing.go:1439 +0x213
testing.(*T).Run.func1()
/usr/local/go/src/testing/testing.go:1486 +0x47
==================
testing.go:1312: race detected during execution of test
=== CONT TestNew
testing.go:1312: race detected during execution of test
--- FAIL: TestNew (0.03s)
--- PASS: TestNew/creates_new_server_with_default_configuration_settings (0.00s)
--- PASS: TestNew/creates_new_server_with_custom_configuration_settings (0.00s)
--- FAIL: TestNew/successful_iteration_with_new_server (0.03s)
=== CONT
testing.go:1312: race detected during execution of test
FAIL
FAIL github.com/mocktools/go-smtp-mock 1.399s
=== RUN TestMain
=== RUN TestMain/when_error_not_happened
=== RUN TestMain/when_error_happened
--- PASS: TestMain (0.00s)
--- PASS: TestMain/when_error_not_happened (0.00s)
--- PASS: TestMain/when_error_happened (0.00s)
=== RUN TestRun
=== RUN TestRun/when_command_line_argument_error
invalid value "a" for flag -port: parse error
Usage of some-path-to-the-program:
-blacklistedHeloDomains string
Blacklisted HELO domains, separated by commas
-blacklistedMailfromEmails string
Blacklisted MAIL FROM emails, separated by commas
-blacklistedRcpttoEmails string
Blacklisted RCPT TO emails, separated by commas
-failFast
Enables fail fast scenario. Disabled by default
-host string
Host address where smtpmock will run. It's equal to 127.0.0.1 by default
-log
Enables log server activity. Disabled by default
-msgDataReceived string
Custom DATA received message
-msgGreeting string
Custom server greeting message
-msgHeloBlacklistedDomain string
Custom HELO blacklisted domain message
-msgHeloReceived string
Custom HELO received message
-msgInvalidCmd string
Custom invalid command message
-msgInvalidCmdDataSequence string
Custom invalid command DATA sequence message
-msgInvalidCmdHeloArg string
Custom invalid command HELO argument message
-msgInvalidCmdHeloSequence string
Custom invalid command HELO sequence message
-msgInvalidCmdMailfromArg string
Custom invalid command MAIL FROM argument message
-msgInvalidCmdMailfromSequence string
Custom invalid command MAIL FROM sequence message
-msgInvalidCmdRcpttoArg string
Custom invalid command RCPT TO argument message
-msgInvalidCmdRcpttoSequence string
Custom invalid command RCPT TO sequence message
-msgInvalidCmdRsetArg string
Custom invalid command RSET message
-msgInvalidCmdRsetSequence string
Custom invalid command RSET sequence message
-msgMailfromBlacklistedEmail string
Custom MAIL FROM blacklisted email message
-msgMailfromReceived string
Custom MAIL FROM received message
-msgMsgReceived string
Custom received message body message
-msgMsgSizeIsTooBig string
Custom size is too big message
-msgQuitCmd string
Custom quit command message
-msgRcpttoBlacklistedEmail string
Custom RCPT TO blacklisted email message
-msgRcpttoNotRegisteredEmail string
Custom RCPT TO not registered email message
-msgRcpttoReceived string
Custom RCPT TO received message
-msgRsetReceived string
Custom RSET received message
-msgSizeLimit int
Message body size limit in bytes. It's equal to 10485760 bytes
-multipleMessageReceiving
Enables multiple message receiving scenario. Disabled by default
-notRegisteredEmails string
Not registered (non-existent) RCPT TO emails, separated by commas
-port int
Server port number. If not specified it will be assigned dynamically
-responseDelayData int
DATA response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayHelo int
HELO response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayMailfrom int
MAIL FROM response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayMessage int
Message response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayQuit int
QUIT response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayRcptto int
RCPT TO response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayRset int
RSET response delay in seconds. It runs immediately (equals to 0 seconds) by default
-sessionTimeout int
Session timeout in seconds. It's equal to 30 seconds by default
-shutdownTimeout int
Graceful shutdown timeout in seconds. It's equal to 1 second by default
-v Prints current smtpmock version
=== RUN TestRun/when_server_starting_error
=== RUN TestRun/when_server_was_started_successfully,_interrupt_signal_(exit_2)_received
=== RUN TestRun/when_server_was_started_successfully,_quit_signal_(exit_3)_received
=== RUN TestRun/when_server_was_started_successfully,_terminated_signal_(exit_15)_received
=== RUN TestRun/when_version_flag_passed
smtpmock: unknown-version
commit: unknown-commit
built at: unknown-buildtime
--- PASS: TestRun (0.00s)
--- PASS: TestRun/when_command_line_argument_error (0.00s)
--- PASS: TestRun/when_server_starting_error (0.00s)
--- PASS: TestRun/when_server_was_started_successfully,_interrupt_signal_(exit_2)_received (0.00s)
--- PASS: TestRun/when_server_was_started_successfully,_quit_signal_(exit_3)_received (0.00s)
--- PASS: TestRun/when_server_was_started_successfully,_terminated_signal_(exit_15)_received (0.00s)
--- PASS: TestRun/when_version_flag_passed (0.00s)
=== RUN TestToSlice
=== RUN TestToSlice/converts_string_separated_by_commas_to_slice_of_strings
--- PASS: TestToSlice (0.00s)
--- PASS: TestToSlice/converts_string_separated_by_commas_to_slice_of_strings (0.00s)
=== RUN TestPrintVersionData
=== RUN TestPrintVersionData/#00
--- PASS: TestPrintVersionData (0.00s)
--- PASS: TestPrintVersionData/#00 (0.00s)
=== RUN TestAttrFromCommandLine
=== RUN TestAttrFromCommandLine/when_known_flags_found_creates_pointer_to_ConfigurationAttr_based_on_passed_command_line_arguments
=== RUN TestAttrFromCommandLine/when_unknown_flags_found_sends_exit_signal
flag provided but not defined: -notKnownFlag
Usage of some-path-to-the-program:
-blacklistedHeloDomains string
Blacklisted HELO domains, separated by commas
-blacklistedMailfromEmails string
Blacklisted MAIL FROM emails, separated by commas
-blacklistedRcpttoEmails string
Blacklisted RCPT TO emails, separated by commas
-failFast
Enables fail fast scenario. Disabled by default
-host string
Host address where smtpmock will run. It's equal to 127.0.0.1 by default
-log
Enables log server activity. Disabled by default
-msgDataReceived string
Custom DATA received message
-msgGreeting string
Custom server greeting message
-msgHeloBlacklistedDomain string
Custom HELO blacklisted domain message
-msgHeloReceived string
Custom HELO received message
-msgInvalidCmd string
Custom invalid command message
-msgInvalidCmdDataSequence string
Custom invalid command DATA sequence message
-msgInvalidCmdHeloArg string
Custom invalid command HELO argument message
-msgInvalidCmdHeloSequence string
Custom invalid command HELO sequence message
-msgInvalidCmdMailfromArg string
Custom invalid command MAIL FROM argument message
-msgInvalidCmdMailfromSequence string
Custom invalid command MAIL FROM sequence message
-msgInvalidCmdRcpttoArg string
Custom invalid command RCPT TO argument message
-msgInvalidCmdRcpttoSequence string
Custom invalid command RCPT TO sequence message
-msgInvalidCmdRsetArg string
Custom invalid command RSET message
-msgInvalidCmdRsetSequence string
Custom invalid command RSET sequence message
-msgMailfromBlacklistedEmail string
Custom MAIL FROM blacklisted email message
-msgMailfromReceived string
Custom MAIL FROM received message
-msgMsgReceived string
Custom received message body message
-msgMsgSizeIsTooBig string
Custom size is too big message
-msgQuitCmd string
Custom quit command message
-msgRcpttoBlacklistedEmail string
Custom RCPT TO blacklisted email message
-msgRcpttoNotRegisteredEmail string
Custom RCPT TO not registered email message
-msgRcpttoReceived string
Custom RCPT TO received message
-msgRsetReceived string
Custom RSET received message
-msgSizeLimit int
Message body size limit in bytes. It's equal to 10485760 bytes
-multipleMessageReceiving
Enables multiple message receiving scenario. Disabled by default
-notRegisteredEmails string
Not registered (non-existent) RCPT TO emails, separated by commas
-port int
Server port number. If not specified it will be assigned dynamically
-responseDelayData int
DATA response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayHelo int
HELO response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayMailfrom int
MAIL FROM response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayMessage int
Message response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayQuit int
QUIT response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayRcptto int
RCPT TO response delay in seconds. It runs immediately (equals to 0 seconds) by default
-responseDelayRset int
RSET response delay in seconds. It runs immediately (equals to 0 seconds) by default
-sessionTimeout int
Session timeout in seconds. It's equal to 30 seconds by default
-shutdownTimeout int
Graceful shutdown timeout in seconds. It's equal to 1 second by default
-v Prints current smtpmock version
--- PASS: TestAttrFromCommandLine (0.00s)
--- PASS: TestAttrFromCommandLine/when_known_flags_found_creates_pointer_to_ConfigurationAttr_based_on_passed_command_line_arguments (0.00s)
--- PASS: TestAttrFromCommandLine/when_unknown_flags_found_sends_exit_signal (0.00s)
PASS
ok github.com/mocktools/go-smtp-mock/cmd 0.028s
? github.com/mocktools/go-smtp-mock/cmd/version [no test files]
FAIL
from go-smtp-mock.
@benjamin-rood First of all, thanks for your intention to improve smtpmock
. I have spend a lot of time for creating this tool.
To begin with, can you tell me: Am I doing it the correct way, by creating a mock server instance in TestMain?
The main idea of using was start iteration with server instance (with predefined behaviour) during tests and terminate after:
server := smtpmock.New(smtpmock.ConfigurationAttr{})
server.Start()
hostAddress, portNumber := "127.0.0.1", server.PortNumber
connection, _ := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", hostAddress, portNumber), time.Duration(2) * time.Second)
client, _ := smtp.NewClient(connection, hostAddress)
client.Hello("example.com")
client.Quit()
client.Close()
// Each result of SMTP session will be saved as message.
// To get access to server messages use Messages() method
server.Messages()
server.Stop()
Secondly, is this the first time you have encountered any reports of race conditions?
Yeah, your report has been the first. I am ashamed π, but I forgot to add the task about passing tests with a race flag to the backlog.
I've played with the code and seemingly fixed the race conditions, at least as they occur in the repo's own tests. Will push it soon as a PR where we can discuss the approach.
Awesome, thanks π I'll review it.
from go-smtp-mock.
" I am ashamed π" - Never, don't be. This project is awesome and it will only get better with these proposals
Thank you, Mark!
from go-smtp-mock.
@dandare100, @benjamin-rood Already in latest (2.0.0
) release π
from go-smtp-mock.
Related Issues (20)
- [FEATURE] Support for multiple mails over one connection HOT 2
- [FEATURE] Ability to use address literal as valid HELO command argument HOT 7
- [FEATURE] Optional message purge when retrieving messages HOT 6
- [FEATURE] Support multiple RCPT TO addresses on the same session HOT 13
- [QUESTION] Increase test coverage for handler type HOT 3
- [BUG] Autobuilds of smtpmock binary doesn't set version notes HOT 1
- [BUG] Invalid email can be passed as argument for MAIL FROM, RCPT TO commands
- [BUG] BrokenImport, could not import (no required module provides package) HOT 3
- [BUG] Data race between `newMessage()` and `Messages()` HOT 18
- [BUG] Email address with name is considered invalid HOT 3
- [FEATURE] Easy asserts for mail data
- [BUG] Cannot use localhost as domain in MAIL FROM HOT 1
- [FEATURE] Ability to drop client connection before run SMTP-session
- [FEATURE] Logging to testing logger HOT 1
- [BUG] RSET resets already sent message HOT 4
- [BUG] 2.3.0 broke message reading... HOT 2
- [FEATURE] Ability to specify dropping connection for first n attempts for each SMTP command
- [FEATURE] Ability to shutdown server with SIGQUIT
- [FEATURE] Ability to read server messages context HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. πππ
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google β€οΈ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go-smtp-mock.