Move search and streaming spec manager classes to separate support files (#27727)
parent
02d27de5ce
commit
ae7c20b00c
|
@ -71,122 +71,3 @@ def expect_push_bulk_to_match(klass, matcher)
|
||||||
'args' => matcher,
|
'args' => matcher,
|
||||||
}))
|
}))
|
||||||
end
|
end
|
||||||
|
|
||||||
class StreamingServerManager
|
|
||||||
@running_thread = nil
|
|
||||||
|
|
||||||
def initialize
|
|
||||||
at_exit { stop }
|
|
||||||
end
|
|
||||||
|
|
||||||
def start(port: 4020)
|
|
||||||
return if @running_thread
|
|
||||||
|
|
||||||
queue = Queue.new
|
|
||||||
|
|
||||||
@queue = queue
|
|
||||||
|
|
||||||
@running_thread = Thread.new do
|
|
||||||
Open3.popen2e(
|
|
||||||
{
|
|
||||||
'REDIS_NAMESPACE' => ENV.fetch('REDIS_NAMESPACE'),
|
|
||||||
'DB_NAME' => "#{ENV.fetch('DB_NAME', 'mastodon')}_test#{ENV.fetch('TEST_ENV_NUMBER', '')}",
|
|
||||||
'RAILS_ENV' => ENV.fetch('RAILS_ENV', 'test'),
|
|
||||||
'NODE_ENV' => ENV.fetch('STREAMING_NODE_ENV', 'development'),
|
|
||||||
'PORT' => port.to_s,
|
|
||||||
},
|
|
||||||
'node index.js', # must not call yarn here, otherwise it will fail because yarn does not send signals to its child process
|
|
||||||
chdir: Rails.root.join('streaming')
|
|
||||||
) do |_stdin, stdout_err, process_thread|
|
|
||||||
status = :starting
|
|
||||||
|
|
||||||
# Spawn a thread to listen on streaming server output
|
|
||||||
output_thread = Thread.new do
|
|
||||||
stdout_err.each_line do |line|
|
|
||||||
Rails.logger.info "Streaming server: #{line}"
|
|
||||||
|
|
||||||
if status == :starting && line.match('Streaming API now listening on')
|
|
||||||
status = :started
|
|
||||||
@queue.enq 'started'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# And another thread to listen on commands from the main thread
|
|
||||||
loop do
|
|
||||||
msg = queue.pop
|
|
||||||
|
|
||||||
case msg
|
|
||||||
when 'stop'
|
|
||||||
# we need to properly stop the reading thread
|
|
||||||
output_thread.kill
|
|
||||||
|
|
||||||
# Then stop the node process
|
|
||||||
Process.kill('KILL', process_thread.pid)
|
|
||||||
|
|
||||||
# And we stop ourselves
|
|
||||||
@running_thread.kill
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# wait for 10 seconds for the streaming server to start
|
|
||||||
Timeout.timeout(10) do
|
|
||||||
loop do
|
|
||||||
break if @queue.pop == 'started'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def stop
|
|
||||||
return unless @running_thread
|
|
||||||
|
|
||||||
@queue.enq 'stop'
|
|
||||||
|
|
||||||
# Wait for the thread to end
|
|
||||||
@running_thread.join
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class SearchDataManager
|
|
||||||
def prepare_test_data
|
|
||||||
4.times do |i|
|
|
||||||
username = "search_test_account_#{i}"
|
|
||||||
account = Fabricate.create(:account, username: username, indexable: i.even?, discoverable: i.even?, note: "Lover of #{i}.")
|
|
||||||
2.times do |j|
|
|
||||||
Fabricate.create(:status, account: account, text: "#{username}'s #{j} post", visibility: j.even? ? :public : :private)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
3.times do |i|
|
|
||||||
Fabricate.create(:tag, name: "search_test_tag_#{i}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def indexes
|
|
||||||
[
|
|
||||||
AccountsIndex,
|
|
||||||
PublicStatusesIndex,
|
|
||||||
StatusesIndex,
|
|
||||||
TagsIndex,
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
def populate_indexes
|
|
||||||
indexes.each do |index_class|
|
|
||||||
index_class.purge!
|
|
||||||
index_class.import!
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def remove_indexes
|
|
||||||
indexes.each(&:delete!)
|
|
||||||
end
|
|
||||||
|
|
||||||
def cleanup_test_data
|
|
||||||
Status.destroy_all
|
|
||||||
Account.destroy_all
|
|
||||||
Tag.destroy_all
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SearchDataManager
|
||||||
|
def prepare_test_data
|
||||||
|
4.times do |i|
|
||||||
|
username = "search_test_account_#{i}"
|
||||||
|
account = Fabricate.create(:account, username: username, indexable: i.even?, discoverable: i.even?, note: "Lover of #{i}.")
|
||||||
|
2.times do |j|
|
||||||
|
Fabricate.create(:status, account: account, text: "#{username}'s #{j} post", visibility: j.even? ? :public : :private)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
3.times do |i|
|
||||||
|
Fabricate.create(:tag, name: "search_test_tag_#{i}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def indexes
|
||||||
|
[
|
||||||
|
AccountsIndex,
|
||||||
|
PublicStatusesIndex,
|
||||||
|
StatusesIndex,
|
||||||
|
TagsIndex,
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def populate_indexes
|
||||||
|
indexes.each do |index_class|
|
||||||
|
index_class.purge!
|
||||||
|
index_class.import!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def remove_indexes
|
||||||
|
indexes.each(&:delete!)
|
||||||
|
end
|
||||||
|
|
||||||
|
def cleanup_test_data
|
||||||
|
Status.destroy_all
|
||||||
|
Account.destroy_all
|
||||||
|
Tag.destroy_all
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,78 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class StreamingServerManager
|
||||||
|
@running_thread = nil
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
at_exit { stop }
|
||||||
|
end
|
||||||
|
|
||||||
|
def start(port: 4020)
|
||||||
|
return if @running_thread
|
||||||
|
|
||||||
|
queue = Queue.new
|
||||||
|
|
||||||
|
@queue = queue
|
||||||
|
|
||||||
|
@running_thread = Thread.new do
|
||||||
|
Open3.popen2e(
|
||||||
|
{
|
||||||
|
'REDIS_NAMESPACE' => ENV.fetch('REDIS_NAMESPACE'),
|
||||||
|
'DB_NAME' => "#{ENV.fetch('DB_NAME', 'mastodon')}_test#{ENV.fetch('TEST_ENV_NUMBER', '')}",
|
||||||
|
'RAILS_ENV' => ENV.fetch('RAILS_ENV', 'test'),
|
||||||
|
'NODE_ENV' => ENV.fetch('STREAMING_NODE_ENV', 'development'),
|
||||||
|
'PORT' => port.to_s,
|
||||||
|
},
|
||||||
|
'node index.js', # must not call yarn here, otherwise it will fail because yarn does not send signals to its child process
|
||||||
|
chdir: Rails.root.join('streaming')
|
||||||
|
) do |_stdin, stdout_err, process_thread|
|
||||||
|
status = :starting
|
||||||
|
|
||||||
|
# Spawn a thread to listen on streaming server output
|
||||||
|
output_thread = Thread.new do
|
||||||
|
stdout_err.each_line do |line|
|
||||||
|
Rails.logger.info "Streaming server: #{line}"
|
||||||
|
|
||||||
|
if status == :starting && line.match('Streaming API now listening on')
|
||||||
|
status = :started
|
||||||
|
@queue.enq 'started'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# And another thread to listen on commands from the main thread
|
||||||
|
loop do
|
||||||
|
msg = queue.pop
|
||||||
|
|
||||||
|
case msg
|
||||||
|
when 'stop'
|
||||||
|
# we need to properly stop the reading thread
|
||||||
|
output_thread.kill
|
||||||
|
|
||||||
|
# Then stop the node process
|
||||||
|
Process.kill('KILL', process_thread.pid)
|
||||||
|
|
||||||
|
# And we stop ourselves
|
||||||
|
@running_thread.kill
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# wait for 10 seconds for the streaming server to start
|
||||||
|
Timeout.timeout(10) do
|
||||||
|
loop do
|
||||||
|
break if @queue.pop == 'started'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop
|
||||||
|
return unless @running_thread
|
||||||
|
|
||||||
|
@queue.enq 'stop'
|
||||||
|
|
||||||
|
# Wait for the thread to end
|
||||||
|
@running_thread.join
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue