xcknife 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aca898703e491f17c9923c8c7e28496e0cbac2e2ad1f9b82ae1a632142bacad9
4
- data.tar.gz: ea35d7ce95bd76c7d5011683047245a457668acf2b49c070808e99eb06be6da3
3
+ metadata.gz: d5e951e4ae5d93f82ed7773becf567d9ce8dc3a10295b3c9b7774617e1a10d48
4
+ data.tar.gz: 5f9cfc34b089ec42bf675280fd3fbf0da524220c79a55e0297ada05d0e3403d6
5
5
  SHA512:
6
- metadata.gz: 548661d771e7e367e9fd4cee9687761ecd8b1a504702816e096efd1a0b41c60454deda107f56e73096bd851b20d054931ef3b8605c90c87948d4af59aecad157
7
- data.tar.gz: 052d69c88e71f0ad388c676ee3f6f374c814b1acec74c090f27acb54541db02f189d3e18bf8e578947b5fa227931bbcfd9aa16ac087e0aee78652c9032c5441a
6
+ metadata.gz: a57b87ee14efa242124ad9e14c2d7bc86937315a8dc9e9206c80480285c4744495ad4376f02ad835f7c23e52e79ebbbc7f7cbcab9ba95a3b12d894aaed0daca9
7
+ data.tar.gz: 07afb2bc56b4792c355a89001cce7d45261358375457cff69f717b73ce3dbfb0c69ac91fee0b01714d1a8761869bbf1475c0044064aa74ae8e20023ef0fc8481
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.6.1
@@ -3,11 +3,7 @@ sudo: false
3
3
  matrix:
4
4
  include:
5
5
  - os: osx
6
- osx_image: xcode8
7
- - os: osx
8
- osx_image: xcode8.1
9
- - os: osx
10
- osx_image: xcode8.2
6
+ osx_image: xcode10.2
11
7
 
12
8
  before_script:
13
9
  - export LANG=en_US.UTF-8
data/Gemfile CHANGED
@@ -1,11 +1,8 @@
1
- source 'https://gems.vip.global.square'
2
- source 'https://gems.vip.global.square/private'
1
+ source 'https://rubygems.org'
3
2
 
4
3
  group :development, :test do
5
4
  gem 'rake', '~> 11.1.1'
6
5
  gem 'rspec', '~> 3.4.0'
7
6
  end
8
7
 
9
- gem 'sq-gem_tasks', '~> 1.0'
10
-
11
8
  gemspec
@@ -1,15 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xcknife (0.10.0)
4
+ xcknife (0.11.0)
5
5
 
6
6
  GEM
7
- remote: https://gems.vip.global.square/
8
- remote: https://gems.vip.global.square/private/
7
+ remote: https://rubygems.org/
9
8
  specs:
10
9
  diff-lcs (1.3)
11
10
  rake (11.1.2)
12
- rangeclient (0.0.17)
13
11
  rspec (3.4.0)
14
12
  rspec-core (~> 3.4.0)
15
13
  rspec-expectations (~> 3.4.0)
@@ -23,9 +21,6 @@ GEM
23
21
  diff-lcs (>= 1.2.0, < 2.0)
24
22
  rspec-support (~> 3.4.0)
25
23
  rspec-support (3.4.1)
26
- sq-gem_tasks (1.7.1)
27
- bundler (~> 1.6)
28
- rangeclient (>= 0.0.12)
29
24
 
30
25
  PLATFORMS
31
26
  ruby
@@ -34,7 +29,6 @@ DEPENDENCIES
34
29
  bundler (~> 1.12)
35
30
  rake (~> 11.1.1)
36
31
  rspec (~> 3.4.0)
37
- sq-gem_tasks (~> 1.0)
38
32
  xcknife!
39
33
 
40
34
  BUNDLED WITH
