blob: 218bc780a9b5296150823093035f5db1301756bd [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Flutter/Flutter.h>
#import <XCTest/XCTest.h>
#import "AppDelegate.h"
@interface FlutterEngineTest : XCTestCase
@end
@implementation FlutterEngineTest
extern NSNotificationName const FlutterViewControllerWillDealloc;
- (void)testIsolateId {
FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"test" project:nil];
XCTAssertNil(engine.isolateId);
[self keyValueObservingExpectationForObject:engine keyPath:@"isolateId" handler:nil];
XCTAssertTrue([engine runWithEntrypoint:nil]);
[self waitForExpectationsWithTimeout:30.0 handler:nil];
XCTAssertNotNil(engine.isolateId);
XCTAssertTrue([engine.isolateId hasPrefix:@"isolates/"]);
[engine destroyContext];
XCTAssertNil(engine.isolateId);
}
- (void)testChannelSetup {
FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"test" project:nil];
XCTAssertNil(engine.navigationChannel);
XCTAssertNil(engine.platformChannel);
XCTAssertNil(engine.lifecycleChannel);
XCTAssertTrue([engine run]);
XCTAssertNotNil(engine.navigationChannel);
XCTAssertNotNil(engine.platformChannel);
XCTAssertNotNil(engine.lifecycleChannel);
[engine destroyContext];
XCTAssertNil(engine.navigationChannel);
XCTAssertNil(engine.platformChannel);
XCTAssertNil(engine.lifecycleChannel);
}
// https://github.com/flutter/flutter/issues/123776
- (void)testReleaseViewControllerAfterDestroyContextInHeadlessMode {
FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"test"
project:nil
allowHeadlessExecution:YES];
XCTAssertNil(engine.navigationChannel);
XCTAssertNil(engine.platformChannel);
XCTAssertNil(engine.lifecycleChannel);
XCTAssertTrue([engine run]);
XCTAssertNotNil(engine.navigationChannel);
XCTAssertNotNil(engine.platformChannel);
XCTAssertNotNil(engine.lifecycleChannel);
XCTestExpectation* expectation =
[[XCTestExpectation alloc] initWithDescription:@"notification called"];
@autoreleasepool {
FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:engine
nibName:nil
bundle:nil];
[engine setViewController:viewController];
[engine destroyContext];
[[NSNotificationCenter defaultCenter] addObserverForName:FlutterViewControllerWillDealloc
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification* _Nonnull note) {
[expectation fulfill];
}];
viewController = nil;
}
[self waitForExpectations:@[ expectation ] timeout:30.0];
XCTAssertNil(engine.navigationChannel);
XCTAssertNil(engine.platformChannel);
XCTAssertNil(engine.lifecycleChannel);
}
@end