class TestScenario

Attributes

devices[RW]
execution_id[RW]
feature_file[RW]
kraken_app[RW]
reporter[RW]

Public Class Methods

new(kraken_app:, feature_file_path:) click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 24
def initialize(kraken_app:, feature_file_path:)
  @feature_file = FeatureFile.new(file_path: feature_file_path)
  @devices = sample_devices
  @kraken_app = kraken_app
  @execution_id = Digest::SHA256.hexdigest(Time.now.to_f.to_s)
  @reporter = Reporter.new(test_scenario: self)

  ensure_apk_specified_if_necessary
end
ready_to_finish?() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 96
def self.ready_to_finish?
  process_ids = DeviceProcess.registered_process_ids
  processes_finished = DeviceProcess.processes_in_state(
    K::PROCESS_STATES[:ready_to_finish]
  )
  process_ids.all? do |process_id|
    processes_finished.include?(process_id) ||
      Device.find_by_process_id(process_id)&.connected? == false
  end
end
ready_to_start?() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 85
def self.ready_to_start?
  process_ids = DeviceProcess.registered_process_ids
  processes_ready = DeviceProcess.processes_in_state(
    K::PROCESS_STATES[:ready_to_start]
  )
  process_ids.all? do |process_id|
    processes_ready.include?(process_id) ||
      Device.find_by_process_id(process_id)&.connected? == false
  end
end

Public Instance Methods

after_execution() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 59
def after_execution
  File.delete(K::DIRECTORY_PATH) if File.exist?(K::DIRECTORY_PATH)
  File.delete(K::DICTIONARY_PATH) if File.exist?(K::DICTIONARY_PATH)
  K::PROCESS_STATE_FILE_PATH.each do |_state, file_path|
    File.delete(file_path) if File.exist?(file_path)
  end
  @reporter.save_report
  notify_scenario_finished
end
before_execution() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 37
def before_execution
  setup_scenario_environment_variables
  delete_all_web_inboxes
  File.delete(K::DIRECTORY_PATH) if File.exist?(K::DIRECTORY_PATH)
  File.delete(K::DICTIONARY_PATH) if File.exist?(K::DICTIONARY_PATH)
  K::PROCESS_STATE_FILE_PATH.each do |_state, file_path|
    File.delete(file_path) if File.exist?(file_path)
  end
  @reporter.create_report_folder_requirements
end
execute() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 72
def execute
  Parallel.map_with_index(
    @devices, in_threads: @devices.count
  ) do |device, index|
    unless device.nil?
      user_id = index + 1
      start_process_for_user_id_in_device(
        user_id, device
      )
    end
  end
end
requires_predefined_devices?() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 107
def requires_predefined_devices?
  !ENV[K::CONFIG_PATH].nil?
end
run() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 48
def run
  unless @feature_file.right_syntax?
    raise "ERROR: Verify feature file #{@file_path} has one unique @user tag"\
    ' for each scenario'
  end

  before_execution
  execute
  after_execution
end

Private Instance Methods

apk_required?() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 209
def apk_required?
  sample_mobile_devices.any? && ENV[K::CONFIG_PATH].nil?
end
delete_all_web_inboxes() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 182
def delete_all_web_inboxes
  Dir.glob(".*_#{K::INBOX_FILE_NAME}").each do |file|
    File.delete(file)
  end
end
ensure_apk_specified_if_necessary() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 213
def ensure_apk_specified_if_necessary
  return unless apk_required?
  return unless @kraken_app&.apk_path.nil?

  raise 'ERROR: Invalid APK file path'
end
notify_scenario_finished() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 164
def notify_scenario_finished
  @kraken_app.on_test_scenario_finished
end
predefined_devices() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 188
def predefined_devices
  config_absolute_path = File.expand_path(ENV[K::CONFIG_PATH])
  file = open(config_absolute_path)
  content = file.read
  file.close
  devices_json = JSON.parse(content).values
  devices_json.map do |device_json|
    if device_json['type'] == K::ANDROID_DEVICE
      AndroidDevice.new(
        id: device_json['id'], model: device_json['model']
      )
    elsif device_json['type'] == K::WEB_DEVICE
      WebDevice.new(
        id: device_json['id'], model: device_json['model']
      )
    else
      raise 'ERROR: Platform not supported'
    end
  end
end
sample_devices() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 139
def sample_devices
  return predefined_devices if requires_predefined_devices?

  mobile = sample_mobile_devices
  web = sample_web_devices
  @feature_file.sorted_required_devices.map do |device|
    device[:system_type] == '@web' ? web.shift : mobile.shift
  end
end
sample_mobile_devices() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 149
def sample_mobile_devices
  android_devices = ADB.connected_devices
  android_devices.sample(
    @feature_file.number_of_required_mobile_devices
  )
end
sample_web_devices() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 156
def sample_web_devices
  web_devices = []
  @feature_file.number_of_required_web_devices.times do
    web_devices << WebDevice.factory_create
  end
  web_devices
end
setup_scenario_environment_variables() click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 220
def setup_scenario_environment_variables
  return if @kraken_app.nil? || @reporter.nil?

  @kraken_app.save_value_in_environment_variable_with_name(
    name: K::SCREENSHOT_PATH, value: @reporter.screenshot_path
  )
end
start_mobile_process_for_user_id_in_device(user_id, device) click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 123
def start_mobile_process_for_user_id_in_device(user_id, device)
  MobileProcess.new(
    id: user_id,
    device: device,
    test_scenario: self
  ).run
end
start_process_for_user_id_in_device(user_id, device) click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 113
def start_process_for_user_id_in_device(user_id, device)
  if device.is_a? AndroidDevice
    start_mobile_process_for_user_id_in_device(user_id, device)
  elsif device.is_a? WebDevice
    start_web_process_for_user_id_in_device(user_id, device)
  else
    raise 'ERROR: Platform not supported'
  end
end
start_web_process_for_user_id_in_device(user_id, device) click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 131
def start_web_process_for_user_id_in_device(user_id, device)
  WebProcess.new(
    id: user_id,
    device: device,
    test_scenario: self
  ).run
end
user_id_is_mobile?(user_id) click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 168
def user_id_is_mobile?(user_id)
  complement_tags = @feature_file.tags_for_user_id(user_id).map(
    &:downcase
  )
  complement_tags.include?('@mobile')
end
user_id_is_web?(user_id) click to toggle source
# File lib/kraken-mobile/test_scenario.rb, line 175
def user_id_is_web?(user_id)
  complement_tags = @feature_file.tags_for_user_id(user_id).map(
    &:downcase
  )
  complement_tags.include?('@web')
end