uispecrunner 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -31,11 +31,11 @@ to the spec runner. Example:
31
31
  - Will read common arguments from uispec.opts file for easy per project configuration
32
32
  - Includes a sample Rakefile for running your UISpec's
33
33
  - Support for setting arbitrary environment variables on the runner
34
+ - Supports running specs via shell (xcodebuild) or AppleScript (osascript)
34
35
 
35
36
  ## TODO
36
37
  - Auto-detect SDK versions available
37
38
  - Support for running specific files
38
- - Support for running non-headless (either via AppleScript or iphonesim)
39
39
  - Generate a Kicker script
40
40
  - Enabling Zombies (or other debugging flags, see http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/UnitTesting/RunIPhoneUnitTest.sh)
41
41
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.4
1
+ 0.3.0
@@ -0,0 +1,98 @@
1
+ class UISpecRunner
2
+ class Drivers
3
+ class OSAScript
4
+ attr_reader :config
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ def run_specs(env)
11
+ # Set the environment variables requested by the runner...
12
+ env_definitions = env.map do |key, value|
13
+ "my setEnvironmentVariable(\"#{key}\", \"#{value}\")"
14
+ end.join("\n")
15
+
16
+ script = <<-SCRIPT
17
+ on deactivateEnvironmentVariable(variableName)
18
+
19
+ tell application "Xcode"
20
+ tell active project document
21
+ set executableName to name of executable of active target as string
22
+ tell executable executableName
23
+
24
+ -- Check to see if the fallback path already exists
25
+ set hasVariable to false as boolean
26
+
27
+ repeat with environmentVariable in environment variables
28
+ if name of environmentVariable is equal to variableName then
29
+ set active of environmentVariable to no
30
+ end if
31
+ end repeat
32
+
33
+ end tell -- executable
34
+ end tell -- active project document
35
+ end tell -- Xcode
36
+
37
+ end deactivateEnvironmentVariable
38
+
39
+ on setEnvironmentVariable(variableName, variableValue)
40
+
41
+ tell application "Xcode"
42
+ tell active project document
43
+ set executableName to name of executable of active target as string
44
+ tell executable executableName
45
+
46
+ -- Check to see if the fallback path already exists
47
+ set hasVariable to false as boolean
48
+
49
+ repeat with environmentVariable in environment variables
50
+ if name of environmentVariable is equal to variableName then
51
+ -- Overwrite any value
52
+ set value of environmentVariable to variableValue
53
+ set active of environmentVariable to yes
54
+ set hasVariable to true as boolean
55
+ exit repeat
56
+ end if
57
+ end repeat
58
+
59
+ -- Since the fallback path doesn't exist yet, create it
60
+ if not hasVariable then
61
+ make new environment variable with properties {name:variableName, value:variableValue, active:yes}
62
+ end if
63
+ end tell -- executable
64
+ end tell -- active project document
65
+ end tell -- Xcode
66
+
67
+ end setEnvironmentVariable
68
+
69
+ application "iPhone Simulator" quit
70
+ -- application "iPhone Simulator" activate
71
+
72
+ tell application "Xcode"
73
+ set targetProject to project of active project document
74
+ #{env_definitions}
75
+
76
+ tell targetProject
77
+ set active build configuration type to build configuration type "Debug"
78
+ set active SDK to "iphonesimulator4.0"
79
+ set the active target to the target named "UISpec"
80
+ -- set value of build setting "SDKROOT" of build configuration "Debug" of active target to "iphoneos4.0"
81
+
82
+ build targetProject
83
+ launch targetProject
84
+
85
+ -- Clear out the environment variables
86
+ my deactivateEnvironmentVariable("UISPEC_PROTOCOL")
87
+ my deactivateEnvironmentVariable("UISPEC_SPEC")
88
+ my deactivateEnvironmentVariable("UISPEC_EXAMPLE")
89
+ end tell
90
+ end tell
91
+ SCRIPT
92
+ # puts "#{script}"
93
+ # exit
94
+ `osascript <<SCRIPT\n#{script}\nSCRIPT`
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,83 @@
1
+ require 'tmpdir'
2
+
3
+ class UISpecRunner
4
+ class Drivers
5
+ class Shell
6
+ attr_reader :config
7
+
8
+ def initialize(config)
9
+ @config = config
10
+ end
11
+
12
+ def run_specs(env)
13
+ if build_project!
14
+ run_env = self.env.merge(env)
15
+ run_env.merge!('DYLD_ROOT_PATH' => sdk_dir, 'IPHONE_SIMULATOR_ROOT' => sdk_dir, 'CFFIXED_USER_HOME' => Dir.tmpdir)
16
+ puts "Setting environment variables: #{run_env.inspect}" if uispec_runner.verbose?
17
+ with_env(run_env) do
18
+ start_securityd if config.securityd
19
+ command = "#{build_dir}/#{configuration}-iphonesimulator/#{target}.app/#{target} -RegisterForSystemEvents"
20
+ puts "Executing: #{command}" if config.verbose?
21
+ output = `#{command}`
22
+ exit_code = $?
23
+ unless exit_code == 0
24
+ puts "[!] Failed to run UISpec target: #{output}"
25
+ exit 1
26
+ end
27
+ end
28
+ else
29
+ puts "[!] Failed to build UISpecs.app"
30
+ exit 1
31
+ end
32
+ end
33
+
34
+ def with_env(env)
35
+ before = env.inject({}) { |h, (k, _)| h[k] = ENV[k]; h }
36
+ env.each { |k, v| ENV[k] = v }
37
+ yield
38
+ ensure
39
+ before.each { |k, v| ENV[k] = v }
40
+ end
41
+
42
+ def project_switch
43
+ "-project #{config.project}" if config.project
44
+ end
45
+
46
+ def sdk_switch
47
+ "-sdk #{sdk_dir}" if config.sdk_version
48
+ end
49
+
50
+ def sdk_dir
51
+ "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator#{config.sdk_version}.sdk"
52
+ end
53
+
54
+ def build_project!
55
+ command = "xcodebuild #{project_switch} -target #{config.target} -configuration #{config.configuration} #{sdk_switch} > /dev/null"
56
+ puts "Building project with: #{command}" if config.verbose?
57
+ system(command)
58
+ end
59
+
60
+ def run_command(command)
61
+ puts "Executing: #{command}" if config.verbose?
62
+ system(command)
63
+ end
64
+
65
+ def path_to_securityd
66
+ "#{sdk_dir}/usr/libexec/securityd"
67
+ end
68
+
69
+ def start_securityd
70
+ run_command("launchctl submit -l UISpecRunnerDaemons -- #{path_to_securityd}")
71
+ @securityd_running = true
72
+ Signal.trap("INT") { stop_securityd }
73
+ Signal.trap("TERM") { stop_securityd }
74
+ Signal.trap("EXIT") { stop_securityd }
75
+ end
76
+
77
+ def stop_securityd
78
+ run_command("launchctl remove UISpecRunnerDaemons") if @securityd_running
79
+ @securityd_running = false
80
+ end
81
+ end
82
+ end
83
+ end
@@ -19,6 +19,7 @@ class UISpecRunner
19
19
  self[:build_dir] = './build'
