class RunLoop::DeviceAgent::Xcodebuild

@!visibility private

Public Class Methods

derived_data_directory() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 18
def self.derived_data_directory
  path = File.join(Xcodebuild.dot_dir, "DerivedData")
  FileUtils.mkdir_p(path) if !File.exist?(path)
  path
end
log_file() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 11
def self.log_file
  path = File.join(Xcodebuild.dot_dir, "xcodebuild.log")
  FileUtils.touch(path) if !File.exist?(path)
  path
end
process_env(pid) click to toggle source

@visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 176
def self.process_env(pid)
  options = {:log_cmd => true}
  args = ["ps", "-p", pid.to_s, "-wwwE"]
  hash = RunLoop::Shell.run_shell_command(args, options)
  hash[:out]
end
terminate_device_test(udid) click to toggle source

@visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 130
def self.terminate_device_test(udid)
  should_term_test = lambda do |process_description|
    process_description[/id=#{udid}/]
  end
  self.terminate_xcodebuild_test_processes(should_term_test)
end
terminate_simulator_tests() click to toggle source

@visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 121
def self.terminate_simulator_tests
  should_term_test = lambda do |process_description|
    xcodebuild_destination_is_simulator?(process_description)
  end

  self.terminate_xcodebuild_test_processes(should_term_test)
end
terminate_xcodebuild_test_process(pid) click to toggle source

@visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 150
def self.terminate_xcodebuild_test_process(pid)
  term_options = { :timeout => 1.5 }
  kill_options = { :timeout => 1.0 }

  process_name = "xcodebuild test-without-building"

  term = RunLoop::ProcessTerminator.new(pid.to_i,
                                        "TERM",
                                        process_name,
                                        term_options)
  if !term.kill_process
    kill = RunLoop::ProcessTerminator.new(pid.to_i,
                                          "KILL",
                                          process_name,
                                          kill_options)
    kill.kill_process
  end
  sleep(1.0)
end
terminate_xcodebuild_test_processes(should_term_test) click to toggle source

@visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 138
def self.terminate_xcodebuild_test_processes(should_term_test)
  options = { :timeout => 0.5, :raise_on_timeout => false }
  pids = RunLoop::ProcessWaiter.new("xcodebuild", options).pids
  pids.each do |pid|
    if should_term_test.call(process_env(pid))
      RunLoop.log_debug("Will terminate xcodebuild process: #{pid}")
      terminate_xcodebuild_test_process(pid)
    end
  end
end
xcodebuild_destination_is_simulator?(process_description) click to toggle source

@visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 171
def self.xcodebuild_destination_is_simulator?(process_description)
  process_description[/-destination id=#{RunLoop::Regex::CORE_SIMULATOR_UDID_REGEX}/]
end

Public Instance Methods

default_workspace() click to toggle source
# File lib/run_loop/device_agent/xcodebuild.rb, line 114
def default_workspace
  this_dir = File.expand_path(File.dirname(__FILE__))
  relative = File.expand_path(File.join(this_dir, "..", "..", "..", ".."))
  File.join(relative, "DeviceAgent.iOS/DeviceAgent.xcworkspace")
end
inspect() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 30
def inspect
  to_s
end
launch(_) click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 40
def launch(_)
  workspace

  if device.simulator?
    # quits the simulator
    # sim = CoreSimulator.new(device, "")
    # sim.launch_simulator({:wait_for_stable => false})
  end

  xcodebuild
end
name() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 35
def name
  :xcodebuild
end
to_s() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 25
def to_s
  "#<Xcodebuild #{workspace}>"
end
workspace() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 53
      def workspace
        @workspace ||= begin
          path = RunLoop::Environment.send(:cbxws) || default_workspace

          if File.exist?(path)
            path
          else
            raise(RuntimeError, %Q[
Cannot find the DeviceAgent.xcworkspace.

Expected it here:

  #{path}

Use the CBXWS environment variable to override the default.

])

          end
        end
      end
xcodebuild() click to toggle source

@!visibility private

# File lib/run_loop/device_agent/xcodebuild.rb, line 76
def xcodebuild
  env = {
    "COMMAND_LINE_BUILD" => "1",
    "CLOBBER" => "1"
  }

  args = [
    "xcrun",
    "xcodebuild",
    "-derivedDataPath", Xcodebuild.derived_data_directory,
    "-scheme", "AppStub",
    "-workspace", workspace,
    "-config", "Debug",
    "-destination",
    "id=#{device.udid}",
    "test"
  ]

  log_file = Xcodebuild.log_file

  options = {
    :out => log_file,
    :err => log_file
  }

  command = "#{env.map.each { |k, v| "#{k}=#{v}" }.join(" ")} #{args.join(" ")}"
  RunLoop.log_unix_cmd("#{command} >& #{log_file}")

  pid = Process.spawn(env, *args, options)
  Process.detach(pid)

  sleep_for = 15
  RunLoop.log_debug("Waiting #{sleep_for} seconds for DeviceAgent to build...")
  sleep(sleep_for)

  pid.to_i
end