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);
}
export var testMemoryLeak = function () {
export var testMemoryLeak = function (done) {
helper.buildUIWithWeakRefAndInteract(_createButtonFunc, function (button) {
buttonTestsNative.performNativeClick(button);
});
}, done);
}
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 testFinished = false;
var pageFactory = function (): page.Page {
@ -167,23 +167,28 @@ export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: (
newPage.on("loaded", () => {
loaded = true;
var weakRef = new WeakRef(createFunc());
try {
sp.addChild(weakRef.get());
sp.addChild(weakRef.get());
if (interactWithViewFunc) {
interactWithViewFunc(weakRef.get());
}
if (interactWithViewFunc) {
interactWithViewFunc(weakRef.get());
sp.removeChild(weakRef.get());
if (newPage.ios) {
// Could cause GC on the next call.
// NOTE: Don't replace this with forceGC();
new ArrayBuffer(4 * 1024 * 1024);
}
utils.GC();
TKUnit.waitUntilReady(() => { return weakRef.get() ? !(weakRef.get().isLoaded) : true; }, MEMORY_ASYNC);
TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!");
testFinished = true;
}
sp.removeChild(weakRef.get());
if (newPage.ios) {
// Could cause GC on the next call.
// NOTE: Don't replace this with forceGC();
new ArrayBuffer(4 * 1024 * 1024);
catch (e) {
done(e);
}
utils.GC();
TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!");
testFinished = true;
});
return newPage;
@ -195,6 +200,7 @@ export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: (
}
finally {
goBack();
done(null);
}
}

View File

@ -633,12 +633,7 @@ export function test_ConverterIsCalledJustOnce_onAddingItemsToListView() {
helper.buildUIAndRunTest(listView, testAction);
}
export function test_no_memory_leak_when_items_is_regular_array() {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
export function test_no_memory_leak_when_items_is_regular_array(done) {
var createFunc = function (): listViewModule.ListView {
var listView = new listViewModule.ListView();
listView.items = FEW_ITEMS;
@ -647,15 +642,10 @@ export function test_no_memory_leak_when_items_is_regular_array() {
helper.buildUIWithWeakRefAndInteract(createFunc, (list) => {
TKUnit.assert(list.isLoaded, "ListView should be loaded here");
});
}, done);
}
export function test_no_memory_leak_when_items_is_observable_array() {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
export function test_no_memory_leak_when_items_is_observable_array(done) {
// Keep the reference to the observable array to test the weakEventListener
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) => {
TKUnit.assert(list.isLoaded, "ListView should be loaded here");
});
}, done);
}
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 repeater = new repeaterModule.Repeater();
repeater.items = FEW_ITEMS;
@ -465,10 +465,10 @@ export function test_no_memory_leak_when_items_is_regular_array() {
helper.buildUIWithWeakRefAndInteract(createFunc,(list) => {
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
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) => {
TKUnit.assert(list.isLoaded, "Repeater should be loaded here");
});
}, done);
}
*/
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 colorModule = require("color");
import enums = require("ui/enums");
import utils = require("utils/utils");
// <snippet module="ui/text-field" title="TextField">
// # TextField
@ -428,13 +427,8 @@ export var testNativeTextAlignmentFromLocal = function () {
});
}
export var testMemoryLeak = function () {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
export var testMemoryLeak = function (done) {
helper.buildUIWithWeakRefAndInteract(_createTextFieldFunc, function (textField) {
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 colorModule = require("color");
import enums = require("ui/enums");
import utils = require("utils/utils");
// <snippet module="ui/text-view" title="TextView">
// # TextView
@ -469,13 +468,8 @@ export var testNativeTextAlignmentFromLocal = function () {
});
}
export var testMemoryLeak = function () {
if (utils.ios) {
if (testRunner.isRunningOnEmulator() || utils.ios.MajorVersion > 8) {
return;
}
}
export var testMemoryLeak = function (done) {
helper.buildUIWithWeakRefAndInteract(_createTextViewFunc, function (textView) {
textViewTestsNative.typeTextNatively(textView, "Hello, world!");
});
}, done);
}

View File

@ -135,21 +135,28 @@ export function test_handlerIsDetached_WhenAllListenersAreRemoved() {
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();
for (var i = 0; i < 100; i++) {
addListenerWithSource(source);
}
try {
helper.forceGC();
helper.forceGC();
var target = new Target();
var target = new Target();
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
weakEvents.removeWeakEventListener(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)
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) {

View File

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