Build fix for non-USE_SIM_SERVICE_CONTEXT builds
[WebKit-https.git] / Tools / LayoutTestRelay / LayoutTestRelay / main.m
1 /*
2  * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "CoreSimulatorSPI.h"
27 #import "LTRelayController.h"
28 #import <Foundation/Foundation.h>
29
30 static LTRelayController *relayController;
31
32 void usage()
33 {
34     NSString *helpText = @"LayoutTestRelay: run a dump tool in the simulator. Not for direct consumption.\n"
35         "Usage: LayoutTestRelay [-h] [options] -- [dump tool arguments]\n"
36         "Required options:\n"
37         "    -udid <identifier>       Simulator device identifier\n"
38         "    -app <app_path>          Path to the built iOS .app bundle directory.\n"
39         "    -productDir <dir>        /path/to/WebKitBuild/{configuration}-{short platform}.\n";
40
41     fprintf(stderr, "%s\n", [helpText UTF8String]);
42 }
43
44 NSString *getRequiredStringArgument(NSString *parameter)
45 {
46     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
47     NSString *argument = [defaults stringForKey:parameter];
48
49     if (!argument) {
50         NSLog(@"-%@ is required.", parameter);
51         usage();
52         exit(EXIT_FAILURE);
53     }
54     return argument;
55 }
56
57 NSArray *getDumpToolArguments()
58 {
59     NSMutableArray *dumpToolArguments = [[NSMutableArray alloc] init];
60     NSArray *processArgs = [[NSProcessInfo processInfo] arguments];
61     BOOL appending = NO;
62     for (NSString *arg in processArgs) {
63         if ([arg isEqualToString:@"--"]) {
64             appending = YES;
65             continue;
66         }
67         if (appending)
68             [dumpToolArguments addObject:arg];
69     }
70     return dumpToolArguments;
71 }
72
73 void finish()
74 {
75     [relayController finish];
76 }
77
78 void receivedSignal(int signal)
79 {
80     exit(EXIT_SUCCESS);
81 }
82
83 int main(int argc, const char * argv[])
84 {
85     @autoreleasepool {
86         NSArray *helpArguments = @[@"-h", @"--help"];
87         for (NSString *helpArgument in helpArguments) {
88             if ([[[NSProcessInfo processInfo] arguments] indexOfObject:helpArgument] != NSNotFound) {
89                 usage();
90                 exit(EXIT_FAILURE);
91             }
92         }
93
94 #if USE_SIM_SERVICE_CONTEXT
95         NSString *developerDirectory = getRequiredStringArgument(@"developerDir");
96 #endif
97         NSUUID *udid = [[NSUUID alloc] initWithUUIDString:getRequiredStringArgument(@"udid")];
98         NSString *appPath = getRequiredStringArgument(@"app");
99         NSString *productDirectory = getRequiredStringArgument(@"productDir");
100         NSArray *dumpToolArguments = getDumpToolArguments();
101
102 #if USE_SIM_SERVICE_CONTEXT
103         NSError *error;
104         SimServiceContext *serviceContext = [SimServiceContext sharedServiceContextForDeveloperDir:developerDirectory error:&error];
105         if (!serviceContext) {
106             NSLog(@"Device context couldn't be found: %@", error);
107             exit(EXIT_FAILURE);
108         }
109         SimDeviceSet *deviceSet = [serviceContext defaultDeviceSetWithError:nil];
110         if (!deviceSet) {
111             NSLog(@"Default device set couldn't be found: %@", error);
112             exit(EXIT_FAILURE);
113         }
114         SimDevice *device = [deviceSet.devicesByUDID objectForKey:udid];
115 #else
116         SimDevice *device = [SimDeviceSet.defaultSet.devicesByUDID objectForKey:udid];
117 #endif
118         if (!device) {
119             NSLog(@"Device %@ couldn't be found", udid);
120             exit(EXIT_FAILURE);
121         }
122
123         relayController = [[LTRelayController alloc] initWithDevice:device productDir:productDirectory appPath:appPath deviceUDID:udid dumpToolArguments:dumpToolArguments];
124         [relayController start];
125
126         atexit(finish);
127         signal(SIGINT, receivedSignal);
128         signal(SIGTERM, receivedSignal);
129
130         [[NSRunLoop mainRunLoop] run];
131     }
132     return 0;
133 }