Skip to content

Commit 763487d

Browse files
Make it easier to start "cross-test" helper apps in Darwin tests.
We shouldn't require a testcase instance to start such an app, since it's associated with the test suite, not a specific test.
1 parent 5fdee50 commit 763487d

File tree

5 files changed

+62
-35
lines changed

5 files changed

+62
-35
lines changed

src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m

+12-17
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
static const uint16_t kDiscoverDeviceTimeoutInSeconds = 10;
3232
static const uint16_t kExpectedDiscoveredDevicesCount = 3;
3333

34-
static bool sHelperAppsStarted = false;
35-
3634
// Singleton controller we use.
3735
static MTRDeviceController * sController = nil;
3836

@@ -180,6 +178,18 @@ + (void)setUp
180178
XCTAssertNotNil(controller);
181179

182180
sController = controller;
181+
182+
// Start the helper apps our tests use.
183+
for (NSString * payload in @[
184+
@"MT:Y.K90SO527JA0648G00",
185+
@"MT:-24J0AFN00I40648G00",
186+
]) {
187+
__auto_type * appRunner = [[MTRTestServerAppRunner alloc] initCrossTestWithAppName:@"all-clusters"
188+
arguments:@[]
189+
payload:payload
190+
testsuite:self];
191+
XCTAssertNotNil(appRunner);
192+
}
183193
}
184194

185195
+ (void)tearDown
@@ -197,21 +207,6 @@ + (void)tearDown
197207
- (void)setUp
198208
{
199209
[super setUp];
200-
201-
if (!sHelperAppsStarted) {
202-
for (NSString * payload in @[
203-
@"MT:Y.K90SO527JA0648G00",
204-
@"MT:-24J0AFN00I40648G00",
205-
]) {
206-
__auto_type * appRunner = [[MTRTestServerAppRunner alloc] initCrossTestWithAppName:@"all-clusters"
207-
arguments:@[]
208-
payload:payload
209-
testcase:self];
210-
XCTAssertNotNil(appRunner);
211-
}
212-
sHelperAppsStarted = true;
213-
}
214-
215210
[self setContinueAfterFailure:NO];
216211
}
217212

src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.h

+11-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ NS_ASSUME_NONNULL_BEGIN
3737
*/
3838
- (NSTask *)createTaskForPath:(NSString *)path;
3939

40+
/**
41+
* Same thing, but not tied to a specific testcase instance.
42+
*/
43+
+ (NSTask *)createTaskForPath:(NSString *)path;
44+
4045
/**
4146
* Run a task to completion and make sure it succeeds.
4247
*/
@@ -52,14 +57,19 @@ NS_ASSUME_NONNULL_BEGIN
5257
* Launch a cross-test task. The task will be automatically terminated when the testsuite
5358
* tearDown happens.
5459
*/
55-
- (void)launchCrossTestTask:(NSTask *)task;
60+
+ (void)launchCrossTestTask:(NSTask *)task;
5661
#endif // HAVE_NSTASK
5762

5863
/**
5964
* Get an absolute path from a path relative to the Matter SDK root.
6065
*/
6166
- (NSString *)absolutePathFor:(NSString *)matterRootRelativePath;
6267

68+
/**
69+
* Same thing, but not tied to a specific testcase instance.
70+
*/
71+
+ (NSString *)absolutePathFor:(NSString *)matterRootRelativePath;
72+
6373
@end
6474

6575
NS_ASSUME_NONNULL_END

src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm

+14-5
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,18 @@ - (void)tearDown
8585
}
8686

8787
#if HAVE_NSTASK
88-
- (NSTask *)createTaskForPath:(NSString *)path
88+
+ (NSTask *)createTaskForPath:(NSString *)path
8989
{
9090
NSTask * task = [[NSTask alloc] init];
9191
[task setLaunchPath:[self absolutePathFor:path]];
9292
return task;
9393
}
9494

95+
- (NSTask *)createTaskForPath:(NSString *)path
96+
{
97+
return [self.class createTaskForPath:path];
98+
}
99+
95100
- (void)runTask:(NSTask *)task
96101
{
97102
NSError * launchError;
@@ -102,7 +107,7 @@ - (void)runTask:(NSTask *)task
102107
XCTAssertEqual([task terminationStatus], 0);
103108
}
104109

