Memory leak tests back to schedule.

This commit is contained in:
Nedyalko Nikolov
2015-10-14 11:08:09 +03:00
parent 0435e4773f
commit 332b77f435
8 changed files with 57 additions and 64 deletions

View File

@ -81,10 +81,10 @@ export var testNativeBackgroundColorFromLocal = function () {
helper.buildUIAndRunTest(_createButtonFunc(), _testNativeBackgroundColorFromLocal); helper.buildUIAndRunTest(_createButtonFunc(), _testNativeBackgroundColorFromLocal);
} }
export var testMemoryLeak = function () { export var testMemoryLeak = function (done) {
helper.buildUIWithWeakRefAndInteract(_createButtonFunc, function (button) { helper.buildUIWithWeakRefAndInteract(_createButtonFunc, function (button) {
buttonTestsNative.performNativeClick(button); buttonTestsNative.performNativeClick(button);
}); }, done);
} }
var _createButtonFunc = function (): buttonModule.Button { var _createButtonFunc = function (): buttonModule.Button {

View File

@ -155,7 +155,7 @@ export function navigateToModuleAndRunTest(moduleName, context, testFunction) {
} }
} }
export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: () => T, interactWithViewFunc?: (view: T) => void) { export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: () => T, interactWithViewFunc?: (view: T) => void, done?) {
var newPage: page.Page; var newPage: page.Page;
var testFinished = false; var testFinished = false;
var pageFactory = function (): page.Page { var pageFactory = function (): page.Page {
@ -167,7 +167,7 @@ export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: (
newPage.on("loaded", () => { newPage.on("loaded", () => {
loaded = true; loaded = true;
var weakRef = new WeakRef(createFunc()); var weakRef = new WeakRef(createFunc());
try {
sp.addChild(weakRef.get()); sp.addChild(weakRef.get());
if (interactWithViewFunc) { if (interactWithViewFunc) {
@ -182,8 +182,13 @@ export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: (
} }
utils.GC(); utils.GC();
TKUnit.waitUntilReady(() => { return weakRef.get() ? !(weakRef.get().isLoaded) : true; }, MEMORY_ASYNC);
TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!"); TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!");
testFinished = true; testFinished = true;
}
catch (e) {
done(e);
}
}); });
return newPage; return newPage;
@ -195,6 +200,7 @@ export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: (
} }
finally { finally {
goBack(); goBack();
done(null);
} }
} }

View File

@ -633,12 +633,7 @@ export function test_ConverterIsCalledJustOnce_onAddingItemsToListView() {
helper.buildUIAndRunTest(listView, testAction); helper.buildUIAndRunTest(listView, testAction);
} }
export function test_no_memory_leak_when_items_is_regular_array() { export function test_no_memory_leak_when_items_is_regular_array(done) {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
var createFunc = function (): listViewModule.ListView { var createFunc = function (): listViewModule.ListView {
var listView = new listViewModule.ListView(); var listView = new listViewModule.ListView();
listView.items = FEW_ITEMS; listView.items = FEW_ITEMS;
@ -647,15 +642,10 @@ export function test_no_memory_leak_when_items_is_regular_array() {
helper.buildUIWithWeakRefAndInteract(createFunc, (list) => { helper.buildUIWithWeakRefAndInteract(createFunc, (list) => {
TKUnit.assert(list.isLoaded, "ListView should be loaded here"); TKUnit.assert(list.isLoaded, "ListView should be loaded here");
}); }, done);
} }
export function test_no_memory_leak_when_items_is_observable_array() { export function test_no_memory_leak_when_items_is_observable_array(done) {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
// Keep the reference to the observable array to test the weakEventListener // Keep the reference to the observable array to test the weakEventListener
var colors = new observableArray.ObservableArray(["red", "green", "blue"]); var colors = new observableArray.ObservableArray(["red", "green", "blue"]);
@ -667,7 +657,7 @@ export function test_no_memory_leak_when_items_is_observable_array() {
helper.buildUIWithWeakRefAndInteract(createFunc, (list) => { helper.buildUIWithWeakRefAndInteract(createFunc, (list) => {
TKUnit.assert(list.isLoaded, "ListView should be loaded here"); TKUnit.assert(list.isLoaded, "ListView should be loaded here");
}); }, done);
} }
function loadViewWithItemNumber(args: listViewModule.ItemEventData) { function loadViewWithItemNumber(args: listViewModule.ItemEventData) {

View File

@ -456,7 +456,7 @@ export function test_ChildrenAreNotCreatedUntilTheRepeaterIsLoaded() {
} }
/* /*
export function test_no_memory_leak_when_items_is_regular_array() { export function test_no_memory_leak_when_items_is_regular_array(done) {
var createFunc = function (): repeaterModule.Repeater { var createFunc = function (): repeaterModule.Repeater {
var repeater = new repeaterModule.Repeater(); var repeater = new repeaterModule.Repeater();
repeater.items = FEW_ITEMS; repeater.items = FEW_ITEMS;
@ -465,10 +465,10 @@ export function test_no_memory_leak_when_items_is_regular_array() {
helper.buildUIWithWeakRefAndInteract(createFunc,(list) => { helper.buildUIWithWeakRefAndInteract(createFunc,(list) => {
TKUnit.assert(list.isLoaded, "Repeater should be loaded here"); TKUnit.assert(list.isLoaded, "Repeater should be loaded here");
}); }, done);
} }
export function test_no_memory_leak_when_items_is_observable_array() { export function test_no_memory_leak_when_items_is_observable_array(done) {
// Keep the reference to the observable array to test the weakEventListener // Keep the reference to the observable array to test the weakEventListener
var colors = new observableArray.ObservableArray(["red", "green", "blue"]); var colors = new observableArray.ObservableArray(["red", "green", "blue"]);
@ -480,7 +480,7 @@ export function test_no_memory_leak_when_items_is_observable_array() {
helper.buildUIWithWeakRefAndInteract(createFunc,(list) => { helper.buildUIWithWeakRefAndInteract(createFunc,(list) => {
TKUnit.assert(list.isLoaded, "Repeater should be loaded here"); TKUnit.assert(list.isLoaded, "Repeater should be loaded here");
}); }, done);
} }
*/ */
function getChildrenCount(repeater: repeaterModule.Repeater): number { function getChildrenCount(repeater: repeaterModule.Repeater): number {

View File

@ -6,7 +6,6 @@ import pagesModule = require("ui/page");
import textFieldTestsNative = require("./text-field-tests-native"); import textFieldTestsNative = require("./text-field-tests-native");
import colorModule = require("color"); import colorModule = require("color");
import enums = require("ui/enums"); import enums = require("ui/enums");
import utils = require("utils/utils");
// <snippet module="ui/text-field" title="TextField"> // <snippet module="ui/text-field" title="TextField">
// # TextField // # TextField
@ -428,13 +427,8 @@ export var testNativeTextAlignmentFromLocal = function () {
}); });
} }
export var testMemoryLeak = function () { export var testMemoryLeak = function (done) {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
helper.buildUIWithWeakRefAndInteract(_createTextFieldFunc, function (textField) { helper.buildUIWithWeakRefAndInteract(_createTextFieldFunc, function (textField) {
textFieldTestsNative.typeTextNatively(textField, "Hello, world!"); textFieldTestsNative.typeTextNatively(textField, "Hello, world!");
}); }, done);
} }

View File

@ -6,7 +6,6 @@ import pagesModule = require("ui/page");
import textViewTestsNative = require("./text-view-tests-native"); import textViewTestsNative = require("./text-view-tests-native");
import colorModule = require("color"); import colorModule = require("color");
import enums = require("ui/enums"); import enums = require("ui/enums");
import utils = require("utils/utils");
// <snippet module="ui/text-view" title="TextView"> // <snippet module="ui/text-view" title="TextView">
// # TextView // # TextView
@ -469,13 +468,8 @@ export var testNativeTextAlignmentFromLocal = function () {
}); });
} }
export var testMemoryLeak = function () { export var testMemoryLeak = function (done) {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
helper.buildUIWithWeakRefAndInteract(_createTextViewFunc, function (textView) { helper.buildUIWithWeakRefAndInteract(_createTextViewFunc, function (textView) {
textViewTestsNative.typeTextNatively(textView, "Hello, world!"); textViewTestsNative.typeTextNatively(textView, "Hello, world!");
}); }, done);
} }

