Skip to content

Commit 97ffa50

Browse files
Stop relying on an externally-started all-clusters app in Darwin XCTests. (#38120)
Now that we have machinery for starting an app from inside the test, do that for all the tests that need one.
1 parent 0b71b04 commit 97ffa50

12 files changed

+71
-88
lines changed

.github/workflows/darwin.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ jobs:
112112
working-directory: src/darwin/Framework
113113
run: |
114114
mkdir -p /tmp/darwin/framework-tests
115-
../../../out/debug/all-clusters-app/chip-all-clusters-app --interface-id -1 > >(tee /tmp/darwin/framework-tests/all-cluster-app.log) 2> >(tee /tmp/darwin/framework-tests/all-cluster-app-err.log >&2) &
116115
117116
export TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1
118117

src/darwin/Framework/CHIPTests/MTRBackwardsCompatTests.m

+8-21
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,26 @@
1919
#import <Matter/Matter.h>
2020

2121
#import "MTRErrorTestUtils.h"
22+
#import "MTRTestCase+ServerAppRunner.h"
23+
#import "MTRTestCase.h"
2224
#import "MTRTestKeys.h"
23-
#import "MTRTestResetCommissioneeHelper.h"
2425
#import "MTRTestStorage.h"
2526

2627
#import <math.h> // For INFINITY
2728

28-
// system dependencies
29-
#import <XCTest/XCTest.h>
30-
31-
// Fixture: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1
32-
3329
static const uint16_t kPairingTimeoutInSeconds = 30;
3430
static const uint16_t kCASESetupTimeoutInSeconds = 30;
35-
static const uint16_t kTimeoutInSeconds = 3;
3631
static const uint64_t kDeviceId = 0x12344321;
3732
static NSString * kOnboardingPayload = @"MT:-24J0AFN00KA0648G00";
3833
static const uint16_t kLocalPort = 5541;
3934
static const uint16_t kTestVendorId = 0xFFF1u;
4035

41-
// This test suite reuses a device object to speed up the test process for CI.
42-
// The following global variable holds the reference to the device object.
43-
static MTRBaseDevice * sConnectedDevice;
44-
4536
// Singleton controller we use.
4637
static MTRDeviceController * sController = nil;
4738

4839
// Keys we can use to restart the controller.
4940
static MTRTestKeys * sTestKeys = nil;
5041

51-
static MTRBaseDevice * GetConnectedDevice(void)
52-
{
53-
XCTAssertNotNil(sConnectedDevice);
54-
return sConnectedDevice;
55-
}
56-
5742
@interface MTRBackwardsCompatTestPairingDelegate : NSObject <MTRDevicePairingDelegate>
5843
@property (nonatomic, strong) XCTestExpectation * expectation;
5944
@end
@@ -88,7 +73,7 @@ - (void)onCommissioningComplete:(NSError *)error
8873

8974
@end
9075

91-
@interface MTRBackwardsCompatTests : XCTestCase
76+
@interface MTRBackwardsCompatTests : MTRTestCase
9277
@end
9378

9479
@implementation MTRBackwardsCompatTests
@@ -97,6 +82,11 @@ + (void)setUp
9782
{
9883
[super setUp];
9984

85+
BOOL started = [self startAppWithName:@"all-clusters"
86+
arguments:@[]
87+
payload:kOnboardingPayload];
88+
XCTAssertTrue(started);
89+
10090
XCTestExpectation * expectation = [[XCTestExpectation alloc] initWithDescription:@"Pairing Complete"];
10191

10292
__auto_type * factory = [MTRControllerFactory sharedInstance];
@@ -140,16 +130,13 @@ + (void)setUp
140130
completionHandler:^(MTRBaseDevice * _Nullable device, NSError * _Nullable error) {
141131
XCTAssertEqual(error.code, 0);
142132
[connectionExpectation fulfill];
143-
sConnectedDevice = device;
144133
connectionExpectation = nil;
145134
}];
146135
XCTAssertEqual([XCTWaiter waitForExpectations:@[ connectionExpectation ] timeout:kCASESetupTimeoutInSeconds], XCTWaiterResultCompleted);
147136
}
148137

