AliyunOSSiOSTests/OSSConfigurationTest.m (388 lines of code) (raw):

// // OSSConfigurationTest.m // AliyunOSSiOSTests // // Created by ws on 2021/3/17. // Copyright © 2021 aliyun. All rights reserved. // #import <XCTest/XCTest.h> #import <AliyunOSSiOS/AliyunOSSiOS.h> #import <AliyunOSSiOS/OSSServiceSignature.h> #import <AliyunOSSiOS/NSData+OSS.h> #import "OSSTestMacros.h" #import "OSSTestUtils.h" @interface OSSConfigurationTest : XCTestCase { NSString *host; NSString *scheme; NSString *endpoint; NSString *cname; NSString *cnameEndpoint; NSString *bucketEndpoint; } @end @implementation OSSConfigurationTest - (void)setUp { // Put setup code here. This method is called before the invocation of each test method in the class. host = @"oss-cn-beijing.aliyuncs.com"; cname = @"oss.cname.com"; scheme = @"https://"; endpoint = [NSString stringWithFormat:@"%@%@", scheme, host]; cnameEndpoint = [NSString stringWithFormat:@"%@%@", scheme, cname]; bucketEndpoint = [NSString stringWithFormat:@"%@.%@", OSS_BUCKET_PUBLIC, host]; } - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. } - (void)testDefault { OSSClientConfiguration *config = [OSSClientConfiguration new]; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; get.objectKey = OSS_MULTIPART_UPLOADKEY; [[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertTrue([task.error.userInfo[@"HostId"] isEqualToString:bucketEndpoint]); XCTAssertTrue([task.error.userInfo[@"Bucket"] isEqualToString:OSS_BUCKET_PUBLIC]); return task; }] waitUntilFinished]; } - (void)testPathStyleAccessEnable { OSSClientConfiguration *config = [OSSClientConfiguration new]; config.maxRetryCount = 0; config.isPathStyleAccessEnable = YES; config.cnameExcludeList = @[cname]; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:cnameEndpoint credentialProvider:credentialProvider clientConfiguration:config]; OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; get.objectKey = OSS_MULTIPART_UPLOADKEY; [[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertNotNil(task.error); NSString *url = [NSString stringWithFormat:@"%@%@/%@/%@", scheme, cname, OSS_BUCKET_PUBLIC, OSS_MULTIPART_UPLOADKEY]; XCTAssertTrue([task.error.userInfo[@"NSErrorFailingURLStringKey"] isEqualToString:url]); return task; }] waitUntilFinished]; } - (void)testSupportCnameEnable { NSArray *cnameExcludeList = @[cname]; OSSClientConfiguration *config = [OSSClientConfiguration new]; config.maxRetryCount = 0; config.cnameExcludeList = cnameExcludeList; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:cnameEndpoint credentialProvider:credentialProvider clientConfiguration:config]; OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; get.objectKey = OSS_MULTIPART_UPLOADKEY; [[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertNotNil(task.error); NSString *url = [NSString stringWithFormat:@"%@%@.%@/%@", scheme, OSS_BUCKET_PUBLIC, cname, OSS_MULTIPART_UPLOADKEY]; XCTAssertTrue([task.error.userInfo[@"NSErrorFailingURLStringKey"] isEqualToString:url]); return task; }] waitUntilFinished]; config = [OSSClientConfiguration new]; config.maxRetryCount = 0; client = [[OSSClient alloc] initWithEndpoint:cnameEndpoint credentialProvider:credentialProvider clientConfiguration:config]; get = [OSSGetObjectRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; get.objectKey = OSS_MULTIPART_UPLOADKEY; [[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertNotNil(task.error); NSString *url = [NSString stringWithFormat:@"%@%@/%@", scheme, cname, OSS_MULTIPART_UPLOADKEY]; XCTAssertTrue([task.error.userInfo[@"NSErrorFailingURLStringKey"] isEqualToString:url]); return task; }] waitUntilFinished]; } - (void)testCustomPathPrefixEnable { NSString *endpointPath = [NSString stringWithFormat:@"%@/%@", cnameEndpoint, OSS_BUCKET_PUBLIC]; OSSClientConfiguration *config = [OSSClientConfiguration new]; config.maxRetryCount = 0; config.isCustomPathPrefixEnable = YES; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpointPath credentialProvider:credentialProvider clientConfiguration:config]; OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; get.objectKey = OSS_MULTIPART_UPLOADKEY; [[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertNotNil(task.error); NSString *url = [NSString stringWithFormat:@"%@/%@", endpointPath, OSS_MULTIPART_UPLOADKEY]; XCTAssertTrue([task.error.userInfo[@"NSErrorFailingURLStringKey"] isEqualToString:url]); return task; }] waitUntilFinished]; } - (void)testCustomPathPrefixEnableWithNoPathEndpont { OSSClientConfiguration *config = [OSSClientConfiguration new]; config.maxRetryCount = 0; config.isCustomPathPrefixEnable = YES; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:cnameEndpoint credentialProvider:credentialProvider clientConfiguration:config]; OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; get.objectKey = OSS_MULTIPART_UPLOADKEY; [[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertNotNil(task.error); NSString *url = [NSString stringWithFormat:@"%@/%@", cnameEndpoint, OSS_MULTIPART_UPLOADKEY]; XCTAssertTrue([task.error.userInfo[@"NSErrorFailingURLStringKey"] isEqualToString:url]); return task; }] waitUntilFinished]; } - (void)testCustomPathPrefixEnableWithNullObject { OSSClientConfiguration *config = [OSSClientConfiguration new]; config.maxRetryCount = 0; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:cnameEndpoint credentialProvider:credentialProvider clientConfiguration:config]; OSSGetBucketRequest *get = [OSSGetBucketRequest new]; get.bucketName = OSS_BUCKET_PUBLIC; [[[client getBucket:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) { XCTAssertNotNil(task.error); XCTAssertTrue([task.error.userInfo[@"NSErrorFailingURLStringKey"] isEqualToString:[cnameEndpoint stringByAppendingString:@"/"]]); return task; }] waitUntilFinished]; } - (void)testAllowNetworkMetricInfo { OSSClientConfiguration *config = [OSSClientConfiguration new]; OSSAuthCredentialProvider *credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STSTOKEN_URL]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:OSS_ENDPOINT credentialProvider:credentialProvider clientConfiguration:config]; NSString *privateBucketName = [OSSTestUtils getBucketName]; OSSCreateBucketRequest *createBucket = [OSSCreateBucketRequest new]; createBucket.bucketName = privateBucketName; OSSTask *task = [client createBucket:createBucket]; [task waitUntilFinished]; XCTAssertNil(((OSSResult *)task.result).metrics); OSSPutObjectRequest * put = [OSSPutObjectRequest new]; put.bucketName = privateBucketName; put.objectKey = OSS_IMAGE_KEY; put.uploadingFileURL = [[NSBundle mainBundle] URLForResource:@"hasky" withExtension:@"jpeg"]; task = [client putObject:put]; [task waitUntilFinished]; XCTAssertNil(((OSSResult *)task.result).metrics); OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = privateBucketName; get.objectKey = @"error"; get.onRecieveData = ^(NSData * _Nonnull data) { }; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error.userInfo[OSSNetworkTaskMetrics]); config = [OSSClientConfiguration new]; config.isAllowNetworkMetricInfo = YES; client = [[OSSClient alloc] initWithEndpoint:OSS_ENDPOINT credentialProvider:credentialProvider clientConfiguration:config]; put = [OSSPutObjectRequest new]; put.bucketName = privateBucketName; put.objectKey = OSS_IMAGE_KEY; put.uploadingFileURL = [[NSBundle mainBundle] URLForResource:@"hasky" withExtension:@"jpeg"]; task = [client putObject:put]; [task waitUntilFinished]; XCTAssertNotNil(((OSSResult *)task.result).metrics); get = [OSSGetObjectRequest new]; get.bucketName = privateBucketName; get.objectKey = @"error"; get.onRecieveData = ^(NSData * _Nonnull data) { }; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNotNil(task.error.userInfo[OSSNetworkTaskMetrics]); [OSSTestUtils cleanBucket:privateBucketName with:client]; } - (void)testAPI_signerV1 { NSString *bucketName = [@"test-signerv1-" stringByAppendingFormat:@"%@", @((NSInteger)[NSDate new].timeIntervalSince1970)]; NSString *objectKey = @"signerV1"; NSURL * fileURL = [[NSBundle mainBundle] URLForResource:@"hasky" withExtension:@"jpeg"]; OSSClientConfiguration *config = [OSSClientConfiguration new]; config.signVersion = OSSSignVersionV1; // OSSPlainTextAKSKPairCredentialProvider id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:OSS_ACCESSKEY_ID secretKey:OSS_SECRETKEY_ID]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; OSSCreateBucketRequest *createBucketRequest = [OSSCreateBucketRequest new]; createBucketRequest.bucketName = bucketName; OSSTask *task = [client createBucket:createBucketRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); OSSPutObjectRequest *putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); // OSSStsTokenCredentialProvider OSSFederationToken *federationToken = [OSSTestUtils getOssFederationToken]; credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:federationToken.tAccessKey secretKeyId:federationToken.tSecretKey securityToken:federationToken.tToken]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); // OSSFederationCredentialProvider credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{ return [OSSTestUtils getOssFederationToken]; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); // OSSCustomSignerCredentialProvider credentialProvider = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^NSString * _Nullable(NSString * _Nonnull contentToSign, NSError *__autoreleasing _Nullable * _Nullable error) { NSString *signature = [OSSUtil calBase64Sha1WithData:contentToSign withSecret:OSS_SECRETKEY_ID]; XCTAssertNotNil(signature); return [NSString stringWithFormat:@"OSS %@:%@", OSS_ACCESSKEY_ID, signature]; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); [OSSTestUtils cleanBucket:bucketName with:client]; } - (void)testAPI_signerV4 { NSString *bucketName = [@"test-signerv4-" stringByAppendingFormat:@"%@", @((NSInteger)[NSDate new].timeIntervalSince1970)]; NSString *objectKey = @"signerV4/!@#$%^&*()_=\\|';:><[.-+]{}?\"~`"; NSURL * fileURL = [[NSBundle mainBundle] URLForResource:@"hasky" withExtension:@"jpeg"]; NSString *endpoint = OSS_ENDPOINT; OSSClientConfiguration *config = [OSSClientConfiguration new]; config.signVersion = OSSSignVersionV4; // OSSPlainTextAKSKPairCredentialProvider id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:OSS_ACCESSKEY_ID secretKey:OSS_SECRETKEY_ID]; OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; client.region = OSS_REGION; OSSCreateBucketRequest *createBucketRequest = [OSSCreateBucketRequest new]; createBucketRequest.bucketName = bucketName; OSSTask *task = [client createBucket:createBucketRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); OSSPutObjectRequest *putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); OSSGetObjectRequest *get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); // OSSStsTokenCredentialProvider OSSFederationToken *federationToken = [OSSTestUtils getOssFederationToken]; credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:federationToken.tAccessKey secretKeyId:federationToken.tSecretKey securityToken:federationToken.tToken]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; client.region = OSS_REGION; putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); // OSSFederationCredentialProvider credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{ return [OSSTestUtils getOssFederationToken]; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; client.region = OSS_REGION; putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNil(task.error); get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNil(task.error); // OSSCustomSignerCredentialProvider credentialProvider = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^NSString * _Nullable(NSString * _Nonnull contentToSign, NSError *__autoreleasing _Nullable * _Nullable error) { NSData *jsonData = [contentToSign dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *content = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:error]; NSString *date = content[OSSContentDate]; NSString *region = content[OSSContentRegion]; NSString *product = content[OSSContentProduct]; NSString *stringToSign = content[OSSContentStringToSign]; id<OSSServiceSignature> serviceSignature = [HmacSHA256Signature new]; NSData *signingSecret = [[@"aliyun_v4" stringByAppendingString:OSS_SECRETKEY_ID] dataUsingEncoding:NSUTF8StringEncoding]; NSData *signingDate = [serviceSignature computeHash:signingSecret data:[date dataUsingEncoding:NSUTF8StringEncoding]]; NSData *signingRegion = [serviceSignature computeHash:signingDate data:[region dataUsingEncoding:NSUTF8StringEncoding]]; NSData *signingService = [serviceSignature computeHash:signingRegion data:[product dataUsingEncoding:NSUTF8StringEncoding]]; NSData *signingKey =[serviceSignature computeHash:signingService data:[@"aliyun_v4_request" dataUsingEncoding:NSUTF8StringEncoding]]; NSData *result = [serviceSignature computeHash:signingKey data:[stringToSign dataUsingEncoding:NSUTF8StringEncoding]]; NSString *signature = [result oss_hexString]; NSString *credential = [NSString stringWithFormat:@"Credential=%@/%@/%@/%@/aliyun_v4_request", OSS_ACCESSKEY_ID, date, region, product]; NSString *signedHeaders = @""; NSString *sign = [NSString stringWithFormat:@",Signature=%@", signature]; return [NSString stringWithFormat:@"OSS4-HMAC-SHA256 %@%@%@", credential, signedHeaders, sign]; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:config]; client.region = OSS_REGION; putObjectRequest = [OSSPutObjectRequest new]; putObjectRequest.bucketName = bucketName; putObjectRequest.objectKey = objectKey; putObjectRequest.uploadingFileURL = fileURL; task = [client putObject:putObjectRequest]; [task waitUntilFinished]; XCTAssertNotNil(task.error); XCTAssertTrue([task.error.userInfo[OSSErrorMessageTOKEN] isEqualToString:@"V4 signature does not support OSSCustomSignerCredentialProvider"]); get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; task = [client getObject:get]; [task waitUntilFinished]; XCTAssertNotNil(task.error); XCTAssertTrue([task.error.userInfo[OSSErrorMessageTOKEN] isEqualToString:@"V4 signature does not support OSSCustomSignerCredentialProvider"]); [OSSTestUtils cleanBucket:bucketName with:client]; } @end