105-
- (void)doLaunchTask:(NSTask *)task
110+
+ (void)doLaunchTask:(NSTask *)task
106111
{
107112
NSError * launchError;
108113
[task launchAndReturnError:&launchError];
@@ -111,20 +116,20 @@ - (void)doLaunchTask:(NSTask *)task
111116

112117
- (void)launchTask:(NSTask *)task
113118
{
114-
[self doLaunchTask:task];
119+
[self.class doLaunchTask:task];
115120

116121
[_runningTasks addObject:task];
117122
}
118123

119-
- (void)launchCrossTestTask:(NSTask *)task
124+
+ (void)launchCrossTestTask:(NSTask *)task
120125
{
121126
[self doLaunchTask:task];
122127

123128
[runningCrossTestTasks addObject:task];
124129
}
125130
#endif // HAVE_NSTASK
126131

127-
- (NSString *)absolutePathFor:(NSString *)matterRootRelativePath
132+
+ (NSString *)absolutePathFor:(NSString *)matterRootRelativePath
128133
{
129134
// Start with the absolute path to our file, then remove the suffix that
130135
// comes after the path to the Matter SDK root.
@@ -135,4 +140,8 @@ - (NSString *)absolutePathFor:(NSString *)matterRootRelativePath
135140
return [NSString pathWithComponents:pathComponents];
136141
}
137142

143+
- (NSString *)absolutePathFor:(NSString *)matterRootRelativePath
144+
{
145+
return [self.class absolutePathFor:matterRootRelativePath];
146+
}
138147
@end

src/darwin/Framework/CHIPTests/TestHelpers/MTRTestServerAppRunner.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ NS_ASSUME_NONNULL_BEGIN
4848
/**
4949
* Same thing, but initialize as a "cross test" helper, which is not killed at
5050
* the end of the current test (but is killed at the end of the current suite).
51+
*
52+
* The passed-in testsuite must be a subclass of MTRTestCase.
5153
*/
52-
- (instancetype)initCrossTestWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload testcase:(MTRTestCase *)testcase;
54+
- (instancetype)initCrossTestWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload testsuite:(Class)testsuite;
5355

5456
/**
5557
* Get the unique index that will be used for the next initialization. This

src/darwin/Framework/CHIPTests/TestHelpers/MTRTestServerAppRunner.m

+22-11
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ @implementation MTRTestServerAppRunner {
3636
#endif
3737
}
3838

39-
- (instancetype)initInternalWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload testcase:(MTRTestCase *)testcase isCrossTest:(BOOL)isCrossTest
39+
- (instancetype)initInternalWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload
4040
{
4141
#if !HAVE_NSTASK
4242
XCTFail("Unable to start server app when we do not have NSTask");
@@ -61,7 +61,7 @@ - (instancetype)initInternalWithAppName:(NSString *)name arguments:(NSArray<NSSt
6161
NSNumber * passcode = parsedPayload.setupPasscode;
6262

6363
__auto_type * executable = [NSString stringWithFormat:@"out/debug/%@-app/chip-%@-app", name, name];
64-
_appTask = [testcase createTaskForPath:executable];
64+
_appTask = [MTRTestCase createTaskForPath:executable];
6565

6666
__auto_type * forcedArguments = @[
6767
// Make sure we only advertise on the local interface.
@@ -92,12 +92,6 @@ - (instancetype)initInternalWithAppName:(NSString *)name arguments:(NSArray<NSSt
9292
_appTask.standardOutput = [NSFileHandle fileHandleForWritingAtPath:outFile];
9393
_appTask.standardError = [NSFileHandle fileHandleForWritingAtPath:errorFile];
9494

95-
if (isCrossTest) {
96-
[testcase launchCrossTestTask:_appTask];
97-
} else {
98-
[testcase launchTask:_appTask];
99-
}
100-
10195
NSLog(@"Started chip-%@-app (%@) with arguments %@ stdout=%@ and stderr=%@", name, _appTask, allArguments, outFile, errorFile);
10296

10397
return self;
@@ -106,12 +100,29 @@ - (instancetype)initInternalWithAppName:(NSString *)name arguments:(NSArray<NSSt
106100

107101
- (instancetype)initWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload testcase:(MTRTestCase *)testcase
108102
{
109-
return [self initInternalWithAppName:name arguments:arguments payload:payload testcase:testcase isCrossTest:NO];
103+
if (!(self = [self initInternalWithAppName:name arguments:arguments payload:payload])) {
104+
return nil;
105+
}
106+
107+
[testcase launchTask:_appTask];
108+
109+
return self;
110110
}
111111

112-
- (instancetype)initCrossTestWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload testcase:(MTRTestCase *)testcase
112+
- (instancetype)initCrossTestWithAppName:(NSString *)name arguments:(NSArray<NSString *> *)arguments payload:(NSString *)payload testsuite:(Class)testsuite
113113
{
114-
return [self initInternalWithAppName:name arguments:arguments payload:payload testcase:testcase isCrossTest:YES];
114+
if (![testsuite isSubclassOfClass:MTRTestCase.class]) {
115+
NSLog(@"%@ is not a subclass of MTRTestCase", testsuite);
116+
return nil;
117+
}
118+
119+
if (!(self = [self initInternalWithAppName:name arguments:arguments payload:payload])) {
120+
return nil;
121+
}
122+
123+
[MTRTestCase launchCrossTestTask:_appTask];
124+
125+
return self;
115126
}
116127

117128
+ (unsigned)nextUniqueIndex

0 commit comments

Comments
 (0)