Class: Hive::Worker::Android

Inherits:
Hive::Worker show all
Defined in:
lib/hive/worker/android.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(device) ⇒ Android

Returns a new instance of Android.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/hive/worker/android.rb', line 22

def initialize(device)
  @serial = device['serial']
  @queue_prefix = device['queue_prefix'].to_s == '' ? '' : "#{device['queue_prefix']}-"
  @model = device['model'].downcase.gsub(/\s/, '_')
  @brand = device['brand'].downcase.gsub(/\s/, '_')
  @os_version = device['os_version']
  @worker_ports = PortReserver.new
  begin
    device.merge!({"device_api" => DeviceAPI::Android.device(@serial)})
  rescue DeviceAPI::DeviceNotFound
    Hive.logger.info("Device '#{@serial}' disconnected during initialization")
  rescue DeviceAPI::UnauthorizedDevice
    Hive.logger.info("Device '#{@serial}' is unauthorized")
  rescue DeviceAPI::Android::ADBCommandError
    Hive.logger.info("Device disconnected during worker initialization")
  rescue => e
    Hive.logger.warn("Error with connected device: #{e.message}")
  end
  set_device_status('happy')
  self.device = device
  super(device)
end

Instance Attribute Details

#deviceObject

Returns the value of attribute device.



20
21
22
# File 'lib/hive/worker/android.rb', line 20

def device
  @device
end

Instance Method Details

#adb_portObject



45
46
47
48
49
# File 'lib/hive/worker/android.rb', line 45

def adb_port
  # Assign adb port for this worker
  return @adb_port unless @adb_port.nil?
  @adb_port = @port_allocator.allocate_port
end

#autogenerated_queuesObject

def set_device_status(status)

# TODO Report to Hive Mind

end



102
103
104
105
106
107
108
109
110
111
# File 'lib/hive/worker/android.rb', line 102

def autogenerated_queues
  @log.info("Autogenerating queues")
  [
    "#{@queue_prefix}#{@model}",
    "#{@queue_prefix}#{@brand}",
    "#{@queue_prefix}android",
    "#{@queue_prefix}android-#{@os_version}",
    "#{@queue_prefix}android-#{@os_version}-#{@model}"
  ]
end

#hive_mind_device_identifiersObject



113
114
115
116
117
118
# File 'lib/hive/worker/android.rb', line 113

def hive_mind_device_identifiers
  {
    serial: @serial,
    device_type: 'Mobile'
  }
end

#job_message_klassObject



82
83
84
# File 'lib/hive/worker/android.rb', line 82

def job_message_klass
  Hive::Messages::AndroidJob
end

#post_script(job, file_system, script) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/hive/worker/android.rb', line 86

def post_script(job, file_system, script)
  @log.info('Post script')
  @worker_ports.ports.each do |name, port|
    @port_allocator.release_port(port)
  end
  set_device_status('happy')
end

#pre_script(job, file_system, script) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/hive/worker/android.rb', line 51

def pre_script(job, file_system, script)
  set_device_status('busy')
  script.set_env "TEST_SERVER_PORT",    adb_port

  # TODO: Allow the scheduler to specify the ports to use
  script.set_env "CHARLES_PROXY_PORT",  @worker_ports.reserve(queue_name: 'Charles') { @port_allocator.allocate_port }
  script.set_env "APPIUM_PORT",         @worker_ports.reserve(queue_name: 'Appium') { @port_allocator.allocate_port }
  script.set_env "BOOTSTRAP_PORT",      @worker_ports.reserve(queue_name: 'Bootstrap') { @port_allocator.allocate_port }
  script.set_env "CHROMEDRIVER_PORT",   @worker_ports.reserve(queue_name: 'Chromedriver') { @port_allocator.allocate_port }

  script.set_env 'ADB_DEVICE_ARG', self.device['serial']

  FileUtils.mkdir(file_system.home_path + '/build')
  apk_path = file_system.home_path + '/build/' + 'build.apk'

  script.set_env "APK_PATH", apk_path
  if job.build
    @log.debug("Fetching build")
    file_system.fetch_build(job.build, apk_path)
    @log.debug("Re-signing APK: #{job.resign}")
    if job.resign
      DeviceAPI::Android::Signing.sign_apk({apk: apk_path, resign: true})
      @log.debug("Signing done")
    end
  end

  DeviceAPI::Android.device(device['serial']).unlock

  "#{self.device['serial']} #{@worker_ports.ports['Appium']} #{apk_path} #{file_system.results_path}"
end