20
20
  self[:verbose] = false
21
21
  self[:sdk_version] = '3.0'
22
+ self[:driver] = :shell
22
23
 
23
24
  require 'optparse'
24
25
  @opts = OptionParser.new do |o|
@@ -52,6 +53,12 @@ class UISpecRunner
52
53
  self[:project] = project
53
54
  end
54
55
 
56
+ o.on('--driver [DRIVER]', [:shell, :osascript],
57
+ "Select driver (shell, osascript)",
58
+ 'Default: shell') do |driver|
59
+ self[:driver] = driver.to_sym
60
+ end
61
+
55
62
  o.on('--sdk [VERSION]',
56
63
  'Run the UISpec target against the iPhone SDK version',
57
64
  'Default: 3.0') do |sdk_version|
data/lib/uispecrunner.rb CHANGED
@@ -2,10 +2,11 @@
2
2
  # By: Blake Watters <blake@twotoasters.com>
3
3
  # Portions borrowed from Eloy Duran's Kicker script (http://github.com/alloy/UISpec)
4
4
 
5
- require 'tmpdir'
5
+ require 'uispecrunner/drivers/shell'
6
+ require 'uispecrunner/drivers/osascript'
6
7
 
7
- class UISpecRunner
8
- attr_accessor :project, :target, :configuration, :sdk_version, :build_dir, :verbose, :securityd, :env
8
+ class UISpecRunner
9
+ attr_accessor :project, :target, :configuration, :sdk_version, :build_dir, :verbose, :securityd, :driver, :env
9
10
 
10
11
  # private
11
12
  attr_accessor :run_mode, :spec, :example, :protocol
@@ -16,11 +17,12 @@ class UISpecRunner
16
17
  self.configuration ||= 'Debug'
17
18
  self.build_dir ||= './build'
18
19
  self.run_mode ||= :all
20
+ self.driver ||= :shell
19
21
  self.env ||= {}
20
22
  end
21
23
 
22
24
  def run!
23
- case run_mode
25
+ case self.run_mode
24
26
  when :all
25
27
  run_all!
26
28
  when :spec
@@ -30,7 +32,7 @@ class UISpecRunner
30
32
  when :protocol
31
33
  run_protocol!(self.protocol)
32
34
  else
33
- raise ArgumentError, "Unknown run mode: #{run_mode}"
35
+ raise ArgumentError, "Unknown run mode: #{config.run_mode}"
34
36
  end
35
37
  end
36
38
 
@@ -48,84 +50,24 @@ class UISpecRunner
48
50
 
