Skip to content

Commit 5de57d9

Browse files
authored
🔀 Merge pull request #520 from ruby/fix-flaky-fake_server-connection-close
✅ Fix flaky tests with `FakeServer#Connection#close` mutex
2 parents 16b9410 + 2c49cfa commit 5de57d9

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

‎test/net/imap/fake_server/connection.rb‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def initialize(server, tcp_socket:)
1515
@reader = CommandReader.new socket
1616
@writer = ResponseWriter.new socket, config: config, state: state
1717
@router = CommandRouter.new writer, config: config, state: state
18+
@mutex = Thread::Mutex.new
1819
end
1920

2021
def commands; state.commands end
@@ -31,11 +32,13 @@ def run
3132
end
3233

3334
def close
34-
unless state.logout?
35-
state.logout
36-
writer.bye
35+
@mutex.synchronize do
36+
unless state.logout?
37+
state.logout
38+
writer.bye
39+
end
40+
socket&.close unless socket&.closed?
3741
end
38-
socket&.close unless socket&.closed?
3942
end
4043

4144
private

‎test/net/imap/fake_server/connection_state.rb‎

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,21 @@
33
class Net::IMAP::FakeServer
44

55
class ConnectionState
6+
Error = Class.new(RuntimeError)
7+
8+
class InvalidStateChange < Error
9+
def initialize(msg = "invalid state change", *args, **change)
10+
msg = "%s: %p" % [msg, change] if change
11+
super(msg, *args)
12+
end
13+
end
14+
15+
class AlreadyLoggedOut < InvalidStateChange
16+
def initialize(msg = "already logged out", *args)
17+
super(msg, *args)
18+
end
19+
end
20+
621
attr_reader :user
722
attr_reader :session
823
attr_reader :enabled
@@ -46,29 +61,30 @@ def selected?; name == :selected end
4661
def logout?; name == :logout end
4762

4863
def authenticate(user)
49-
not_authenticated? or raise "invalid state change"
64+
not_authenticated? or raise InvalidStateChange, name => :authenticated
5065
user or raise ArgumentError
5166
@user = user
5267
end
5368

5469
def select(mbox:, **options)
55-
authenticated? || selected? or raise "invalid state change"
70+
authenticated? || selected? or raise InvalidStateChange, name => :selected
5671
mbox or raise ArgumentError
5772
@session = Session.new mbox: mbox, **options
5873
end
5974

6075
def unselect
61-
selected? or raise "invalid state change"
76+
selected? or raise InvalidStateChange, selected: :authenticated
6277
@session = nil
6378
end
6479

6580
def unauthenticate
66-
authenticated? || selected? or raise "invalid state change"
81+
authenticated? || selected? or
82+
raise InvalidStateChange, name => :not_authenticated
6783
@user = @selected = nil
6884
end
6985

7086
def logout
71-
!logout? or raise "already logged out"
87+
!logout? or raise AlreadyLoggedOut
7288
@logout = true
7389
end
7490

0 commit comments

Comments
 (0)