| /* |
| * |
| * Copyright (c) 2022 Project CHIP Authors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // module headers |
| #import <Matter/Matter.h> |
| |
| #import "MTRErrorTestUtils.h" |
| #import "MTRTestKeys.h" |
| #import "MTRTestStorage.h" |
| |
| #import <app/util/af-enums.h> |
| |
| #import <math.h> // For INFINITY |
| |
| // system dependencies |
| #import <XCTest/XCTest.h> |
| |
| // Set the following to 1 in order to run individual test case manually. |
| #define MANUAL_INDIVIDUAL_TEST 0 |
| |
| static const uint16_t kPairingTimeoutInSeconds = 10; |
| static const uint16_t kCASESetupTimeoutInSeconds = 30; |
| static const uint16_t kTimeoutInSeconds = 3; |
| static const uint64_t kDeviceId = 0x12344321; |
| static NSString * kOnboardingPayload = @"MT:-24J0AFN00KA0648G00"; |
| static const uint16_t kLocalPort = 5541; |
| static const uint16_t kTestVendorId = 0xFFF1u; |
| |
| // This test suite reuses a device object to speed up the test process for CI. |
| // The following global variable holds the reference to the device object. |
| static MTRBaseDevice * sConnectedDevice; |
| |
| // Singleton controller we use. |
| static MTRDeviceController * sController = nil; |
| |
| // Keys we can use to restart the controller. |
| static MTRTestKeys * sTestKeys = nil; |
| |
| static MTRBaseDevice * GetConnectedDevice(void) |
| { |
| XCTAssertNotNil(sConnectedDevice); |
| return sConnectedDevice; |
| } |
| |
| @interface MTRBackwardsCompatTestPairingDelegate : NSObject <MTRDevicePairingDelegate> |
| @property (nonatomic, strong) XCTestExpectation * expectation; |
| @end |
| |
| @implementation MTRBackwardsCompatTestPairingDelegate |
| - (id)initWithExpectation:(XCTestExpectation *)expectation |
| { |
| self = [super init]; |
| if (self) { |
| _expectation = expectation; |
| } |
| return self; |
| } |
| |
| - (void)onPairingComplete:(NSError *)error |
| { |
| XCTAssertEqual(error.code, 0); |
| |
| NSError * commissionError = nil; |
| [sController commissionDevice:kDeviceId commissioningParams:[[MTRCommissioningParameters alloc] init] error:&commissionError]; |
| XCTAssertNil(commissionError); |
| |
| // Keep waiting for onCommissioningComplete |
| } |
| |
| - (void)onCommissioningComplete:(NSError *)error |
| { |
| XCTAssertEqual(error.code, 0); |
| [_expectation fulfill]; |
| _expectation = nil; |
| } |
| |
| @end |
| |
| @interface MTRBackwardsCompatTests : XCTestCase |
| @end |
| |
| @implementation MTRBackwardsCompatTests |
| |
| - (void)setUp |
| { |
| [super setUp]; |
| [self setContinueAfterFailure:NO]; |
| } |
| |
| - (void)tearDown |
| { |
| #if MANUAL_INDIVIDUAL_TEST |
| [self shutdownStack]; |
| #endif |
| [super tearDown]; |
| } |
| |
| - (void)initStack |
| { |
| XCTestExpectation * expectation = [self expectationWithDescription:@"Pairing Complete"]; |
| |
| __auto_type * factory = [MTRControllerFactory sharedInstance]; |
| XCTAssertNotNil(factory); |
| |
| __auto_type * storage = [[MTRTestStorage alloc] init]; |
| __auto_type * factoryParams = [[MTRControllerFactoryParams alloc] initWithStorage:storage]; |
| factoryParams.port = @(kLocalPort); |
| |
| BOOL ok = [factory startup:factoryParams]; |
| XCTAssertTrue(ok); |
| |
| __auto_type * testKeys = [[MTRTestKeys alloc] init]; |
| XCTAssertNotNil(testKeys); |
| |
| sTestKeys = testKeys; |
| |
| // Needs to match what startControllerOnExistingFabric calls elsewhere in |
| // this file do. |
| __auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithSigningKeypair:testKeys fabricId:1 ipk:testKeys.ipk]; |
| params.vendorId = @(kTestVendorId); |
| |
| MTRDeviceController * controller = [factory startControllerOnNewFabric:params]; |
| XCTAssertNotNil(controller); |
| |
| sController = controller; |
| |
| __auto_type * pairing = [[MTRBackwardsCompatTestPairingDelegate alloc] initWithExpectation:expectation]; |
| dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.pairing", DISPATCH_QUEUE_SERIAL); |
| |
| [controller setPairingDelegate:pairing queue:callbackQueue]; |
| |
| NSError * error; |
| __auto_type * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:kOnboardingPayload error:&error]; |
| XCTAssertNotNil(payload); |
| XCTAssertNil(error); |
| |
| [controller setupCommissioningSessionWithPayload:payload newNodeID:@(kDeviceId) error:&error]; |
| XCTAssertNil(error); |
| |
| [self waitForExpectationsWithTimeout:kPairingTimeoutInSeconds handler:nil]; |
| |
| __block XCTestExpectation * connectionExpectation = [self expectationWithDescription:@"CASE established"]; |
| [controller getBaseDevice:kDeviceId |
| queue:dispatch_get_main_queue() |
| completionHandler:^(MTRBaseDevice * _Nullable device, NSError * _Nullable error) { |
| XCTAssertEqual(error.code, 0); |
| [connectionExpectation fulfill]; |
| sConnectedDevice = device; |
| connectionExpectation = nil; |
| }]; |
| [self waitForExpectationsWithTimeout:kCASESetupTimeoutInSeconds handler:nil]; |
| } |
| |
| - (void)shutdownStack |
| { |
| MTRDeviceController * controller = sController; |
| XCTAssertNotNil(controller); |
| |
| [controller shutdown]; |
| XCTAssertFalse([controller isRunning]); |
| |
| [[MTRControllerFactory sharedInstance] shutdown]; |
| } |
| |
| #if !MANUAL_INDIVIDUAL_TEST |
| - (void)test000_SetUp |
| { |
| [self initStack]; |
| } |
| #endif |
| |
| #define CHECK_RETURN_TYPE(sig, type) \ |
| do { \ |
| XCTAssertNotNil(sig); \ |
| XCTAssertTrue(strcmp([sig methodReturnType], @encode(type)) == 0); \ |
| } while (0) |
| |
| /** |
| * Arguments 0 and 1 are the implicit self and _cmd arguments; the real arguments begin at index 2. |
| */ |
| #define CHECK_ARGUMENT(sig, index, type) \ |
| do { \ |
| XCTAssertTrue(strcmp([sig getArgumentTypeAtIndex:(index) + 2], @encode(type)) == 0); \ |
| } while (0) |
| |
| #define CHECK_READONLY_PROPERTY(instance, propName, type) \ |
| do { \ |
| NSMethodSignature * signature = [instance methodSignatureForSelector:@selector(propName)]; \ |
| CHECK_RETURN_TYPE(signature, type); \ |
| /* Check that getting the property directly compiles too */ \ |
| (void) instance.propName; \ |
| } while (0) |
| |
| #define CHECK_PROPERTY(instance, propName, setterName, type) \ |
| do { \ |
| CHECK_READONLY_PROPERTY(instance, propName, type); \ |
| NSMethodSignature * signature = [instance methodSignatureForSelector:@selector(setterName:)]; \ |
| CHECK_RETURN_TYPE(signature, void); \ |
| CHECK_ARGUMENT(signature, 0, type); \ |
| } while (0) |
| |
| /** |
| * Basic tests that all the selectors we expect are in place. This does some |
| * limited checking of the argument types (enough to check for boxed numbers vs |
| * primitives, say, but not enough to distinguish various object types). |
| * |
| * Also missing: checks for whether init/new are available or not |
| * (NS_UNAVAILABLE), since the selector setup is the same in both cases. |
| */ |
| |
| - (void)test001_MTRAsyncCallbackWorkQueue |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRAsyncCallbackWorkQueue instanceMethodSignatureForSelector:@selector(initWithContext:queue:)]; |
| CHECK_RETURN_TYPE(sig, id); |
| CHECK_ARGUMENT(sig, 0, id); |
| CHECK_ARGUMENT(sig, 1, dispatch_queue_t); |
| |
| sig = [MTRAsyncCallbackWorkQueue instanceMethodSignatureForSelector:@selector(invalidate)]; |
| CHECK_RETURN_TYPE(sig, void); |
| |
| sig = [MTRAsyncCallbackWorkQueue instanceMethodSignatureForSelector:@selector(enqueueWorkItem:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, id); |
| } |
| |
| - (void)test002_MTRAsyncCallbackQueueWorkItem |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRAsyncCallbackQueueWorkItem instanceMethodSignatureForSelector:@selector(initWithQueue:)]; |
| CHECK_RETURN_TYPE(sig, id); |
| CHECK_ARGUMENT(sig, 0, dispatch_queue_t); |
| |
| __auto_type * item = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:dispatch_get_main_queue()]; |
| |
| CHECK_PROPERTY(item, readyHandler, setReadyHandler, MTRAsyncCallbackReadyHandler); |
| CHECK_PROPERTY(item, cancelHandler, setCancelHandler, dispatch_block_t); |
| |
| sig = [MTRAsyncCallbackQueueWorkItem instanceMethodSignatureForSelector:@selector(endWork)]; |
| CHECK_RETURN_TYPE(sig, void); |
| |
| sig = [MTRAsyncCallbackQueueWorkItem instanceMethodSignatureForSelector:@selector(retryWork)]; |
| CHECK_RETURN_TYPE(sig, void); |
| } |
| |
| - (void)test003_MTRAttestationInfo |
| { |
| __auto_type * info = [[AttestationInfo alloc] init]; |
| CHECK_PROPERTY(info, challenge, setChallenge, NSData *); |
| CHECK_PROPERTY(info, nonce, setNonce, NSData *); |
| CHECK_PROPERTY(info, elements, setElements, NSData *); |
| CHECK_PROPERTY(info, elementsSignature, setElementsSignature, NSData *); |
| CHECK_PROPERTY(info, dac, setDac, NSData *); |
| CHECK_PROPERTY(info, pai, setPai, NSData *); |
| CHECK_PROPERTY(info, certificationDeclaration, setCertificationDeclaration, NSData *); |
| CHECK_PROPERTY(info, firmwareInfo, setFirmwareInfo, NSData *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [AttestationInfo instanceMethodSignatureForSelector:@selector |
| (initWithChallenge:nonce:elements:elementsSignature:dac:pai:certificationDeclaration:firmwareInfo:)]; |
| CHECK_RETURN_TYPE(sig, id); |
| CHECK_ARGUMENT(sig, 0, NSData *); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| CHECK_ARGUMENT(sig, 2, NSData *); |
| CHECK_ARGUMENT(sig, 3, NSData *); |
| CHECK_ARGUMENT(sig, 4, NSData *); |
| CHECK_ARGUMENT(sig, 5, NSData *); |
| CHECK_ARGUMENT(sig, 6, NSData *); |
| CHECK_ARGUMENT(sig, 7, NSData *); |
| } |
| |
| - (void)test004_MTRAttributeCacheContainer |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRAttributeCacheContainer |
| instanceMethodSignatureForSelector:@selector(readAttributeWithEndpointId:clusterId:attributeId:clientQueue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 4, void (^)(NSArray<NSDictionary<NSString *, id> *> * _Nullable values, NSError * _Nullable error)); |
| } |
| |
| - (void)test005_MTRBaseClusters |
| { |
| // TODO: Need to think a bit about how to test this exhaustively, but in the |
| // meantime just test a representative cluster with commands and attributes |
| // on it, including commands that have no fields and writable attributes. |
| NSMethodSignature * sig; |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(initWithDevice:endpoint:queue:)]; |
| CHECK_RETURN_TYPE(sig, id); |
| CHECK_ARGUMENT(sig, 0, MTRBaseDevice *); |
| CHECK_ARGUMENT(sig, 1, uint16_t); |
| CHECK_ARGUMENT(sig, 2, dispatch_queue_t); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(offWithParams:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, MTROnOffClusterOffParams *); |
| CHECK_ARGUMENT(sig, 1, StatusCompletion); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(offWithCompletionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, StatusCompletion); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(offWithEffectWithParams:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, MTROnOffClusterOffWithEffectParams *); |
| CHECK_ARGUMENT(sig, 1, StatusCompletion); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(readAttributeOnTimeWithCompletionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, void (^)(NSNumber * _Nullable value, NSError * _Nullable error)); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(writeAttributeOnTimeWithValue:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, StatusCompletion); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector(writeAttributeOnTimeWithValue: |
| params:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, MTRWriteParams *); |
| CHECK_ARGUMENT(sig, 2, StatusCompletion); |
| |
| sig = [MTRBaseClusterOnOff instanceMethodSignatureForSelector:@selector |
| (subscribeAttributeOnTimeWithMinInterval:maxInterval:params:subscriptionEstablished:reportHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, MTRSubscribeParams *); |
| CHECK_ARGUMENT(sig, 3, SubscriptionEstablishedHandler); |
| CHECK_ARGUMENT(sig, 4, void (^)(NSNumber * _Nullable value, NSError * _Nullable error)); |
| |
| sig = [MTRBaseClusterOnOff |
| methodSignatureForSelector:@selector(readAttributeOnTimeWithAttributeCache:endpoint:queue:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, MTRAttributeCacheContainer *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 3, void (^)(NSNumber * _Nullable value, NSError * _Nullable error)); |
| } |
| |
| - (void)test006_MTRBaseDevice |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector |
| (subscribeWithQueue: |
| minInterval:maxInterval:params:cacheContainer:attributeReportHandler:eventReportHandler |
| :errorHandler:subscriptionEstablished:resubscriptionScheduled:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 1, uint16_t); |
| CHECK_ARGUMENT(sig, 2, uint16_t); |
| CHECK_ARGUMENT(sig, 3, MTRSubscribeParams *); |
| CHECK_ARGUMENT(sig, 4, MTRAttributeCacheContainer *); |
| CHECK_ARGUMENT(sig, 5, MTRDeviceReportHandler); |
| CHECK_ARGUMENT(sig, 6, MTRDeviceReportHandler); |
| CHECK_ARGUMENT(sig, 7, MTRDeviceErrorHandler); |
| CHECK_ARGUMENT(sig, 8, dispatch_block_t); |
| CHECK_ARGUMENT(sig, 9, MTRDeviceResubscriptionScheduledHandler); |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector |
| (readAttributeWithEndpointId:clusterId:attributeId:params:clientQueue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, MTRReadParams *); |
| CHECK_ARGUMENT(sig, 4, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 5, MTRDeviceResponseHandler); |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector |
| (writeAttributeWithEndpointId:clusterId:attributeId:value:timedWriteTimeout:clientQueue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, id); |
| CHECK_ARGUMENT(sig, 4, NSNumber *); |
| CHECK_ARGUMENT(sig, 5, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 6, MTRDeviceResponseHandler); |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector |
| (invokeCommandWithEndpointId: |
| clusterId:commandId:commandFields:timedInvokeTimeout:clientQueue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, id); |
| CHECK_ARGUMENT(sig, 4, NSNumber *); |
| CHECK_ARGUMENT(sig, 5, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 6, MTRDeviceResponseHandler); |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector |
| (subscribeAttributeWithEndpointId: |
| clusterId:attributeId:minInterval:maxInterval:params:clientQueue:reportHandler |
| :subscriptionEstablished:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, NSNumber *); |
| CHECK_ARGUMENT(sig, 4, NSNumber *); |
| CHECK_ARGUMENT(sig, 5, MTRSubscribeParams *); |
| CHECK_ARGUMENT(sig, 6, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 7, MTRDeviceResponseHandler); |
| CHECK_ARGUMENT(sig, 8, void (^)(void)); |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector(deregisterReportHandlersWithClientQueue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 1, void (^)(void)); |
| |
| sig = [MTRBaseDevice instanceMethodSignatureForSelector:@selector |
| (openCommissioningWindowWithSetupPasscode:discriminator:duration:queue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 4, MTRDeviceOpenCommissioningWindowHandler); |
| |
| // TODO add tests that actually invoking the old methods on an MTRBaseDevice calls the new methods. |
| } |
| |
| - (void)test007_MTRAttributePath |
| { |
| XCTAssertTrue([MTRAttributePath conformsToProtocol:@protocol(NSCopying)]); |
| |
| __auto_type * path = [MTRAttributePath attributePathWithEndpointId:@(0) clusterId:@(0) attributeId:@(0)]; |
| |
| CHECK_READONLY_PROPERTY(path, endpoint, NSNumber *); |
| CHECK_READONLY_PROPERTY(path, cluster, NSNumber *); |
| CHECK_READONLY_PROPERTY(path, attribute, NSNumber *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRAttributePath methodSignatureForSelector:@selector(attributePathWithEndpointId:clusterId:attributeId:)]; |
| CHECK_RETURN_TYPE(sig, MTRAttributePath *); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| } |
| |
| - (void)test008_MTREventPath |
| { |
| __auto_type * path = [MTREventPath eventPathWithEndpointId:@(0) clusterId:@(0) eventId:@(0)]; |
| |
| CHECK_READONLY_PROPERTY(path, endpoint, NSNumber *); |
| CHECK_READONLY_PROPERTY(path, cluster, NSNumber *); |
| CHECK_READONLY_PROPERTY(path, event, NSNumber *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTREventPath methodSignatureForSelector:@selector(eventPathWithEndpointId:clusterId:eventId:)]; |
| CHECK_RETURN_TYPE(sig, MTREventPath *); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| } |
| |
| - (void)test009_MTRCommandPath |
| { |
| __auto_type * path = [MTRCommandPath commandPathWithEndpointId:@(0) clusterId:@(0) commandId:@(0)]; |
| |
| CHECK_READONLY_PROPERTY(path, endpoint, NSNumber *); |
| CHECK_READONLY_PROPERTY(path, cluster, NSNumber *); |
| CHECK_READONLY_PROPERTY(path, command, NSNumber *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRCommandPath methodSignatureForSelector:@selector(commandPathWithEndpointId:clusterId:commandId:)]; |
| CHECK_RETURN_TYPE(sig, MTRCommandPath *); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| } |
| |
| - (void)test010_MTRAttributeReport |
| { |
| __auto_type * report = [[MTRAttributeReport alloc] init]; |
| |
| CHECK_READONLY_PROPERTY(report, path, MTRAttributePath *); |
| CHECK_READONLY_PROPERTY(report, value, id); |
| CHECK_READONLY_PROPERTY(report, error, NSError *); |
| } |
| |
| - (void)test011_MTREventReport |
| { |
| __auto_type * report = [[MTREventReport alloc] init]; |
| |
| CHECK_READONLY_PROPERTY(report, path, MTREventPath *); |
| CHECK_READONLY_PROPERTY(report, eventNumber, NSNumber *); |
| CHECK_READONLY_PROPERTY(report, priority, NSNumber *); |
| CHECK_READONLY_PROPERTY(report, timestamp, NSNumber *); |
| CHECK_READONLY_PROPERTY(report, value, id); |
| CHECK_READONLY_PROPERTY(report, error, NSError *); |
| } |
| |
| - (void)test012_MTRCSRInfo |
| { |
| __auto_type * info = [[CSRInfo alloc] init]; |
| |
| CHECK_PROPERTY(info, nonce, setNonce, NSData *); |
| CHECK_PROPERTY(info, elements, setElements, NSData *); |
| CHECK_PROPERTY(info, elementsSignature, setElementsSignature, NSData *); |
| CHECK_PROPERTY(info, csr, setCsr, NSData *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [CSRInfo instanceMethodSignatureForSelector:@selector(initWithNonce:elements:elementsSignature:csr:)]; |
| CHECK_RETURN_TYPE(sig, CSRInfo *); |
| CHECK_ARGUMENT(sig, 0, NSData *); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| CHECK_ARGUMENT(sig, 2, NSData *); |
| CHECK_ARGUMENT(sig, 3, NSData *); |
| } |
| |
| - (void)test013_MTRCertificates |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector(generateRootCertificate:issuerId:fabricId:error:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, NSError * __autoreleasing *); |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector |
| (generateIntermediateCertificate:rootCertificate:intermediatePublicKey:issuerId:fabricId:error:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| CHECK_ARGUMENT(sig, 2, SecKeyRef); |
| CHECK_ARGUMENT(sig, 3, NSNumber *); |
| CHECK_ARGUMENT(sig, 4, NSNumber *); |
| CHECK_ARGUMENT(sig, 5, NSError * __autoreleasing *); |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector |
| (generateOperationalCertificate: |
| signingCertificate:operationalPublicKey:fabricId:nodeId:caseAuthenticatedTags:error:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| CHECK_ARGUMENT(sig, 2, SecKeyRef); |
| CHECK_ARGUMENT(sig, 3, NSNumber *); |
| CHECK_ARGUMENT(sig, 4, NSNumber *); |
| CHECK_ARGUMENT(sig, 5, NSArray<NSNumber *> *); |
| CHECK_ARGUMENT(sig, 6, NSError * __autoreleasing *); |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector(keypair:matchesCertificate:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector(isCertificate:equalTo:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, NSData *); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector(generateCertificateSigningRequest:error:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, NSError * __autoreleasing *); |
| |
| sig = [MTRCertificates methodSignatureForSelector:@selector(convertX509Certificate:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, NSData *); |
| } |
| |
| - (void)test014_MTRWriteParams |
| { |
| XCTAssertTrue([MTRWriteParams conformsToProtocol:@protocol(NSCopying)]); |
| |
| __auto_type * params = [[MTRWriteParams alloc] init]; |
| |
| CHECK_PROPERTY(params, timedWriteTimeout, setTimedWriteTimeout, NSNumber *); |
| CHECK_PROPERTY(params, dataVersion, setDataVersion, NSNumber *); |
| } |
| |
| - (void)test015_MTRReadParams |
| { |
| XCTAssertTrue([MTRReadParams conformsToProtocol:@protocol(NSCopying)]); |
| |
| __auto_type * params = [[MTRReadParams alloc] init]; |
| |
| CHECK_PROPERTY(params, fabricFiltered, setFabricFiltered, NSNumber *); |
| } |
| |
| - (void)test016_MTRSubscribeParams |
| { |
| XCTAssertTrue([MTRSubscribeParams conformsToProtocol:@protocol(NSCopying)]); |
| XCTAssertTrue([MTRSubscribeParams isSubclassOfClass:[MTRReadParams class]]); |
| |
| __auto_type * params = [[MTRSubscribeParams alloc] init]; |
| |
| CHECK_PROPERTY(params, keepPreviousSubscriptions, setKeepPreviousSubscriptions, NSNumber *); |
| CHECK_PROPERTY(params, autoResubscribe, setAutoResubscribe, NSNumber *); |
| } |
| |
| - (void)test017_MTRClusterConstants |
| { |
| // TODO: Figure out what and how to test here. |
| } |
| |
| - (void)test018_MTRClusters |
| { |
| // TODO: Need to think a bit about how to test this exhaustively, but in the |
| // meantime just test a representative cluster with commands and attributes |
| // on it, including commands that have no fields and writable attributes. |
| NSMethodSignature * sig; |
| |
| sig = [MTRClusterOnOff instanceMethodSignatureForSelector:@selector(initWithDevice:endpoint:queue:)]; |
| CHECK_RETURN_TYPE(sig, MTRClusterOnOff *); |
| CHECK_ARGUMENT(sig, 0, MTRDevice *); |
| CHECK_ARGUMENT(sig, 1, uint16_t); |
| CHECK_ARGUMENT(sig, 2, dispatch_queue_t); |
| |
| sig = [MTRClusterOnOff instanceMethodSignatureForSelector:@selector(offWithParams: |
| expectedValues:expectedValueInterval:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, MTROnOffClusterOffParams *); |
| CHECK_ARGUMENT(sig, 1, NSArray *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, StatusCompletion); |
| |
| sig = [MTRClusterOnOff instanceMethodSignatureForSelector:@selector(offWithExpectedValues: |
| expectedValueInterval:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSArray *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, StatusCompletion); |
| |
| sig = [MTRClusterOnOff instanceMethodSignatureForSelector:@selector(readAttributeOnTimeWithParams:)]; |
| CHECK_RETURN_TYPE(sig, NSDictionary *); |
| CHECK_ARGUMENT(sig, 0, MTRReadParams *); |
| |
| sig = [MTRClusterOnOff instanceMethodSignatureForSelector:@selector(writeAttributeOnTimeWithValue:expectedValueInterval:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSDictionary *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| |
| sig = [MTRClusterOnOff instanceMethodSignatureForSelector:@selector(writeAttributeOnTimeWithValue: |
| expectedValueInterval:params:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSDictionary *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, MTRWriteParams *); |
| } |
| |
| - (void)test019_MTRCommandPayloadsObjc |
| { |
| // TODO: Figure out what and how to test here. |
| } |
| |
| - (void)test020_MTRCommissioningParameters |
| { |
| __auto_type * params = [[MTRCommissioningParameters alloc] init]; |
| |
| CHECK_PROPERTY(params, CSRNonce, setCSRNonce, NSData *); |
| CHECK_PROPERTY(params, attestationNonce, setAttestationNonce, NSData *); |
| CHECK_PROPERTY(params, wifiSSID, setWifiSSID, NSData *); |
| CHECK_PROPERTY(params, wifiCredentials, setWifiCredentials, NSData *); |
| CHECK_PROPERTY(params, threadOperationalDataset, setThreadOperationalDataset, NSData *); |
| CHECK_PROPERTY(params, deviceAttestationDelegate, setDeviceAttestationDelegate, id<MTRDeviceAttestationDelegate>); |
| CHECK_PROPERTY(params, failSafeExpiryTimeoutSecs, setFailSafeExpiryTimeoutSecs, NSNumber *); |
| } |
| |
| - (void)test021_MTRControllerFactoryParams |
| { |
| __auto_type * storage = [[MTRTestStorage alloc] init]; |
| __auto_type * params = [[MTRControllerFactoryParams alloc] initWithStorage:storage]; |
| CHECK_READONLY_PROPERTY(params, storageDelegate, id<MTRPersistentStorageDelegate>); |
| CHECK_PROPERTY(params, otaProviderDelegate, setOtaProviderDelegate, id<MTROTAProviderDelegate>); |
| CHECK_PROPERTY(params, paaCerts, setPaaCerts, NSArray *); |
| CHECK_PROPERTY(params, cdCerts, setCdCerts, NSArray *); |
| CHECK_PROPERTY(params, port, setPort, NSNumber *); |
| CHECK_PROPERTY(params, startServer, setStartServer, BOOL); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRControllerFactoryParams instanceMethodSignatureForSelector:@selector(initWithStorage:)]; |
| CHECK_RETURN_TYPE(sig, MTRControllerFactoryParams *); |
| CHECK_ARGUMENT(sig, 0, id<MTRPersistentStorageDelegate>); |
| } |
| |
| - (void)test022_MTRControllerFactory |
| { |
| __auto_type * instance = [MTRControllerFactory sharedInstance]; |
| CHECK_READONLY_PROPERTY(instance, isRunning, BOOL); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRControllerFactory methodSignatureForSelector:@selector(sharedInstance)]; |
| CHECK_RETURN_TYPE(sig, MTRControllerFactory *); |
| |
| sig = [MTRControllerFactory instanceMethodSignatureForSelector:@selector(startup:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, MTRControllerFactoryParams *); |
| |
| sig = [MTRControllerFactory instanceMethodSignatureForSelector:@selector(shutdown)]; |
| CHECK_RETURN_TYPE(sig, void); |
| |
| sig = [MTRControllerFactory instanceMethodSignatureForSelector:@selector(startControllerOnExistingFabric:)]; |
| CHECK_RETURN_TYPE(sig, MTRDeviceController *); |
| CHECK_ARGUMENT(sig, 0, MTRDeviceControllerStartupParams *); |
| |
| sig = [MTRControllerFactory instanceMethodSignatureForSelector:@selector(startControllerOnNewFabric:)]; |
| CHECK_RETURN_TYPE(sig, MTRDeviceController *); |
| CHECK_ARGUMENT(sig, 0, MTRDeviceControllerStartupParams *); |
| } |
| |
| - (void)test023_MTRDevice |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRDevice methodSignatureForSelector:@selector(deviceWithNodeID:deviceController:)]; |
| CHECK_RETURN_TYPE(sig, MTRDevice *); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, MTRDeviceController *); |
| |
| __auto_type * instance = [MTRDevice deviceWithNodeID:1 deviceController:sController]; |
| |
| CHECK_READONLY_PROPERTY(instance, state, MTRDeviceState); |
| |
| sig = [MTRDevice instanceMethodSignatureForSelector:@selector(setDelegate:queue:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, id<MTRDeviceDelegate>); |
| CHECK_ARGUMENT(sig, 1, dispatch_queue_t); |
| |
| sig = [MTRDevice instanceMethodSignatureForSelector:@selector(readAttributeWithEndpointID:clusterID:attributeID:params:)]; |
| CHECK_RETURN_TYPE(sig, NSDictionary *); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, MTRReadParams *); |
| |
| sig = [MTRDevice instanceMethodSignatureForSelector:@selector |
| (writeAttributeWithEndpointID:clusterID:attributeID:value:expectedValueInterval:timedWriteTimeout:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, id); |
| CHECK_ARGUMENT(sig, 4, NSNumber *); |
| CHECK_ARGUMENT(sig, 5, NSNumber *); |
| |
| sig = [MTRDevice instanceMethodSignatureForSelector:@selector |
| (invokeCommandWithEndpointID: |
| clusterID:commandID:commandFields:expectedValues:expectedValueInterval:timedInvokeTimeout |
| :clientQueue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, id); |
| CHECK_ARGUMENT(sig, 4, NSArray *); |
| CHECK_ARGUMENT(sig, 5, NSNumber *); |
| CHECK_ARGUMENT(sig, 6, NSNumber *); |
| CHECK_ARGUMENT(sig, 7, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 8, MTRDeviceResponseHandler); |
| |
| sig = [MTRDevice instanceMethodSignatureForSelector:@selector |
| (openCommissioningWindowWithSetupPasscode:discriminator:duration:queue:completion:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSNumber *); |
| CHECK_ARGUMENT(sig, 3, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 4, MTRDeviceOpenCommissioningWindowHandler); |
| |
| // TODO add tests that actually invoking the old methods on an MTRBaseDevice calls the new methods. |
| } |
| |
| - (void)test024_MTRDeviceDelegate |
| { |
| // TODO: Figure out how to test this. conformsToProtocol does not do what we |
| // want, since we want to check whether declaring a specific set of |
| // selectors would conform to the protocol. |
| } |
| |
| - (void)test025_MTRDeviceAttestationDeviceInfo |
| { |
| // Cheating by not initializing the object.... |
| __auto_type * info = [MTRDeviceAttestationDeviceInfo alloc]; |
| CHECK_READONLY_PROPERTY(info, dacCertificate, NSData *); |
| CHECK_READONLY_PROPERTY(info, dacPAICertificate, NSData *); |
| CHECK_READONLY_PROPERTY(info, certificateDeclaration, NSData *); |
| } |
| |
| - (void)test026_MTRDeviceAttestationDelegate |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test027_MTRDeviceControllerXPC |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(sharedControllerWithId:xpcConnectBlock:)]; |
| CHECK_RETURN_TYPE(sig, MTRDeviceController *); |
| CHECK_ARGUMENT(sig, 0, id<NSCopying>); |
| CHECK_ARGUMENT(sig, 1, NSXPCConnection * (^)(void) ); |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(encodeXPCResponseValues:)]; |
| CHECK_RETURN_TYPE(sig, NSArray *); |
| CHECK_ARGUMENT(sig, 0, NSArray *); |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(decodeXPCResponseValues:)]; |
| CHECK_RETURN_TYPE(sig, NSArray *); |
| CHECK_ARGUMENT(sig, 0, NSArray *); |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(encodeXPCReadParams:)]; |
| CHECK_RETURN_TYPE(sig, NSArray *); |
| CHECK_ARGUMENT(sig, 0, MTRReadParams *); |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(decodeXPCReadParams:)]; |
| CHECK_RETURN_TYPE(sig, MTRReadParams *); |
| CHECK_ARGUMENT(sig, 0, NSArray *); |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(encodeXPCSubscribeParams:)]; |
| CHECK_RETURN_TYPE(sig, NSArray *); |
| CHECK_ARGUMENT(sig, 0, MTRSubscribeParams *); |
| |
| sig = [MTRDeviceController methodSignatureForSelector:@selector(decodeXPCSubscribeParams:)]; |
| CHECK_RETURN_TYPE(sig, MTRSubscribeParams *); |
| CHECK_ARGUMENT(sig, 0, NSArray *); |
| } |
| |
| - (void)test028_MTRDeviceControllerServerProtocol |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test029_MTRDeviceControllerClientProtocol |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test030_MTRDeviceController |
| { |
| CHECK_READONLY_PROPERTY(sController, isRunning, BOOL); |
| CHECK_READONLY_PROPERTY(sController, controllerNodeId, NSNumber *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(setupCommissioningSessionWithPayload:newNodeID:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, MTRSetupPayload *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| CHECK_ARGUMENT(sig, 2, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(pairDevice:discriminator:setupPINCode:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, uint16_t); |
| CHECK_ARGUMENT(sig, 2, uint32_t); |
| CHECK_ARGUMENT(sig, 3, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(pairDevice:address:port:setupPINCode:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, NSString *); |
| CHECK_ARGUMENT(sig, 2, uint16_t); |
| CHECK_ARGUMENT(sig, 3, uint32_t); |
| CHECK_ARGUMENT(sig, 4, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(pairDevice:onboardingPayload:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, NSString *); |
| CHECK_ARGUMENT(sig, 2, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(commissionDevice:commissioningParams:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, MTRCommissioningParameters *); |
| CHECK_ARGUMENT(sig, 2, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(continueCommissioningDevice: |
| ignoreAttestationFailure:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, void *); |
| CHECK_ARGUMENT(sig, 1, BOOL); |
| CHECK_ARGUMENT(sig, 2, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(stopDevicePairing:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(getDeviceBeingCommissioned:error:)]; |
| CHECK_RETURN_TYPE(sig, MTRBaseDevice *); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(getBaseDevice:queue:completionHandler:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, dispatch_queue_t); |
| CHECK_ARGUMENT(sig, 2, MTRDeviceConnectionCallback); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(openPairingWindow:duration:error:)]; |
| CHECK_RETURN_TYPE(sig, BOOL); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, NSUInteger); |
| CHECK_ARGUMENT(sig, 2, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController |
| instanceMethodSignatureForSelector:@selector(openPairingWindowWithPIN:duration:discriminator:setupPIN:error:)]; |
| CHECK_RETURN_TYPE(sig, NSString *); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| CHECK_ARGUMENT(sig, 1, NSUInteger); |
| CHECK_ARGUMENT(sig, 2, NSUInteger); |
| CHECK_ARGUMENT(sig, 3, NSUInteger); |
| CHECK_ARGUMENT(sig, 4, NSError * __autoreleasing *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(setPairingDelegate:queue:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, id<MTRDevicePairingDelegate>); |
| CHECK_ARGUMENT(sig, 1, dispatch_queue_t); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(setNocChainIssuer:queue:)]; |
| CHECK_RETURN_TYPE(sig, void); |
| CHECK_ARGUMENT(sig, 0, id<MTRNOCChainIssuer>); |
| CHECK_ARGUMENT(sig, 1, dispatch_queue_t); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(fetchAttestationChallengeForDeviceId:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, uint64_t); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(computePaseVerifier:iterations:salt:)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| CHECK_ARGUMENT(sig, 0, uint32_t); |
| CHECK_ARGUMENT(sig, 1, uint32_t); |
| CHECK_ARGUMENT(sig, 2, NSData *); |
| |
| sig = [MTRDeviceController instanceMethodSignatureForSelector:@selector(shutdown)]; |
| CHECK_RETURN_TYPE(sig, void); |
| } |
| |
| - (void)test031_MTRDeviceControllerStartupParams |
| { |
| __auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithSigningKeypair:sTestKeys fabricId:1 ipk:sTestKeys.ipk]; |
| CHECK_READONLY_PROPERTY(params, nocSigner, id<MTRKeypair>); |
| CHECK_READONLY_PROPERTY(params, fabricId, uint64_t); |
| CHECK_READONLY_PROPERTY(params, ipk, NSData *); |
| CHECK_PROPERTY(params, vendorId, setVendorId, NSNumber *); |
| CHECK_PROPERTY(params, nodeId, setNodeId, NSNumber *); |
| CHECK_PROPERTY(params, rootCertificate, setRootCertificate, NSData *); |
| CHECK_PROPERTY(params, intermediateCertificate, setIntermediateCertificate, NSData *); |
| CHECK_READONLY_PROPERTY(params, operationalCertificate, NSData *); |
| CHECK_PROPERTY(params, operationalKeypair, setOperationalKeypair, id<MTRKeypair>); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRDeviceControllerStartupParams instanceMethodSignatureForSelector:@selector(initWithSigningKeypair:fabricId:ipk:)]; |
| CHECK_RETURN_TYPE(sig, MTRDeviceControllerStartupParams *); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, uint64_t); |
| CHECK_ARGUMENT(sig, 2, NSData *); |
| |
| sig = [MTRDeviceControllerStartupParams |
| instanceMethodSignatureForSelector:@selector(initWithOperationalKeypair: |
| operationalCertificate:intermediateCertificate:rootCertificate:ipk:)]; |
| CHECK_RETURN_TYPE(sig, MTRDeviceControllerStartupParams *); |
| CHECK_ARGUMENT(sig, 0, id<MTRKeypair>); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| CHECK_ARGUMENT(sig, 2, NSData *); |
| CHECK_ARGUMENT(sig, 3, NSData *); |
| CHECK_ARGUMENT(sig, 4, NSData *); |
| } |
| |
| - (void)test032_MTRDevicePairingDelegate |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test033_MTRError |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test034_MTRKeypair |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test035_MTRManualSetupPayloadParser |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRManualSetupPayloadParser instanceMethodSignatureForSelector:@selector(initWithDecimalStringRepresentation:)]; |
| CHECK_RETURN_TYPE(sig, MTRManualSetupPayloadParser *); |
| CHECK_ARGUMENT(sig, 0, NSString *); |
| |
| sig = [MTRManualSetupPayloadParser instanceMethodSignatureForSelector:@selector(populatePayload:)]; |
| CHECK_RETURN_TYPE(sig, MTRSetupPayload *); |
| CHECK_ARGUMENT(sig, 0, NSError * __autoreleasing *); |
| } |
| |
| - (void)test036_MTRQRCodeSetupPayloadParser |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTRQRCodeSetupPayloadParser instanceMethodSignatureForSelector:@selector(initWithBase38Representation:)]; |
| CHECK_RETURN_TYPE(sig, MTRQRCodeSetupPayloadParser *); |
| CHECK_ARGUMENT(sig, 0, NSString *); |
| |
| sig = [MTRQRCodeSetupPayloadParser instanceMethodSignatureForSelector:@selector(populatePayload:)]; |
| CHECK_RETURN_TYPE(sig, MTRSetupPayload *); |
| CHECK_ARGUMENT(sig, 0, NSError * __autoreleasing *); |
| } |
| |
| - (void)test037_MTROnboardingPayloadParser |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTROnboardingPayloadParser methodSignatureForSelector:@selector(setupPayloadForOnboardingPayload:error:)]; |
| CHECK_RETURN_TYPE(sig, MTRSetupPayload *); |
| CHECK_ARGUMENT(sig, 0, NSString *); |
| CHECK_ARGUMENT(sig, 1, NSError * __autoreleasing *); |
| } |
| |
| - (void)test038_MTRNOCChainIssuer |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test039_MTROTAHeader |
| { |
| __auto_type * header = [[MTROTAHeader alloc] init]; |
| CHECK_PROPERTY(header, vendorID, setVendorID, NSNumber *); |
| CHECK_PROPERTY(header, productID, setProductID, NSNumber *); |
| CHECK_PROPERTY(header, payloadSize, setPayloadSize, NSNumber *); |
| CHECK_PROPERTY(header, softwareVersion, setSoftwareVersion, NSNumber *); |
| CHECK_PROPERTY(header, softwareVersionString, setSoftwareVersionString, NSString *); |
| CHECK_PROPERTY(header, releaseNotesURL, setReleaseNotesURL, NSString *); |
| CHECK_PROPERTY(header, imageDigest, setImageDigest, NSData *); |
| CHECK_PROPERTY(header, imageDigestType, setImageDigestType, MTROTAImageDigestType); |
| CHECK_PROPERTY(header, minApplicableVersion, setMinApplicableVersion, NSNumber *); |
| CHECK_PROPERTY(header, maxApplicableVersion, setMaxApplicableVersion, NSNumber *); |
| } |
| |
| - (void)test040_MTROTAHeaderParser |
| { |
| NSMethodSignature * sig; |
| |
| sig = [MTROTAHeaderParser methodSignatureForSelector:@selector(headerFromData:error:)]; |
| CHECK_RETURN_TYPE(sig, MTROTAHeader *); |
| CHECK_ARGUMENT(sig, 0, NSData *); |
| CHECK_ARGUMENT(sig, 1, NSError * __autoreleasing *); |
| } |
| |
| - (void)test041_MTROTAProviderDelegate |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test042_MTRPersistentStorageDelegate |
| { |
| // TODO: Figure out how to test this. |
| } |
| |
| - (void)test043_MTROptionalQRCodeInfo |
| { |
| __auto_type * info = [[MTROptionalQRCodeInfo alloc] init]; |
| CHECK_PROPERTY(info, infoType, setInfoType, NSNumber *); |
| CHECK_PROPERTY(info, tag, setTag, NSNumber *); |
| CHECK_PROPERTY(info, integerValue, setIntegerValue, NSNumber *); |
| CHECK_PROPERTY(info, stringValue, setStringValue, NSString *); |
| } |
| |
| - (void)test044_MTRSetupPayload |
| { |
| XCTAssertTrue([MTRSetupPayload conformsToProtocol:@protocol(NSSecureCoding)]); |
| |
| __auto_type * payload = [[MTRSetupPayload alloc] init]; |
| CHECK_PROPERTY(payload, version, setVersion, NSNumber *); |
| CHECK_PROPERTY(payload, vendorID, setVendorID, NSNumber *); |
| CHECK_PROPERTY(payload, productID, setProductID, NSNumber *); |
| CHECK_PROPERTY(payload, commissioningFlow, setCommissioningFlow, MTRCommissioningFlow); |
| CHECK_PROPERTY(payload, rendezvousInformation, setRendezvousInformation, NSNumber *); |
| CHECK_PROPERTY(payload, discriminator, setDiscriminator, NSNumber *); |
| CHECK_PROPERTY(payload, hasShortDiscriminator, setHasShortDiscriminator, BOOL); |
| CHECK_PROPERTY(payload, setUpPINCode, setSetUpPINCode, NSNumber *); |
| CHECK_PROPERTY(payload, serialNumber, setSerialNumber, NSString *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRSetupPayload instanceMethodSignatureForSelector:@selector(getAllOptionalVendorData:)]; |
| CHECK_RETURN_TYPE(sig, NSArray *); |
| CHECK_ARGUMENT(sig, 0, NSError * __autoreleasing *); |
| |
| sig = [MTRSetupPayload methodSignatureForSelector:@selector(generateRandomPIN)]; |
| CHECK_RETURN_TYPE(sig, NSUInteger); |
| |
| sig = [MTRSetupPayload methodSignatureForSelector:@selector(generateRandomSetupPasscode)]; |
| CHECK_RETURN_TYPE(sig, NSNumber *); |
| |
| sig = [MTRSetupPayload methodSignatureForSelector:@selector(setupPayloadWithOnboardingPayload:error:)]; |
| CHECK_RETURN_TYPE(sig, MTRSetupPayload *); |
| CHECK_ARGUMENT(sig, 0, NSString *); |
| CHECK_ARGUMENT(sig, 1, NSError * __autoreleasing *); |
| |
| sig = [MTRSetupPayload instanceMethodSignatureForSelector:@selector(initWithSetupPasscode:discriminator:)]; |
| CHECK_RETURN_TYPE(sig, MTRSetupPayload *); |
| CHECK_ARGUMENT(sig, 0, NSNumber *); |
| CHECK_ARGUMENT(sig, 1, NSNumber *); |
| |
| sig = [MTRSetupPayload instanceMethodSignatureForSelector:@selector(manualEntryCode)]; |
| CHECK_RETURN_TYPE(sig, NSString *); |
| |
| sig = [MTRSetupPayload instanceMethodSignatureForSelector:@selector(qrCodeString:)]; |
| CHECK_RETURN_TYPE(sig, NSString *); |
| CHECK_ARGUMENT(sig, 0, NSError * __autoreleasing *); |
| } |
| |
| - (void)test045_MTRStructsObjc |
| { |
| // TODO: Figure out what and how to test here. |
| } |
| |
| - (void)test046_MTRThreadOperationalDataset |
| { |
| // Cheating by not initing the object. |
| __auto_type * dataset = [MTRThreadOperationalDataset alloc]; |
| CHECK_READONLY_PROPERTY(dataset, networkName, NSString *); |
| CHECK_READONLY_PROPERTY(dataset, extendedPANID, NSData *); |
| CHECK_READONLY_PROPERTY(dataset, masterKey, NSData *); |
| CHECK_READONLY_PROPERTY(dataset, PSKc, NSData *); |
| CHECK_PROPERTY(dataset, channel, setChannel, uint16_t); |
| CHECK_READONLY_PROPERTY(dataset, panID, NSData *); |
| |
| NSMethodSignature * sig; |
| |
| sig = [MTRThreadOperationalDataset |
| instanceMethodSignatureForSelector:@selector(initWithNetworkName:extendedPANID:masterKey:PSKc:channel:panID:)]; |
| CHECK_RETURN_TYPE(sig, MTRThreadOperationalDataset *); |
| CHECK_ARGUMENT(sig, 0, NSString *); |
| CHECK_ARGUMENT(sig, 1, NSData *); |
| CHECK_ARGUMENT(sig, 2, NSData *); |
| CHECK_ARGUMENT(sig, 3, NSData *); |
| CHECK_ARGUMENT(sig, 4, uint16_t); |
| CHECK_ARGUMENT(sig, 5, NSData *); |
| |
| sig = [MTRThreadOperationalDataset instanceMethodSignatureForSelector:@selector(initWithData:)]; |
| CHECK_RETURN_TYPE(sig, MTRThreadOperationalDataset *); |
| CHECK_ARGUMENT(sig, 0, NSData *); |
| |
| sig = [MTRThreadOperationalDataset instanceMethodSignatureForSelector:@selector(data)]; |
| CHECK_RETURN_TYPE(sig, NSData *); |
| } |
| |
| #if !MANUAL_INDIVIDUAL_TEST |
| - (void)test999_TearDown |
| { |
| // Put the device back in the state we found it: open commissioning window, no fabrics commissioned. |
| MTRBaseDevice * device = GetConnectedDevice(); |
| dispatch_queue_t queue = dispatch_get_main_queue(); |
| |
| // Get our current fabric index, for later deletion. |
| XCTestExpectation * readFabricIndexExpectation = [self expectationWithDescription:@"Fabric index read"]; |
| |
| __block NSNumber * fabricIndex; |
| __auto_type * opCredsCluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:queue]; |
| [opCredsCluster |
| readAttributeCurrentFabricIndexWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable readError) { |
| XCTAssertNil(readError); |
| XCTAssertNotNil(value); |
| fabricIndex = value; |
| [readFabricIndexExpectation fulfill]; |
| }]; |
| |
| [self waitForExpectations:@[ readFabricIndexExpectation ] timeout:kTimeoutInSeconds]; |
| |
| // Open a commissioning window. |
| XCTestExpectation * openCommissioningWindowExpectation = [self expectationWithDescription:@"Commissioning window opened"]; |
| |
| __auto_type * adminCommissioningCluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device |
| endpoint:0 |
| queue:queue]; |
| __auto_type * openWindowParams = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init]; |
| openWindowParams.commissioningTimeout = @(900); |
| openWindowParams.timedInvokeTimeoutMs = @(50000); |
| [adminCommissioningCluster openBasicCommissioningWindowWithParams:openWindowParams |
| completionHandler:^(NSError * _Nullable error) { |
| XCTAssertNil(error); |
| [openCommissioningWindowExpectation fulfill]; |
| }]; |
| |
| [self waitForExpectations:@[ openCommissioningWindowExpectation ] timeout:kTimeoutInSeconds]; |
| |
| // Remove our fabric from the device. |
| XCTestExpectation * removeFabricExpectation = [self expectationWithDescription:@"Fabric removed"]; |
| |
| __auto_type * removeParams = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init]; |
| removeParams.fabricIndex = fabricIndex; |
| |
| [opCredsCluster removeFabricWithParams:removeParams |
| completionHandler:^( |
| MTROperationalCredentialsClusterNOCResponseParams * _Nullable data, NSError * _Nullable removeError) { |
| XCTAssertNil(removeError); |
| XCTAssertNotNil(data); |
| XCTAssertEqualObjects(data.statusCode, @(0)); |
| [removeFabricExpectation fulfill]; |
| }]; |
| |
| [self waitForExpectations:@[ removeFabricExpectation ] timeout:kTimeoutInSeconds]; |
| |
| [self shutdownStack]; |
| } |
| #endif |
| |
| @end |