View File

@ -135,13 +135,13 @@ export function test_handlerIsDetached_WhenAllListenersAreRemoved() {
TKUnit.assert(!source.hasListeners(observable.Observable.propertyChangeEvent), "All events should be detached"); TKUnit.assert(!source.hasListeners(observable.Observable.propertyChangeEvent), "All events should be detached");
} }
export function test_autoDetachingOfDeadReferences() { export function test_autoDetachingOfDeadReferences(done) {
var source = new observable.Observable(); var source = new observable.Observable();
for (var i = 0; i < 100; i++) { for (var i = 0; i < 100; i++) {
addListenerWithSource(source); addListenerWithSource(source);
} }
try {
helper.forceGC(); helper.forceGC();
var target = new Target(); var target = new Target();
@ -149,7 +149,14 @@ export function test_autoDetachingOfDeadReferences() {
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target); weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
weakEvents.removeWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target) weakEvents.removeWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target)
TKUnit.assert(!source.hasListeners(observable.Observable.propertyChangeEvent), "All events should be detached"); TKUnit.waitUntilReady(() => { return !source.hasListeners(observable.Observable.propertyChangeEvent); });
var testPass = (<any>source)._observers[observable.Observable.propertyChangeEvent] ? (<any>source)._observers[observable.Observable.propertyChangeEvent].length <= 1 : true;
TKUnit.assert(testPass, "All events should be detached");
done(null);
}
catch (e) {
done(e);
}
} }
function addListenerWithSource(source: observable.Observable) { function addListenerWithSource(source: observable.Observable) {

View File

@ -169,6 +169,7 @@ export module ios {
function registerCustomFonts() { function registerCustomFonts() {
var fontsFolderPath = fs.path.join(__dirname.substring(0, __dirname.indexOf("/tns_modules")), "fonts"); var fontsFolderPath = fs.path.join(__dirname.substring(0, __dirname.indexOf("/tns_modules")), "fonts");
if (fs.Folder.exists(fontsFolderPath)) {
var fontsFolder = fs.Folder.fromPath(fontsFolderPath); var fontsFolder = fs.Folder.fromPath(fontsFolderPath);
var onEachEntityFunc = function (fileEntity: fs.FileSystemEntity): boolean { var onEachEntityFunc = function (fileEntity: fs.FileSystemEntity): boolean {
if (fs.Folder.exists(fs.path.join(fontsFolderPath, fileEntity.name))) { if (fs.Folder.exists(fs.path.join(fontsFolderPath, fileEntity.name))) {
@ -179,6 +180,7 @@ function registerCustomFonts() {
} }
fontsFolder.eachEntity(onEachEntityFunc); fontsFolder.eachEntity(onEachEntityFunc);
}
} }
registerCustomFonts(); registerCustomFonts();