Build fix.
[WebKit-https.git] / Tools / LayoutTestRelay / LayoutTestRelay / main.m
1 /*
2  * Copyright (C) 2014 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     "    -app <app_path>          Path to the built iOS .app bundle directory.\n"
38     "    -runtime <identifier>    iOS Simulator Runtime identifier (see `xcrun -sdk iphonesimulator simctl`)\n"
39     "    -deviceType <identifier> iOS Simulator device identifier (see simctl).\n"
40     "    -suffix <text>           Used to create multiple unique instances when installing to the simulator.\n"
41     "    -productDir <dir>        /path/to/WebKitBuild/{configuration}-{short platform}.\n";
42
43     fprintf(stderr, "%s\n", [helpText UTF8String]);
44 }
45
46 SimDevice *getTestingSimDevice(SimDeviceType *deviceType, SimRuntime *runtime, NSString *suffix)
47 {
48     NSString *deviceName = [[[[deviceType identifier] componentsSeparatedByString:@"."] lastObject] stringByReplacingOccurrencesOfString:@"-" withString:@" "];
49     deviceName = [NSString stringWithFormat:@"%@%@%@", deviceName, @" WebKit Tester", suffix];
50
51 #pragma clang diagnostic push
52 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
53     for (SimDevice *device in [[SimDeviceSet defaultSet] devices]) {
54         if ([[device name] isEqualToString:deviceName] && [[device deviceType] isEqualTo:deviceType] && [[device runtime] isEqualTo:runtime])
55             return device;
56     }
57
58     NSError *error;
59     SimDevice *device = [[SimDeviceSet defaultSet] createDeviceWithType:deviceType runtime:runtime name:deviceName error:&error];
60 #pragma clang diagnostic pop
61
62     if (error) {
63         NSLog(@"Couldn't create device: %@", [error description]);
64         return nil;
65     }
66
67     while ([device state] == SimDeviceStateCreating)
68         sleep(1);
69
70     return device;
71 }
72
73
74 NSString *getRequiredStringArgument(NSString *parameter)
75 {
76     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
77     NSString *argument = [defaults stringForKey:parameter];
78
79     if (!argument) {
80         NSLog(@"-%@ is required.", parameter);
81         usage();
82         exit(EXIT_FAILURE);
83     }
84     return argument;
85 }
86
87 NSArray *getDumpToolArguments()
88 {
89     NSMutableArray *dumpToolArguments = [[NSMutableArray alloc] init];
90     NSArray *processArgs = [[NSProcessInfo processInfo] arguments];
91     BOOL appending = NO;
92     for (NSString *arg in processArgs) {
93         if ([arg isEqualToString:@"--"]) {
94             appending = YES;
95             continue;
96         }
97         if (appending)
98             [dumpToolArguments addObject:arg];
99     }
100     return dumpToolArguments;
101 }
102
103 void finish()
104 {
105     [relayController finish];
106 }
107
108 void receivedSignal(int signal)
109 {
110     exit(EXIT_SUCCESS);
111 }
112
113 int main(int argc, const char * argv[])
114 {
115     @autoreleasepool {
116         NSArray *helpArguments = @[@"-h", @"--help"];
117         for (NSString *helpArgument in helpArguments) {
118             if ([[[NSProcessInfo processInfo] arguments] indexOfObject:helpArgument] != NSNotFound) {
119                 usage();
120                 exit(EXIT_FAILURE);
121             }
122         }
123         NSString *appPath = getRequiredStringArgument(@"app");
124         NSString *runtimeIdentifier = getRequiredStringArgument(@"runtime");
125 #pragma clang diagnostic push
126 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
127         SimRuntime *runtime = [SimRuntime supportedRuntimesByIdentifier][runtimeIdentifier];
128 #pragma clang diagnostic pop
129         if (!runtime) {
130             NSLog(@"There is no supported runtime \"%@\"", runtimeIdentifier);
131             exit(EXIT_FAILURE);
132         }
133
134         NSString *deviceTypeIdentifier = getRequiredStringArgument(@"deviceType");
135 #pragma clang diagnostic push
136 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
137         SimDeviceType *deviceType = [SimDeviceType supportedDeviceTypesByIdentifier][deviceTypeIdentifier];
138 #pragma clang diagnostic pop
139         if (!deviceType) {
140             NSLog(@"There is no supported device type \"%@\"", deviceTypeIdentifier);
141             exit(EXIT_FAILURE);
142         }
143
144         NSString *suffix = getRequiredStringArgument(@"suffix");
145         NSString *productDir = getRequiredStringArgument(@"productDir");
146         NSArray *dumpToolArguments = getDumpToolArguments();
147
148         SimDevice *device = getTestingSimDevice(deviceType, runtime, suffix);
149
150         relayController = [[LTRelayController alloc] initWithDevice:device productDir:productDir appPath:appPath identifierSuffix:suffix dumpToolArguments:dumpToolArguments];
151         [relayController start];
152
153         atexit(finish);
154         signal(SIGINT, receivedSignal);
155         signal(SIGTERM, receivedSignal);
156
157         [[NSRunLoop mainRunLoop] run];
158     }
159     return 0;
160 }