data/README.md CHANGED
@@ -9,7 +9,7 @@ It works by leveraging [xctool's](https://github.com/facebook/xctool) [json-stre
9
9
 
10
10
  XCKnife generates a list of only arguments meant to be pass to Xctool's [*-only* test arguments](https://github.com/facebook/xctool#testing), but alternatively could used to generate multiple xcschemes with the proper test partitions.
11
11
 
12
- More information on XCKnife, go [here](https://corner.squareup.com/2016/06/xcknife-faster-distributed-tests-for-ios.html).
12
+ More information on XCKnife, go [here](https://developer.squareup.com/blog/xcknife-faster-distributed-tests-for-ios).
13
13
 
14
14
  ## Install
15
15
 
@@ -194,6 +194,14 @@ XCKnife uses only a few attributes of a json-stream file. If you are storing the
194
194
 
195
195
  `$ xcknife-min example/xcknife-exemplar-historical-data.json-stream minified.json-stream`
196
196
 
197
+ ## Dependencies
198
+
199
+ XCKnife requires the use of the `gtimeout` command, which is provided in the GNU coreutils brew package. If you don't already have them, they can be installed with the command:
200
+
201
+ ```
202
+ brew install coreutils
203
+ ```
204
+
197
205
  ## Contributing
198
206
 
199
207
  Any contributors to the master *xcknife* repository must sign the
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'rspec/core/rake_task'
2
- require 'sq/gem_tasks'
3
2
  require 'fileutils'
4
3
 
5
4
  RSpec::Core::RakeTask.new(:spec)
@@ -1,6 +1,6 @@
1
1
  # TestDumper - EXPERIMENTAL
2
2
 
3
- Utility that replaces xctool for enumerating tests. It requires the `build-for-testing` feature Xcode8 introduced on xcodebuild. In particular, it leverages the xctestrun file (see `man xcodebuild.xctestrun`).
3
+ Utility that replaces xctool for enumerating tests. It requires the `build-for-testing` feature Xcode 8 introduced on xcodebuild. In particular, it leverages the xctestrun file (see `man xcodebuild.xctestrun`).
4
4
 
5
5
  ## Building.
6
6
 
@@ -17,6 +17,7 @@ $ xcknife-test-dumper --help
17
17
  Usage: xcknife-test-dumper [options] derived_data_folder output_file [device_id]
18
18
  -d, --debug Debug mode enabled
19
19
  -r, --retry-count COUNT Max retry count for simulator output
20
+ -x, --simctl-timeout SECONDS Max allowed time in seconds for simctl commands
20
21
  -t OUTPUT_FOLDER, Sets temporary Output folder
21
22
  --temporary-output
22
23
  -s, --scheme XCSCHEME_FILE Reads environments variables from the xcscheme file
@@ -181,7 +181,7 @@
181
181
  isa = PBXProject;
182
182
  attributes = {
183
183
  LastSwiftUpdateCheck = 0700;
184
- LastUpgradeCheck = 0700;
184
+ LastUpgradeCheck = 1010;
185
185
  ORGANIZATIONNAME = "Square, Inc";
186
186
  TargetAttributes = {
187
187
  F60C68B91B8D038300CC8521 = {
@@ -198,7 +198,7 @@
198
198
  };
199
199
  };
200
200
  };
201
- buildConfigurationList = F60C68B41B8D038300CC8521 /* Build configuration list for PBXProject "toolc" */;
201
+ buildConfigurationList = F60C68B41B8D038300CC8521 /* Build configuration list for PBXProject "TestDumper" */;
202
202
  compatibilityVersion = "Xcode 3.2";
203
203
  developmentRegion = English;
204
204
  hasScannedForEncodings = 0;
@@ -288,13 +288,23 @@
288
288
  CLANG_CXX_LIBRARY = "libc++";
289
289
  CLANG_ENABLE_MODULES = YES;
290
290
  CLANG_ENABLE_OBJC_ARC = YES;
291
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
291
292
  CLANG_WARN_BOOL_CONVERSION = YES;
293
+ CLANG_WARN_COMMA = YES;
292
294
  CLANG_WARN_CONSTANT_CONVERSION = YES;
295
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
293
296
  CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
294
297
  CLANG_WARN_EMPTY_BODY = YES;
295
298
  CLANG_WARN_ENUM_CONVERSION = YES;
299
+ CLANG_WARN_INFINITE_RECURSION = YES;
296
300
  CLANG_WARN_INT_CONVERSION = YES;
301
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
302
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
303
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
297
304
  CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
305
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
306
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
307
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
298
308
  CLANG_WARN_UNREACHABLE_CODE = YES;
299
309
  CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
300
310
  "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -337,13 +347,23 @@
337
347
  CLANG_CXX_LIBRARY = "libc++";
338
348
  CLANG_ENABLE_MODULES = YES;
339
349
  CLANG_ENABLE_OBJC_ARC = YES;
350
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
340
351
  CLANG_WARN_BOOL_CONVERSION = YES;
352
+ CLANG_WARN_COMMA = YES;
341
353
  CLANG_WARN_CONSTANT_CONVERSION = YES;
354
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
342
355
  CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
343
356
  CLANG_WARN_EMPTY_BODY = YES;
344
357
  CLANG_WARN_ENUM_CONVERSION = YES;
358
+ CLANG_WARN_INFINITE_RECURSION = YES;
345
359
  CLANG_WARN_INT_CONVERSION = YES;
360
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
361
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
362
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
346
363
  CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
364
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
365
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
366
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
347
367
  CLANG_WARN_UNREACHABLE_CODE = YES;
348
368
  CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
349
369
  "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -373,12 +393,13 @@
373
393
  F60C68D11B8D038300CC8521 /* Debug */ = {
374
394
  isa = XCBuildConfiguration;
375
395
  buildSettings = {
396
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
376
397
  CLANG_ENABLE_MODULES = YES;
398
+ CODE_SIGN_IDENTITY = "";
377
399
  DEFINES_MODULE = YES;
378
400
  DYLIB_COMPATIBILITY_VERSION = 1;
379
401
  DYLIB_CURRENT_VERSION = 1;
380
402
  DYLIB_INSTALL_NAME_BASE = "@rpath";
381
- EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
382
403
  FRAMEWORK_SEARCH_PATHS = (
383
404
  "$(inherited)",
384
405
  "$(SDKROOT)/../../Library/Frameworks/",
@@ -399,12 +420,13 @@
399
420
  F60C68D21B8D038300CC8521 /* Release */ = {
400
421
  isa = XCBuildConfiguration;
401
422
  buildSettings = {
423
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
402
424
  CLANG_ENABLE_MODULES = YES;
425
+ CODE_SIGN_IDENTITY = "";
403
426
  DEFINES_MODULE = YES;
404
427
  DYLIB_COMPATIBILITY_VERSION = 1;
405
428
  DYLIB_CURRENT_VERSION = 1;
406
429
  DYLIB_INSTALL_NAME_BASE = "@rpath";
407
- EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
408
430
  FRAMEWORK_SEARCH_PATHS = (
409
431
  "$(inherited)",
410
432
  "$(SDKROOT)/../../Library/Frameworks/",
@@ -483,7 +505,7 @@
483
505
  /* End XCBuildConfiguration section */
484
506
 
485
507
  /* Begin XCConfigurationList section */
486
- F60C68B41B8D038300CC8521 /* Build configuration list for PBXProject "toolc" */ = {
508
+ F60C68B41B8D038300CC8521 /* Build configuration list for PBXProject "TestDumper" */ = {
487
509
  isa = XCConfigurationList;
488
510
  buildConfigurations = (
489
511
  F60C68CE1B8D038300CC8521 /* Debug */,
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IDEDidComputeMac32BitWarning</key>
6
+ <true/>
7
+ </dict>
8
+ </plist>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <Scheme
3
- LastUpgradeVersion = "0800"
3
+ LastUpgradeVersion = "1010"
4
4
  version = "1.3">
5
5
  <BuildAction
6
6
  parallelizeBuildables = "YES"
@@ -7,13 +7,9 @@
7
7
  //
8
8
 
9
9
  @import Dispatch;
10
+ @import Foundation;
10
11
  @import XCTest;
11
12
 
12
-
13
-
14
-
15
- @class NSSet, NSString, NSURL, NSUUID;
16
-
17
13
  @interface XCTestConfiguration : NSObject <NSSecureCoding>
18
14
  {
19
15
  NSURL *_testBundleURL;
@@ -74,16 +70,20 @@
74
70
  // Logging
75
71
  FILE *logFile;
76
72
 
77
- void initializeLogFile(char *logFilePath)
73
+ void initializeLogFile(const char *logFilePath)
78
74
  {
79
75
  logFile = fopen(logFilePath, "w");
80
76
  }
81
77
 
82
- void logDebug(NSString *msg)
78
+ void logDebug(NSString *, ...) NS_FORMAT_FUNCTION(1, 2);
79
+ void logDebug(NSString *msg, ...)
83
80
  {
84
81
  assert(logFile);
85
- fprintf(logFile, "%s", msg.UTF8String);
86
- fprintf(logFile, "\n");
82
+ va_list varargs;
83
+ va_start(varargs, msg);
84
+ msg = [[NSString alloc] initWithFormat:msg arguments:varargs];
85
+ va_end(varargs);
86
+ fprintf(logFile, "%s\n", msg.UTF8String);
87
87
 
88
88
  NSLog(@"%@", msg);
89
89
  }
@@ -92,16 +92,20 @@ void logInit()
92
92
  {
93
93
  logDebug(@"Starting TestDumper...");
94
94
  logDebug(@"Environment Variables:");
95
- logDebug(NSProcessInfo.processInfo.environment.description);
95
+ logDebug(@"%@", NSProcessInfo.processInfo.environment.description);
96
96
  logDebug(@"Command Line Arguments:");
97
- logDebug(NSProcessInfo.processInfo.arguments.description);
97
+ logDebug(@"%@", NSProcessInfo.processInfo.arguments.description);
98
98
 
99
99
  logDebug(@"--------------------------------");
100
100
  }
101
101
 
102
- void logEnd()
102
+ OS_NORETURN
103
+ void logEnd(Boolean success)
103
104
  {
104
- logDebug(@"EndingTestDumper...");
105
+ int exitCode = success ? EXIT_SUCCESS : EXIT_FAILURE;
106
+ logDebug(@"EndingTestDumper...\nExiting with status %d", exitCode);
107
+ fclose(logFile);
108
+ exit(exitCode);
105
109
  }
106
110
 
107
111
  // Used for a structured log, just like Xctool's.
@@ -113,10 +117,10 @@ static void PrintJSON(FILE *outFile, id JSONObject)
113
117
 
114
118
  if (error) {
115
119
  fprintf(outFile, "{ \"message\" : \"Error while serializing to JSON. Check out simulator logs for details\" }");
116
- NSLog(@"ERROR: Error generating JSON for object: %s: %s\n",
120
+ logDebug(@"ERROR: Error generating JSON for object: %s: %s\n",
117
121
  [[JSONObject description] UTF8String],
118
122
  [[error localizedFailureReason] UTF8String]);
119
- exit(1);
123
+ logEnd(false);
120
124
  }
121
125
 
122
126
  fwrite([data bytes], 1, [data length], outFile);
@@ -146,7 +150,7 @@ static void PrintTestClass(FILE *outFile, NSString *testClass) {
146
150
  @"totalDuration" : @"0"});
147
151
  }
148
152
 
149
- void enumerateTests();
153
+ void enumerateTests(NSString *);
150
154
 
151
155
  const int TEST_TARGET_LEVEL = 0;
152
156
  const int TEST_CLASS_LEVEL = 1;
@@ -156,7 +160,7 @@ FILE *noteFile;
156
160
  __attribute__((constructor))
157
161
  void initialize() {
158
162
  NSLog(@"Starting TestDumper");
159
- char *logFilePath = [[[NSProcessInfo processInfo] arguments][3] UTF8String];
163
+ const char *logFilePath = [[[NSProcessInfo processInfo] arguments][3] UTF8String];
160
164
  initializeLogFile(logFilePath);
161
165
  logInit();
162
166
  NSString *testBundlePath = [[NSProcessInfo processInfo] arguments][4];
@@ -164,11 +168,11 @@ void initialize() {
164
168
  NSFileManager *fileManager = [NSFileManager defaultManager];
165
169
 
166
170
  if ([fileManager fileExistsAtPath:testDumperOutputPath]) {
167
- NSLog(@"File already exists %@. Stopping", testDumperOutputPath);
168
- exit(0);
171
+ logDebug(@"File already exists %@. Stopping", testDumperOutputPath);
172
+ logEnd(true);
169
173
  }
170
- NSString *testType = [NSString stringWithUTF8String: getenv("XCTEST_TYPE")];
171
174
 
175
+ NSString *testType = [NSString stringWithUTF8String: getenv("XCTEST_TYPE")];
172
176
  if ([testType isEqualToString: @"APPTEST"]) {
173
177
  [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
174
178
  enumerateTests(testBundlePath);
@@ -181,8 +185,7 @@ void initialize() {
181
185
  void enumerateTests(NSString *testBundlePath) {
182
186
  logDebug(@"Listing all test bundles");
183
187
  for (NSBundle *bundle in NSBundle.allBundles) {
184
- NSString *string = [@"Found a test bundle named: " stringByAppendingString:bundle.bundlePath];
185
- logDebug(string);
188
+ logDebug(@"Found a test bundle named: %@", bundle.bundlePath);
186
189
  }
187
190
  logDebug(@"Finished listing all test bundles");
188
191
 
@@ -192,19 +195,14 @@ void enumerateTests(NSString *testBundlePath) {
192
195
 
193
196
  logDebug(@"Listing all test bundles");
194
197
  for (NSBundle *bundle in NSBundle.allBundles) {
195
- NSString *string = [@"Found a test bundle named: " stringByAppendingString:bundle.bundlePath];
196
- logDebug(string);
198
+ logDebug(@"Found a test bundle named: %@", bundle.bundlePath);
197
199
  }
198
200
  logDebug(@"Finished listing all test bundles");
199
201
 
200
202
  NSString *testType = [NSString stringWithUTF8String: getenv("XCTEST_TYPE")];
201
203
  NSString *testTarget = [[[testBundlePath componentsSeparatedByString:@"/"] lastObject] componentsSeparatedByString:@"."][0];
202
204
 
203
- logDebug(@"The test target is:");
204
- logDebug(testTarget);
205
- if ([testType isEqualToString: @"APPTEST"]) {
206
- logDebug(@"IS APPTEST");
207
- }
205
+ logDebug(@"The test target is: %@ of type %@", testTarget, testType);
208
206
 
209
207
  FILE *outFile;
210
208
  NSString *testDumperOutputPath = NSProcessInfo.processInfo.environment[@"TestDumperOutputPath"];
@@ -215,11 +213,10 @@ void enumerateTests(NSString *testBundlePath) {
215
213
  outFile = fopen(testDumperOutputPath.UTF8String, "w+");
216
214
  }
217
215
 
218
- NSLog(@"Opened %@ with fd %p", testDumperOutputPath, outFile);
216
+ logDebug(@"Opened %@ with fd %p", testDumperOutputPath, outFile);
219
217
  if (outFile == NULL) {
220
- logDebug(@"File already exists. Stopping");
221
- NSLog(@"File already exists %@. Stopping", testDumperOutputPath);
222
- exit(0);
218
+ logDebug(@"File already exists at %@. Stopping", testDumperOutputPath);
219
+ logEnd(true);
223
220
  }
224
221
 
225
222
  PrintDumpStart(outFile, testType);
@@ -227,8 +224,7 @@ void enumerateTests(NSString *testBundlePath) {
227
224
  [testSuite printTestsWithLevel:0 withTarget: testTarget withParent: nil outputFile:outFile];
228
225
  PrintDumpEnd(outFile, testType);
229
226
  fclose(outFile);
230
- logEnd();
231
- exit(0);
227
+ logEnd(true);
232
228
  }
233
229
 
234
230
 
@@ -251,7 +247,7 @@ void enumerateTests(NSString *testBundlePath) {
251
247
  // nothing to do here
252
248
  break;
253
249
  default:
254
- NSLog(@"Uknown level %ld", level);
250
+ logDebug(@"Unknown test level %ld for test %@", level, t.debugDescription);
255
251
 
256
252
  }
257
253
  if (level == TEST_METHOD_LEVEL) {
@@ -7,5 +7,5 @@ require 'xcknife/exceptions'
7
7
  require 'xcknife/xcscheme_analyzer'
8
8
 
9
9
  module XCKnife
10
- VERSION = '0.10.0'
10
+ VERSION = '0.11.0'
11
11
  end
@@ -30,11 +30,12 @@ module XCKnife
30
30
  @logger = logger
31
31
  @logger.level = @debug ? Logger::DEBUG : Logger::FATAL
32
32
  @parser = nil
33
+ @simctl_timeout = 0
33
34
  end
34
35
 
35
36
  def run
36
37
  helper = TestDumperHelper.new(@device_id, @max_retry_count, @debug, @logger, @dylib_logfile_path,
37
- naive_dump_bundle_names: @naive_dump_bundle_names, skip_dump_bundle_names: @skip_dump_bundle_names)
38
+ naive_dump_bundle_names: @naive_dump_bundle_names, skip_dump_bundle_names: @skip_dump_bundle_names, simctl_timeout: @simctl_timeout)
38
39
  extra_environment_variables = parse_scheme_file
39
40
  logger.info { "Environment variables from xcscheme: #{extra_environment_variables.pretty_inspect}" }
40
41
  output_fd = File.open(@output_file, "w")
@@ -93,6 +94,7 @@ module XCKnife
93
94
  opts.banner += " #{arguments_banner}"
94
95
  opts.on("-d", "--debug", "Debug mode enabled") { |v| @debug = v }
95
96
  opts.on("-r", "--retry-count COUNT", "Max retry count for simulator output", Integer) { |v| @max_retry_count = v }
97
+ opts.on("-x", '--simctl-timeout SECONDS', "Max allowed time in seconds for simctl commands", Integer) { |v| @simctl_timeout = v }
96
98
  opts.on("-t", "--temporary-output OUTPUT_FOLDER", "Sets temporary Output folder") { |v| @temporary_output_folder = v }
97
99
  opts.on("-s", "--scheme XCSCHEME_FILE", "Reads environments variables from the xcscheme file") { |v| @xcscheme_file = v }
98
100
  opts.on("-l", "--dylib_logfile DYLIB_LOG_FILE", "Path for dylib log file") { |v| @dylib_logfile_path = v }
@@ -111,7 +113,7 @@ module XCKnife
111
113
  end
112
114
 
113
115
  def optional_arguments
114
- %w[device_id]
116
+ %w[device_id simctl_timeout]
115
117
  end
116
118
 
117
119
  def arguments_banner
@@ -150,7 +152,7 @@ module XCKnife
150
152
  attr_reader :logger
151
153
 
152
154
  def initialize(device_id, max_retry_count, debug, logger, dylib_logfile_path,
153
- naive_dump_bundle_names: [], skip_dump_bundle_names: [])
155
+ naive_dump_bundle_names: [], skip_dump_bundle_names: [], simctl_timeout: 0)
154
156
  @xcode_path = `xcode-select -p`.strip
155
157
  @simctl_path = `xcrun -f simctl`.strip
156
158
  @nm_path = `xcrun -f nm`.strip
@@ -161,6 +163,7 @@ module XCKnife
161
163
  @testroot = nil
162
164
  @device_id = device_id
163
165
  @max_retry_count = max_retry_count
166
+ @simctl_timeout = simctl_timeout
164
167
  @logger = logger
165
168
  @debug = debug
166
169
  @dylib_logfile_path = dylib_logfile_path if dylib_logfile_path
@@ -294,6 +297,27 @@ module XCKnife
294
297
  @simctl_path
295
298
  end
296
299
 
300
+ def wrapped_simctl(args)
301
+ args = [*gtimeout, simctl] + args
302
+ args
303
+ end
304
+
305
+ def gtimeout
306
+ return [] unless @simctl_timeout > 0
307
+
308
+ path = gtimeout_path
309
+ if path.empty?
310
+ puts "warning: simctl_timeout specified but 'gtimeout' is not installed. The specified timeout will be ignored."
311
+ return []
312
+ end
313
+
314
+ [path, "-k", "5", "#{@simctl_timeout}"]
315
+ end
316
+
317
+ def gtimeout_path
318
+ `which gtimeout`.strip
319
+ end
320
+
297
321
  def replace_vars(str, testhost = "<UNKNOWN>")
298
322
  str.gsub("__PLATFORMS__", @platforms_path).
299
323
  gsub("__TESTHOST__", testhost).
@@ -359,7 +383,7 @@ module XCKnife
359
383
  end
360
384
 
361
385
  def call_simctl(args, env: {}, **spawn_opts)
362
- args = [simctl] + args
386
+ args = wrapped_simctl(args)
363
387
  cmd = Shellwords.shelljoin(args)
364
388
  puts "Running:\n$ #{cmd}"
365
389
  logger.info { "Environment variables:\n #{env.pretty_print_inspect}" }
@@ -370,11 +394,7 @@ module XCKnife
370
394
  end
371
395
 
372
396
  def dylib_logfile_path
373
- if @dylib_logfile_path then
374
- @dylib_logfile_path
375
- else
376
- '/tmp/xcknife_testdumper_dylib.log'
377
- end
397
+ @dylib_logfile_path ||= '/tmp/xcknife_testdumper_dylib.log'
378
398
  end
379
399
 
380
400
  def xctest_type(test_bundle)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcknife
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Ribeiro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-12 00:00:00.000000000 Z
11
+ date: 2020-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,10 +38,8 @@ extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
40
40
  - ".gitignore"
41
- - ".hubkins"
42
41
  - ".rspec"
43
42
  - ".ruby-version"
44
- - ".sqiosbuild.json"
45
43
  - ".travis.yml"
46
44
  - CONTRIBUTING.md
47
45
  - Gemfile
@@ -53,6 +51,7 @@ files:
53
51
  - TestDumper/README.md
54
52
  - TestDumper/TestDumper.dylib
55
53
  - TestDumper/TestDumper.xcodeproj/project.pbxproj
54
+ - TestDumper/TestDumper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
56
55
  - TestDumper/TestDumper.xcodeproj/xcshareddata/xcschemes/TestDumper.xcscheme
57
56
  - TestDumper/TestDumper/Info.plist
58
57
  - TestDumper/TestDumper/Initialize.m
@@ -94,8 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
93
  - !ruby/object:Gem::Version
95
94
  version: '0'
96
95
  requirements: []
97
- rubyforge_project:
98
- rubygems_version: 2.7.4
96
+ rubygems_version: 3.0.8
99
97
  signing_key:
100
98
  specification_version: 4
101
99
  summary: Simple tool for optimizing XCTest runs across machines
data/.hubkins DELETED
@@ -1,5 +0,0 @@
1
- [build "PR"]
2
- template = iOS-Builder-Multi-Xcode-PR-Template
3
- build_script = ./sqiosbuild/sqiosbuild.sh specs
4
- trigger_build = true
5
- pull_request = true
@@ -1,6 +0,0 @@
1
- {
2
- "specs": {
3
- "post_build": ["bundle", "exec", "rake", "build_test_dumper", "spec"],
4
- "xcode_version": "9.4.0"
5
- }
6
- }