Warning, /plasma/drkonqi/src/tests/integration/suite is written in an unsupported language. File is not indexed.

0001 #!/usr/bin/env ruby
0002 # SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0003 # SPDX-FileCopyrightText: 2017 Harald Sitter <sitter@kde.org>
0004 
0005 
0006 require 'fileutils'
0007 require 'optparse'
0008 require 'tmpdir'
0009 
0010 STDOUT.sync = true # force immediate flushing without internal caching
0011 
0012 class Isolator
0013   def mangle_env(tmpdir)
0014     ENV['HOME'] = tmpdir
0015     ENV.keys.each { |k| ENV.delete(k) if k.start_with?('XDG_') }
0016   end
0017 
0018   private
0019 
0020   def dbus_run(cmd)
0021     warn dbus_run_cmd(cmd)
0022     system(dbus_run_cmd(cmd))
0023   end
0024 
0025   def dbus_run_cmd(cmd)
0026     "dbus-run-session -- #{cmd}"
0027   end
0028 end
0029 
0030 # Isolates GUI via xephyr
0031 class XephyrIsolator < Isolator
0032   def run(cmd)
0033     ephemeral('Xephyr -screen 1024x768x24+32 :666') do
0034       ENV['DISPLAY'] = ':666'
0035       dbus_run(cmd) || raise
0036     end
0037   end
0038 
0039   private
0040 
0041   def ephemeral(*args)
0042     pid = spawn(*args)
0043     yield
0044   ensure
0045     Process.kill('KILL', pid) if pid
0046     Process.waitpid2(pid) if pid
0047   end
0048 end
0049 
0050 # Isolates GUI via xvfb-run
0051 class XvfbIsolator < Isolator
0052   def run(cmd)
0053     warn "xvfb-run -a --server-args=\"-screen 0 1024x768x24\" #{dbus_run_cmd(cmd)}"
0054     system("xvfb-run -a --server-args=\"-screen 0 1024x768x24\" #{dbus_run_cmd(cmd)}") || raise
0055   end
0056 end
0057 
0058 class NoIsolator < Isolator
0059   def mangle_env(*)
0060     # noop without isolation
0061   end
0062 
0063   def run(cmd)
0064     # No X11 and no DBus isolation.
0065     warn cmd.to_s
0066     system(cmd) || raise
0067   end
0068 end
0069 
0070 def new_isolator
0071   return NoIsolator.new if ENV['JENKINS_SERVER_COOKIE'] || ENV['NO_ISOLATOR']
0072   return XephyrIsolator.new if ENV['XEPHYR']
0073   XvfbIsolator.new
0074 end
0075 
0076 OptionParser.new do |opts|
0077   opts.banner = "Usage: #{$0} ARGS"
0078 
0079   opts.separator('')
0080 
0081   opts.on('--drkonqi PATH', 'Path to drkonqi bin to test.') do |v|
0082     ENV['DRKONQI_PATH'] = v
0083   end
0084 
0085   opts.on('--at-spi-bus-launcher PATH',
0086           'Path to --at-spi-bus-launcher bin to use for testing.') do |v|
0087     ENV['AT_SPI_BUS_LAUNCHER_PATH'] = v
0088   end
0089 
0090   opts.on('--at-spi-registryd PATH',
0091           'Path to registry bin to use for testing.') do |v|
0092     ENV['AT_SPI_REGISTRY_PATH'] = v
0093   end
0094 end.parse!
0095 
0096 ENV['DRKONQI_PATH'] ||= '/usr/lib/x86_64-linux-gnu/libexec/drkonqi'
0097 ENV['AT_SPI_BUS_LAUNCHER_PATH'] ||= '/usr/lib/at-spi2-core/at-spi-bus-launcher'
0098 ENV['AT_SPI_REGISTRY_PATH'] ||= '/usr/lib/at-spi2-core/at-spi2-registryd'
0099 ENV['KIO_DISABLE_CACHE_CLEANER'] = '1' # do not start the cleaner, it'll dangle
0100 ENV['DRKONQI_IGNORE_QUALITY'] = '1'
0101 
0102 # Isolate ourselves by forcing into a separate home and unsetting the XDG path
0103 # variables. Then spin up a suitable virtual X, run a new dbus session bus
0104 # and our test in that environment.
0105 Dir.mktmpdir do |tmpdir|
0106   Dir.glob("#{__dir__}/*_test.rb").each do |test|
0107     isolator = new_isolator
0108     isolator.mangle_env(tmpdir)
0109     isolator.run("ruby '#{test}' -p")
0110   end
0111   sleep 2 # Wait a bit to make sure all children are dead.
0112 end
0113 
0114 warn 'all done'
0115 system 'ps -ejH'
0116 exit 0