49
51
  def run_spec_example!(spec_name, example_name)
50
52
  run_specs('UISPEC_SPEC' => spec_name, 'UISPEC_EXAMPLE' => example_name)
51
- end
53
+ end
52
54
 
53
55
  def verbose?
54
56
  self.verbose
55
57
  end
56
58
 
57
59
  private
58
- def run_command(command)
59
- puts "Executing: #{command}" if verbose?
60
- system(command)
61
- end
62
-
63
- def path_to_securityd
64
- "#{sdk_dir}/usr/libexec/securityd"
65
- end
66
-
67
- def start_securityd
68
- run_command("launchctl submit -l UISpecRunnerDaemons -- #{path_to_securityd}")
69
- @securityd_running = true
70
- Signal.trap("INT") { stop_securityd }
71
- Signal.trap("TERM") { stop_securityd }
72
- Signal.trap("EXIT") { stop_securityd }
73
- end
74
-
75
- def stop_securityd
76
- run_command("launchctl remove UISpecRunnerDaemons") if @securityd_running
77
- @securityd_running = false
60
+ def driver_class
61
+ if self.driver == :shell
62
+ UISpecRunner::Drivers::Shell
63
+ elsif self.driver == :osascript
64
+ UISpecRunner::Drivers::OSAScript
65
+ end
78
66
  end
79
67
 
80
68
  def run_specs(env = {})
81
- if build_project!
82
- run_env = self.env.merge(env)
83
- run_env.merge!('DYLD_ROOT_PATH' => sdk_dir, 'IPHONE_SIMULATOR_ROOT' => sdk_dir, 'CFFIXED_USER_HOME' => tmpdir)
84
- puts "Setting environment variables: #{run_env.inspect}" if verbose?
85
- with_env(run_env) do
86
- start_securityd if securityd
87
- command = "#{build_dir}/#{configuration}-iphonesimulator/#{target}.app/#{target} -RegisterForSystemEvents"
88
- puts "Executing: #{command}" if verbose?
89
- output = `#{command}`
90
- exit_code = $?
91
- unless exit_code == 0
92
- puts "[!] Failed to run UISpec target: #{output}"
93
- exit 1
94
- end
95
- end
96
- else
97
- puts "[!] Failed to build UISpecs.app"
98
- exit 1
99
- end
100
- end
101
-
102
- def sdk_dir
103
- "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator#{sdk_version}.sdk"
104
- end
105
-
106
- def tmpdir
107
- Dir.tmpdir
108
- end
109
-
110
- def project_switch
111
- "-project #{project}" if project
112
- end
113
-
114
- def sdk_switch
115
- "-sdk #{sdk_dir}" if sdk_version
116
- end
117
-
118
- def build_project!
119
- command = "xcodebuild #{project_switch} -target #{target} -configuration #{configuration} #{sdk_switch} > /dev/null"
120
- puts "Building project with: #{command}" if verbose?
121
- system(command)
122
- end
123
-
124
- def with_env(env)
125
- before = env.inject({}) { |h, (k, _)| h[k] = ENV[k]; h }
126
- env.each { |k, v| ENV[k] = v }
127
- yield
128
- ensure
129
- before.each { |k, v| ENV[k] = v }
69
+ puts "Running specs via #{driver}..."
70
+ driver = driver_class.new(self)
71
+ driver.run_specs(env)
130
72
  end
131
73
  end
data/uispecrunner.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{uispecrunner}
8
- s.version = "0.2.4"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Blake Watters"]
12
- s.date = %q{2010-07-30}
12
+ s.date = %q{2010-08-02}
13
13
  s.default_executable = %q{uispec}
14
14
  s.description = %q{Provides a simple Ruby interface for running UISpec iPhone tests}
15
15
  s.email = %q{blake@twotoasters.com}
@@ -28,6 +28,8 @@ Gem::Specification.new do |s|
28
28
  "bin/uispec",
29
29
  "lib/uispecrunner.rb",
30
30
  "lib/uispecrunner/application.rb",
31
+ "lib/uispecrunner/drivers/osascript.rb",
32
+ "lib/uispecrunner/drivers/shell.rb",
31
33
  "lib/uispecrunner/options.rb",
32
34
  "spec/options_spec.rb",
33
35
  "spec/spec.opts",
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- - 4
9
- version: 0.2.4
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Blake Watters
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-30 00:00:00 -04:00
17
+ date: 2010-08-02 00:00:00 -04:00
18
18
  default_executable: uispec
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -50,6 +50,8 @@ files:
50
50
  - bin/uispec
51
51
  - lib/uispecrunner.rb
52
52
  - lib/uispecrunner/application.rb
53
+ - lib/uispecrunner/drivers/osascript.rb
54
+ - lib/uispecrunner/drivers/shell.rb
53
55
  - lib/uispecrunner/options.rb
54
56
  - spec/options_spec.rb
55
57
  - spec/spec.opts