149138
+ (void)tearDown
150139
{
151-
ResetCommissionee(GetConnectedDevice(), dispatch_get_main_queue(), nil, kTimeoutInSeconds);
152-
153140
[sController shutdown];
154141
XCTAssertFalse([sController isRunning]);
155142
[[MTRControllerFactory sharedInstance] shutdown];

src/darwin/Framework/CHIPTests/MTRCertificateValidityTests.m

+10-18
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@
1919
#import <Matter/Matter.h>
2020

2121
#import "MTRErrorTestUtils.h"
22+
#import "MTRTestCase+ServerAppRunner.h"
23+
#import "MTRTestCase.h"
2224
#import "MTRTestKeys.h"
23-
#import "MTRTestResetCommissioneeHelper.h"
2425
#import "MTRTestStorage.h"
2526

26-
// system dependencies
27-
#import <XCTest/XCTest.h>
28-
2927
static const uint16_t kPairingTimeoutInSeconds = 30;
3028
static const uint16_t kTimeoutInSeconds = 3;
3129
static const uint64_t kDeviceId = 0x12341234;
@@ -195,23 +193,16 @@ - (nullable instancetype)initWithRootKey:(MTRTestKeys *)key fabricID:(NSNumber *
195193

196194
@end
197195

198-
@interface MTRCertificateValidityTests : XCTestCase
196+
@interface MTRCertificateValidityTests : MTRTestCase
199197
@end
200198

201-
static BOOL sNeedsStackShutdown = YES;
202-
203199
@implementation MTRCertificateValidityTests
204200

205201
+ (void)tearDown
206202
{
207203
// Global teardown, runs once
208-
if (sNeedsStackShutdown) {
209-
// We don't need to worry about ResetCommissionee. If we get here,
210-
// we're running only one of our test methods (using
211-
// -only-testing:MatterTests/MTROTAProviderTests/testMethodName), since
212-
// we did not run test999_TearDown.
213-
[self shutdownStack];
214-
}
204+
[self shutdownStack];
205+
[super tearDown];
215206
}
216207

217208
- (void)setUp
@@ -246,6 +237,11 @@ - (MTRBaseDevice *)commissionDeviceWithPayload:(NSString *)payloadString nodeID:
246237

247238
- (void)initStack:(MTRTestCertificateIssuer *)certificateIssuer
248239
{
240+
BOOL started = [self startAppWithName:@"all-clusters"
241+
arguments:@[]
242+
payload:kOnboardingPayload];
243+
XCTAssertTrue(started);
244+
249245
__auto_type * factory = [MTRDeviceControllerFactory sharedInstance];
250246
XCTAssertNotNil(factory);
251247

@@ -289,8 +285,6 @@ - (void)initStack:(MTRTestCertificateIssuer *)certificateIssuer
289285

290286
+ (void)shutdownStack
291287
{
292-
sNeedsStackShutdown = NO;
293-
294288
MTRDeviceController * controller = sController;
295289
[controller shutdown];
296290
XCTAssertFalse([controller isRunning]);
@@ -319,8 +313,6 @@ - (void)test001_TestExpiredCertificates
319313
}];
320314
[self waitForExpectations:@[ toggleExpectation ] timeout:kTimeoutInSeconds];
321315

322-
ResetCommissionee(sConnectedDevice, dispatch_get_main_queue(), self, kTimeoutInSeconds);
323-
324316
[[self class] shutdownStack];
325317
}
326318

src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
#import "MTRTestKeys.h"
2424
#import "MTRTestStorage.h"
2525

26-
// Fixture 1: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1
27-
2826
static const uint16_t kTestVendorId = 0xFFF1u;
2927
static const __auto_type kTestProductIds = @[ @(0x8000u), @(0x8001u), @(0x8002u) ];
3028
static const __auto_type kTestDiscriminators = @[ @(2000), @(3839u), @(3840u), @(0xb1e) ];
@@ -168,6 +166,7 @@ + (void)setUp
168166

169167
// Start the helper apps our tests use. Note these payloads match kTestDiscriminators etc.
170168
for (NSString * payload in @[
169+
@"MT:-24J0AFN00KA0648G00",
171170
@"MT:Y.K90SO527JA0648G00",
172171
@"MT:-24J0AFN00I40648G00",
173172
]) {

src/darwin/Framework/CHIPTests/MTRDeviceTests.m

+10-9
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,15 @@
3232
#import "MTRDeviceTestDelegate.h"
3333
#import "MTRDevice_Internal.h"
3434
#import "MTRErrorTestUtils.h"
35+
#import "MTRTestCase+ServerAppRunner.h"
36+
#import "MTRTestCase.h"
3537
#import "MTRTestDeclarations.h"
3638
#import "MTRTestKeys.h"
37-
#import "MTRTestResetCommissioneeHelper.h"
3839
#import "MTRTestStorage.h"
3940

4041
#import <math.h> // For INFINITY
4142
#import <os/lock.h>
4243

43-
// system dependencies
44-
#import <XCTest/XCTest.h>
45-
46-
// Fixture: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1
47-
4844
static const uint16_t kPairingTimeoutInSeconds = 30;
4945
static const uint16_t kTimeoutInSeconds = 3;
5046
static const uint64_t kDeviceId = 0x12344321;
@@ -128,7 +124,7 @@ - (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSEr
128124

129125
@end
130126

131-
@interface MTRDeviceTests : XCTestCase
127+
@interface MTRDeviceTests : MTRTestCase
132128

133129
@end
134130

@@ -138,6 +134,13 @@ @implementation MTRDeviceTests
138134

139135
+ (void)setUp
140136
{
137+
[super setUp];
138+
139+
BOOL started = [self startAppWithName:@"all-clusters"
140+
arguments:@[]
141+
payload:kOnboardingPayload];
142+
XCTAssertTrue(started);
143+
141144
XCTestExpectation * pairingExpectation = [[XCTestExpectation alloc] initWithDescription:@"Pairing Complete"];
142145

143146
slocalTestStorageEnabledBeforeUnitTest = MTRDeviceControllerLocalTestStorage.localTestStorageEnabled;
@@ -190,8 +193,6 @@ + (void)setUp
190193

191194
+ (void)tearDown
192195
{
193-
ResetCommissionee(GetConnectedDevice(), dispatch_get_main_queue(), nil, kTimeoutInSeconds);
194-
195196
// Restore testing setting to previous state, and remove all persisted attributes
196197
MTRDeviceControllerLocalTestStorage.localTestStorageEnabled = slocalTestStorageEnabledBeforeUnitTest;
197198
[sController.controllerDataStore clearAllStoredClusterData];

src/darwin/Framework/CHIPTests/MTROTAProviderTests.m

+3-23
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#import "MTRTestCase+ServerAppRunner.h"
2424
#import "MTRTestCase.h"
2525
#import "MTRTestKeys.h"
26-
#import "MTRTestResetCommissioneeHelper.h"
2726
#import "MTRTestStorage.h"
2827

2928
// system dependencies
@@ -521,22 +520,14 @@ - (instancetype)initWithRawImagePath:(NSString *)rawImagePath
521520
@end
522521

523522
static BOOL sStackInitRan = NO;
524-
static BOOL sNeedsStackShutdown = YES;
525523

526-
@implementation MTROTAProviderTests {
527-
NSMutableSet<NSNumber *> * _commissionedNodeIDs;
528-
}
524+
@implementation MTROTAProviderTests
529525

530526
+ (void)tearDown
531527
{
532528
// Global teardown, runs once
533-
if (sNeedsStackShutdown) {
534-
// We don't need to worry about ResetCommissionee. If we get here,
535-
// we're running only one of our test methods (using
536-
// -only-testing:MatterTests/MTROTAProviderTests/testMethodName), since
537-
// we did not run test999_TearDown.
538-
[self shutdownStack];
539-
}
529+
[self shutdownStack];
530+
[super tearDown];
540531
}
541532

542533
- (void)setUp
@@ -549,8 +540,6 @@ - (void)setUp
549540
[self initStack];
550541
}
551542

552-
_commissionedNodeIDs = [[NSMutableSet alloc] init];
553-
554543
XCTAssertNil(sOTAProviderDelegate.queryImageHandler);
555544
XCTAssertNil(sOTAProviderDelegate.applyUpdateRequestHandler);
556545
XCTAssertNil(sOTAProviderDelegate.notifyUpdateAppliedHandler);
@@ -576,11 +565,6 @@ - (void)setUp
576565

577566
- (void)tearDown
578567
{
579-
for (NSNumber * nodeID in _commissionedNodeIDs) {
580-
__auto_type * device = [MTRBaseDevice deviceWithNodeID:nodeID controller:sController];
581-
ResetCommissionee(device, dispatch_get_main_queue(), self, kTimeoutInSeconds);
582-
}
583-
584568
if (sController != nil) {
585569
[sController shutdown];
586570
XCTAssertFalse([sController isRunning]);
@@ -619,8 +603,6 @@ - (MTRDevice *)commissionDeviceWithPayload:(NSString *)payloadString nodeID:(NSN
619603

620604
[self waitForExpectations:@[ expectation ] timeout:kPairingTimeoutInSeconds];
621605

622-
[_commissionedNodeIDs addObject:nodeID];
623-
624606
return [MTRDevice deviceWithNodeID:nodeID controller:sController];
625607
}
626608

@@ -645,8 +627,6 @@ - (void)initStack
645627

646628
+ (void)shutdownStack
647629
{
648-
sNeedsStackShutdown = NO;
649-
650630
[[MTRDeviceControllerFactory sharedInstance] stopControllerFactory];
651631
}
652632

src/darwin/Framework/CHIPTests/MTROperationalCertificateIssuerTests.m

+8-4
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818
#import <Matter/Matter.h>
1919

2020
#import "MTRErrorTestUtils.h"
21+
#import "MTRTestCase+ServerAppRunner.h"
22+
#import "MTRTestCase.h"
2123
#import "MTRTestKeys.h"
2224
#import "MTRTestStorage.h"
2325

24-
// system dependencies
25-
#import <XCTest/XCTest.h>
26-
2726
static const uint16_t kPairingTimeoutInSeconds = 30;
2827
static const uint64_t kDeviceId = 0x12344321;
2928
static NSString * kOnboardingPayload = @"MT:-24J0AFN00KA0648G00";
@@ -110,7 +109,7 @@ - (void)issueOperationalCertificateForRequest:(MTROperationalCSRInfo *)csrInfo
110109

111110
@end
112111

113-
@interface MTROperationalCertificateIssuerTests : XCTestCase
112+
@interface MTROperationalCertificateIssuerTests : MTRTestCase
114113
@end
115114

116115
@implementation MTROperationalCertificateIssuerTests
@@ -123,6 +122,11 @@ - (void)setUp
123122

124123
- (void)testFailedCertificateIssuance
125124
{
125+
BOOL started = [self startAppWithName:@"all-clusters"
126+
arguments:@[]
127+
payload:kOnboardingPayload];
128+
XCTAssertTrue(started);
129+
126130
XCTestExpectation * expectation = [self expectationWithDescription:@"Pairing Complete"];
127131

128132
__auto_type * factory = [MTRDeviceControllerFactory sharedInstance];

src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m

+15
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,21 @@ @implementation MTRPerControllerStorageTests {
334334
BOOL _localTestStorageEnabledBeforeUnitTest;
335335
}
336336

337+
+ (void)setUp
338+
{
339+
// Start one instance of all-clusters-app that the various tests below can
340+
// then use, so we're not doing quite as much startup logging. Though it's
341+
// not clear that the ResetCommissionee logging is really shorter, so maybe
342+
// we should start these on a per-test basis, e.g. in
343+
// commissionWithController:newNodeID:onboardingPayload:
344+
[super setUp];
345+
346+
BOOL started = [self startAppWithName:@"all-clusters"
347+
arguments:@[]
348+
payload:kOnboardingPayload];
349+
XCTAssertTrue(started);
350+
}
351+
337352
- (void)setUp
338353
{
339354
// Set detectLeaks true first, in case our superclass wants to do something

0 commit comments

Comments
 (0)