3 changed files with 121 additions and 119 deletions
@ -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