5 #import <OCMock/OCMock.h>
6 #import <XCTest/XCTest.h>
8 #include "flutter/common/constants.h"
25 - (void)testOldGenHeapSizeSetting {
27 int64_t old_gen_heap_size =
28 std::round([NSProcessInfo processInfo].physicalMemory * .48 / flutter::kMegaByteSizeInBytes);
29 XCTAssertEqual(project.
settings.old_gen_heap_size, old_gen_heap_size);
32 - (void)testResourceCacheMaxBytesThresholdSetting {
34 CGFloat scale = [UIScreen mainScreen].scale;
35 CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width * scale;
36 CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height * scale;
37 size_t resource_cache_max_bytes_threshold = screenWidth * screenHeight * 12 * 4;
38 XCTAssertEqual(project.
settings.resource_cache_max_bytes_threshold,
39 resource_cache_max_bytes_threshold);
42 - (void)testMainBundleSettingsAreCorrectlyParsed {
43 NSBundle* mainBundle = [NSBundle mainBundle];
44 NSDictionary* appTransportSecurity =
45 [mainBundle objectForInfoDictionaryKey:@"NSAppTransportSecurity"];
47 XCTAssertEqualObjects(
48 @"[[\"invalid-site.com\
",true,false],[\"sub.invalid-site.com\",false,false]]",
52 - (void)testLeakDartVMSettingsAreCorrectlyParsed {
54 NSBundle* mainBundle = [NSBundle mainBundle];
55 NSNumber* leakDartVM = [mainBundle objectForInfoDictionaryKey:@"FLTLeakDartVM"];
56 XCTAssertEqual(leakDartVM.boolValue, NO);
60 XCTAssertEqual(settings.leak_vm, NO);
63 - (void)testFLTFrameworkBundleInternalWhenBundleIsNotPresent {
69 - (void)testFLTFrameworkBundleInternalWhenBundleIsPresent {
70 NSString* presentBundleID =
@"io.flutter.flutter";
73 XCTAssertNotNil(found);
76 - (void)testFLTGetApplicationBundleWhenCurrentTargetIsNotExtension {
78 XCTAssertEqual(bundle, [NSBundle mainBundle]);
81 - (void)testFLTGetApplicationBundleWhenCurrentTargetIsExtension {
82 id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
83 NSURL* url = [[NSBundle mainBundle].bundleURL URLByAppendingPathComponent:@"foo/ext.appex"];
84 OCMStub([mockMainBundle bundleURL]).andReturn(url);
86 [mockMainBundle stopMocking];
87 XCTAssertEqualObjects(bundle.bundleURL, [NSBundle mainBundle].bundleURL);
90 - (void)testFLTAssetsURLFromBundle {
93 id mockBundle = OCMClassMock([NSBundle
class]);
94 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
95 NSString* resultAssetsPath =
@"path/to/foo/assets";
96 OCMStub([mockBundle pathForResource:
@"foo/assets" ofType:nil]).andReturn(resultAssetsPath);
98 XCTAssertEqualObjects(path,
@"path/to/foo/assets");
102 id mockBundle = OCMClassMock([NSBundle
class]);
103 id mockMainBundle = OCMPartialMock(NSBundle.mainBundle);
104 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
105 OCMStub([mockMainBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(nil);
106 NSString* resultAssetsPath =
@"path/to/foo/assets";
107 OCMStub([mockBundle pathForResource:
@"foo/assets" ofType:nil]).andReturn(resultAssetsPath);
109 XCTAssertEqualObjects(path,
@"path/to/foo/assets");
110 [mockMainBundle stopMocking];
114 id mockBundle = OCMClassMock([NSBundle
class]);
115 id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
116 NSString* resultAssetsPath =
@"path/to/foo/assets";
117 OCMStub([mockBundle pathForResource:
@"Frameworks/App.framework/flutter_assets" ofType:nil])
119 OCMStub([mockMainBundle pathForResource:
@"Frameworks/App.framework/flutter_assets" ofType:nil])
120 .andReturn(resultAssetsPath);
122 XCTAssertEqualObjects(path,
@"path/to/foo/assets");
123 [mockMainBundle stopMocking];
127 - (void)testFLTAssetPathReturnsTheCorrectValue {
130 id mockBundle = OCMClassMock([NSBundle
class]);
131 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
132 XCTAssertEqualObjects(
FLTAssetPath(mockBundle),
@"foo/assets");
136 id mockBundle = OCMClassMock([NSBundle
class]);
137 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(nil);
142 - (void)testLookUpForAssets {
144 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
146 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
149 XCTAssertEqualObjects(assetsPath,
@"foo/assets/bar");
150 [mockBundle stopMocking];
153 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
155 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(nil);
158 XCTAssertEqualObjects(assetsPath,
@"Frameworks/App.framework/flutter_assets/bar");
159 [mockBundle stopMocking];
163 - (void)testLookUpForAssetsFromBundle {
165 id mockBundle = OCMClassMock([NSBundle
class]);
167 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
170 XCTAssertEqualObjects(assetsPath,
@"foo/assets/bar");
174 id mockBundle = OCMClassMock([NSBundle
class]);
175 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(nil);
178 XCTAssertEqualObjects(assetsPath,
@"Frameworks/App.framework/flutter_assets/bar");
182 - (void)testLookUpForAssetsFromPackage {
184 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
186 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
189 XCTAssertEqualObjects(assetsPath,
@"foo/assets/packages/bar_package/bar");
190 [mockBundle stopMocking];
193 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
195 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(nil);
198 XCTAssertEqualObjects(assetsPath,
199 @"Frameworks/App.framework/flutter_assets/packages/bar_package/bar");
200 [mockBundle stopMocking];
204 - (void)testLookUpForAssetsFromPackageFromBundle {
206 id mockBundle = OCMClassMock([NSBundle
class]);
208 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(
@"foo/assets");
213 XCTAssertEqualObjects(assetsPath,
@"foo/assets/packages/bar_package/bar");
216 id mockBundle = OCMClassMock([NSBundle
class]);
218 OCMStub([mockBundle objectForInfoDictionaryKey:
@"FLTAssetsPath"]).andReturn(nil);
223 XCTAssertEqualObjects(assetsPath,
224 @"Frameworks/App.framework/flutter_assets/packages/bar_package/bar");
228 - (void)testDisableImpellerSettingIsCorrectlyParsed {
229 id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
230 OCMStub([mockMainBundle objectForInfoDictionaryKey:
@"FLTEnableImpeller"]).andReturn(
@"NO");
234 XCTAssertEqual(settings.enable_impeller, NO);
235 [mockMainBundle stopMocking];
238 - (void)testEnableImpellerSettingIsCorrectlyParsed {
239 id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
240 OCMStub([mockMainBundle objectForInfoDictionaryKey:
@"FLTEnableImpeller"]).andReturn(
@"YES");
244 XCTAssertEqual(settings.enable_impeller, YES);
245 [mockMainBundle stopMocking];
248 - (void)testEnableImpellerSettingIsCorrectlyOverriddenByCommandLine {
249 id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
250 OCMStub([mockMainBundle objectForInfoDictionaryKey:
@"FLTEnableImpeller"]).andReturn(
@"NO");
251 id mockProcessInfo = OCMPartialMock([NSProcessInfo processInfo]);
252 NSArray* arguments = @[ @"process_name", @"--enable-impeller" ];
253 OCMStub([mockProcessInfo arguments]).andReturn(arguments);
257 XCTAssertEqual(settings.enable_impeller, YES);
258 [mockMainBundle stopMocking];
261 - (void)testDisableImpellerSettingIsCorrectlyOverriddenByCommandLine {
262 id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
263 OCMStub([mockMainBundle objectForInfoDictionaryKey:
@"FLTEnableImpeller"]).andReturn(
@"YES");
264 id mockProcessInfo = OCMPartialMock([NSProcessInfo processInfo]);
265 NSArray* arguments = @[ @"process_name", @"--enable-impeller=false" ];
266 OCMStub([mockProcessInfo arguments]).andReturn(arguments);
270 XCTAssertEqual(settings.enable_impeller, NO);
271 [mockMainBundle stopMocking];
274 - (void)testDisableImpellerAppBundleSettingIsCorrectlyParsed {
276 id mockAppBundle = OCMClassMock([NSBundle
class]);
277 OCMStub([mockAppBundle objectForInfoDictionaryKey:
@"FLTEnableImpeller"]).andReturn(
@"NO");
278 OCMStub([mockAppBundle bundleWithIdentifier:bundleId]).andReturn(mockAppBundle);
282 XCTAssertEqual(settings.enable_impeller, NO);
284 [mockAppBundle stopMocking];
287 - (void)testEnableImpellerAppBundleSettingIsCorrectlyParsed {
289 id mockAppBundle = OCMClassMock([NSBundle
class]);
290 OCMStub([mockAppBundle objectForInfoDictionaryKey:
@"FLTEnableImpeller"]).andReturn(
@"YES");
291 OCMStub([mockAppBundle bundleWithIdentifier:bundleId]).andReturn(mockAppBundle);
299 XCTAssertEqual(settings.enable_impeller, YES);
301 [mockAppBundle stopMocking];
304 - (void)testEnableTraceSystraceSettingIsCorrectlyParsed {
305 NSBundle* mainBundle = [NSBundle mainBundle];
306 NSNumber* enableTraceSystrace = [mainBundle objectForInfoDictionaryKey:@"FLTTraceSystrace"];
307 XCTAssertNotNil(enableTraceSystrace);
308 XCTAssertEqual(enableTraceSystrace.boolValue, NO);
310 XCTAssertEqual(settings.trace_systrace, NO);
313 - (void)testEnableDartProflingSettingIsCorrectlyParsed {
314 NSBundle* mainBundle = [NSBundle mainBundle];
315 NSNumber* enableTraceSystrace = [mainBundle objectForInfoDictionaryKey:@"FLTEnableDartProfiling"];
316 XCTAssertNotNil(enableTraceSystrace);
317 XCTAssertEqual(enableTraceSystrace.boolValue, NO);
319 XCTAssertEqual(settings.trace_systrace, NO);
322 - (void)testEmptySettingsAreCorrect {
323 XCTAssertFalse([
FlutterDartProject allowsArbitraryLoads:[[NSDictionary alloc] init]]);
324 XCTAssertEqualObjects(
@"", [
FlutterDartProject domainNetworkPolicy:[[NSDictionary alloc] init]]);
327 - (void)testAllowsArbitraryLoads {
328 XCTAssertFalse([
FlutterDartProject allowsArbitraryLoads:@{
@"NSAllowsArbitraryLoads" : @
false}]);
329 XCTAssertTrue([
FlutterDartProject allowsArbitraryLoads:@{
@"NSAllowsArbitraryLoads" : @
true}]);
332 - (void)testProperlyFormedExceptionDomains {
333 NSDictionary* domainInfoOne = @{
334 @"NSIncludesSubdomains" : @
false,
335 @"NSExceptionAllowsInsecureHTTPLoads" : @
true,
336 @"NSExceptionMinimumTLSVersion" :
@"4.0"
338 NSDictionary* domainInfoTwo = @{
339 @"NSIncludesSubdomains" : @
true,
340 @"NSExceptionAllowsInsecureHTTPLoads" : @
false,
341 @"NSExceptionMinimumTLSVersion" :
@"4.0"
343 NSDictionary* domainInfoThree = @{
344 @"NSIncludesSubdomains" : @
false,
345 @"NSExceptionAllowsInsecureHTTPLoads" : @
true,
346 @"NSExceptionMinimumTLSVersion" :
@"4.0"
348 NSDictionary* exceptionDomains = @{
349 @"domain.name" : domainInfoOne,
350 @"sub.domain.name" : domainInfoTwo,
351 @"sub.two.domain.name" : domainInfoThree
353 NSDictionary* appTransportSecurity = @{
@"NSExceptionDomains" : exceptionDomains};
354 XCTAssertEqualObjects(
@"[[\"domain.name\
",false,true],[\"sub.domain.name\",true,false],"
355 @"[\"sub.two.domain.name\
",false,true]]",
359 - (void)testExceptionDomainsWithMissingInfo {
360 NSDictionary* domainInfoOne = @{
@"NSExceptionMinimumTLSVersion" :
@"4.0"};
361 NSDictionary* domainInfoTwo = @{
362 @"NSIncludesSubdomains" : @
true,
364 NSDictionary* domainInfoThree = @{};
365 NSDictionary* exceptionDomains = @{
366 @"domain.name" : domainInfoOne,
367 @"sub.domain.name" : domainInfoTwo,
368 @"sub.two.domain.name" : domainInfoThree
370 NSDictionary* appTransportSecurity = @{
@"NSExceptionDomains" : exceptionDomains};
371 XCTAssertEqualObjects(
@"[[\"domain.name\
",false,false],[\"sub.domain.name\",true,false],"
372 @"[\"sub.two.domain.name\
",false,false]]",