michael@0: /* Any: copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; michael@0: michael@0: Cu.import("resource://gre/modules/NetworkStatsDB.jsm"); michael@0: michael@0: const netStatsDb = new NetworkStatsDB(); michael@0: michael@0: function clearStore(store, callback) { michael@0: netStatsDb.dbNewTxn(store, "readwrite", function(aTxn, aStore) { michael@0: aStore.openCursor().onsuccess = function (event) { michael@0: let cursor = event.target.result; michael@0: if (cursor){ michael@0: cursor.delete(); michael@0: cursor.continue(); michael@0: } michael@0: }; michael@0: }, callback); michael@0: } michael@0: michael@0: function getNetworkId(aIccId, aNetworkType) { michael@0: return aIccId + '' + aNetworkType; michael@0: } michael@0: michael@0: add_test(function prepareDatabase() { michael@0: // Clear whole database to avoid starting tests with unknown state michael@0: // due to the previous tests. michael@0: clearStore('net_stats_store', function() { michael@0: clearStore('net_alarm', function() { michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: function filterTimestamp(date) { michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var offset = date.getTimezoneOffset() * 60 * 1000; michael@0: return Math.floor((date.getTime() - offset) / sampleRate) * sampleRate; michael@0: } michael@0: michael@0: function getNetworks() { michael@0: return [{ id: '0', type: Ci.nsIDOMMozNetworkStatsManager.WIFI }, michael@0: { id: '1234', type: Ci.nsIDOMMozNetworkStatsManager.MOBILE }]; michael@0: } michael@0: michael@0: function compareNetworks(networkA, networkB) { michael@0: return (networkA[0] == networkB[0] && networkA[1] == networkB[1]); michael@0: } michael@0: michael@0: add_test(function test_sampleRate() { michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: do_check_true(sampleRate > 0); michael@0: netStatsDb.sampleRate = 0; michael@0: sampleRate = netStatsDb.sampleRate; michael@0: do_check_true(sampleRate > 0); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_maxStorageSamples() { michael@0: var maxStorageSamples = netStatsDb.maxStorageSamples; michael@0: do_check_true(maxStorageSamples > 0); michael@0: netStatsDb.maxStorageSamples = 0; michael@0: maxStorageSamples = netStatsDb.maxStorageSamples; michael@0: do_check_true(maxStorageSamples > 0); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_fillResultSamples_emptyData() { michael@0: var samples = 3; michael@0: var data = []; michael@0: var start = filterTimestamp(new Date()); michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var end = start + (sampleRate * samples); michael@0: netStatsDb.fillResultSamples(start, end, data); michael@0: do_check_eq(data.length, samples + 1); michael@0: michael@0: var aux = start; michael@0: var success = true; michael@0: for (var i = 0; i <= samples; i++) { michael@0: if (data[i].date.getTime() != aux || data[i].rxBytes != undefined || data[i].txBytes != undefined) { michael@0: success = false; michael@0: break; michael@0: } michael@0: aux += sampleRate; michael@0: } michael@0: do_check_true(success); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_fillResultSamples_noEmptyData() { michael@0: var samples = 3; michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var start = filterTimestamp(new Date()); michael@0: var end = start + (sampleRate * samples); michael@0: var data = [{date: new Date(start + sampleRate), michael@0: rxBytes: 0, michael@0: txBytes: 0}]; michael@0: netStatsDb.fillResultSamples(start, end, data); michael@0: do_check_eq(data.length, samples + 1); michael@0: michael@0: var aux = start; michael@0: var success = true; michael@0: for (var i = 0; i <= samples; i++) { michael@0: if (i == 1) { michael@0: if (data[i].date.getTime() != aux || data[i].rxBytes != 0 || data[i].txBytes != 0) { michael@0: success = false; michael@0: break; michael@0: } michael@0: } else { michael@0: if (data[i].date.getTime() != aux || data[i].rxBytes != undefined || data[i].txBytes != undefined) { michael@0: success = false; michael@0: break; michael@0: } michael@0: } michael@0: aux += sampleRate; michael@0: } michael@0: do_check_true(success); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_clear() { michael@0: var networks = getNetworks(); michael@0: networks.forEach(function(network, index) { michael@0: networks[index] = {network: network, networkId: getNetworkId(network.id, network.type)}; michael@0: }, this); michael@0: michael@0: netStatsDb.clearStats(networks, function (error, result) { michael@0: do_check_eq(error, null); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_clear_interface() { michael@0: var networks = getNetworks(); michael@0: networks.forEach(function(network, index) { michael@0: networks[index] = {network: network, networkId: getNetworkId(network.id, network.type)}; michael@0: }, this); michael@0: michael@0: netStatsDb.clearInterfaceStats(networks[0], function (error, result) { michael@0: do_check_eq(error, null); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_internalSaveStats_singleSample() { michael@0: var networks = getNetworks(); michael@0: michael@0: var stats = { appId: 0, michael@0: serviceType: "", michael@0: network: [networks[0].id, networks[0].type], michael@0: timestamp: Date.now(), michael@0: rxBytes: 0, michael@0: txBytes: 0, michael@0: rxSystemBytes: 1234, michael@0: txSystemBytes: 1234, michael@0: rxTotalBytes: 1234, michael@0: txTotalBytes: 1234 }; michael@0: michael@0: netStatsDb.dbNewTxn("net_stats_store", "readwrite", function(txn, store) { michael@0: netStatsDb._saveStats(txn, store, stats); michael@0: }, function(error, result) { michael@0: do_check_eq(error, null); michael@0: michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: do_check_eq(result[0].appId, stats.appId); michael@0: do_check_eq(result[0].serviceType, stats.serviceType); michael@0: do_check_true(compareNetworks(result[0].network, stats.network)); michael@0: do_check_eq(result[0].timestamp, stats.timestamp); michael@0: do_check_eq(result[0].rxBytes, stats.rxBytes); michael@0: do_check_eq(result[0].txBytes, stats.txBytes); michael@0: do_check_eq(result[0].rxSystemBytes, stats.rxSystemBytes); michael@0: do_check_eq(result[0].txSystemBytes, stats.txSystemBytes); michael@0: do_check_eq(result[0].rxTotalBytes, stats.rxTotalBytes); michael@0: do_check_eq(result[0].txTotalBytes, stats.txTotalBytes); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_internalSaveStats_arraySamples() { michael@0: clearStore('net_stats_store', function() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: michael@0: var samples = 2; michael@0: var stats = []; michael@0: for (var i = 0; i < samples; i++) { michael@0: stats.push({ appId: 0, michael@0: serviceType: "", michael@0: network: network, michael@0: timestamp: Date.now() + (10 * i), michael@0: rxBytes: 0, michael@0: txBytes: 0, michael@0: rxSystemBytes: 1234, michael@0: txSystemBytes: 1234, michael@0: rxTotalBytes: 1234, michael@0: txTotalBytes: 1234 }); michael@0: } michael@0: michael@0: netStatsDb.dbNewTxn("net_stats_store", "readwrite", function(txn, store) { michael@0: netStatsDb._saveStats(txn, store, stats); michael@0: }, function(error, result) { michael@0: do_check_eq(error, null); michael@0: michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: michael@0: do_check_eq(result.length, samples); michael@0: var success = true; michael@0: for (var i = 0; i < samples; i++) { michael@0: if (result[i].appId != stats[i].appId || michael@0: result[i].serviceType != stats[i].serviceType || michael@0: !compareNetworks(result[i].network, stats[i].network) || michael@0: result[i].timestamp != stats[i].timestamp || michael@0: result[i].rxBytes != stats[i].rxBytes || michael@0: result[i].txBytes != stats[i].txBytes || michael@0: result[i].rxSystemBytes != stats[i].rxSystemBytes || michael@0: result[i].txSystemBytes != stats[i].txSystemBytes || michael@0: result[i].rxTotalBytes != stats[i].rxTotalBytes || michael@0: result[i].txTotalBytes != stats[i].txTotalBytes) { michael@0: success = false; michael@0: break; michael@0: } michael@0: } michael@0: do_check_true(success); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_internalRemoveOldStats() { michael@0: clearStore('net_stats_store', function() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: var samples = 10; michael@0: var stats = []; michael@0: for (var i = 0; i < samples - 1; i++) { michael@0: stats.push({ appId: 0, serviceType: "", michael@0: network: network, timestamp: Date.now() + (10 * i), michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 1234, txSystemBytes: 1234, michael@0: rxTotalBytes: 1234, txTotalBytes: 1234 }); michael@0: } michael@0: michael@0: stats.push({ appId: 0, serviceType: "", michael@0: network: network, timestamp: Date.now() + (10 * samples), michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 1234, txSystemBytes: 1234, michael@0: rxTotalBytes: 1234, txTotalBytes: 1234 }); michael@0: michael@0: netStatsDb.dbNewTxn("net_stats_store", "readwrite", function(txn, store) { michael@0: netStatsDb._saveStats(txn, store, stats); michael@0: var date = stats[stats.length - 1].timestamp michael@0: + (netStatsDb.sampleRate * netStatsDb.maxStorageSamples - 1) - 1; michael@0: netStatsDb._removeOldStats(txn, store, 0, "", network, date); michael@0: }, function(error, result) { michael@0: do_check_eq(error, null); michael@0: michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: function processSamplesDiff(networks, lastStat, newStat, callback) { michael@0: clearStore('net_stats_store', function() { michael@0: netStatsDb.dbNewTxn("net_stats_store", "readwrite", function(txn, store) { michael@0: netStatsDb._saveStats(txn, store, lastStat); michael@0: }, function(error, result) { michael@0: netStatsDb.dbNewTxn("net_stats_store", "readwrite", function(txn, store) { michael@0: let request = store.index("network").openCursor(newStat.network, "prev"); michael@0: request.onsuccess = function onsuccess(event) { michael@0: let cursor = event.target.result; michael@0: do_check_neq(cursor, null); michael@0: netStatsDb._processSamplesDiff(txn, store, cursor, newStat, true); michael@0: }; michael@0: }, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: callback(result); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: add_test(function test_processSamplesDiffSameSample() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var date = filterTimestamp(new Date()); michael@0: michael@0: var lastStat = { appId: 0, serviceType: "", michael@0: network: network, timestamp: date, michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 1234, txSystemBytes: 1234, michael@0: rxTotalBytes: 2234, txTotalBytes: 2234 }; michael@0: michael@0: var newStat = { appId: 0, serviceType: "", michael@0: network: network, timestamp: date, michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 2234, txSystemBytes: 2234, michael@0: rxTotalBytes: 2234, txTotalBytes: 2234 }; michael@0: michael@0: processSamplesDiff(networks, lastStat, newStat, function(result) { michael@0: do_check_eq(result.length, 1); michael@0: do_check_eq(result[0].appId, newStat.appId); michael@0: do_check_eq(result[0].serviceType, newStat.serviceType); michael@0: do_check_true(compareNetworks(result[0].network, newStat.network)); michael@0: do_check_eq(result[0].timestamp, newStat.timestamp); michael@0: do_check_eq(result[0].rxBytes, newStat.rxSystemBytes - lastStat.rxSystemBytes); michael@0: do_check_eq(result[0].txBytes, newStat.txSystemBytes - lastStat.txSystemBytes); michael@0: do_check_eq(result[0].rxTotalBytes, lastStat.rxTotalBytes + newStat.rxSystemBytes - lastStat.rxSystemBytes); michael@0: do_check_eq(result[0].txTotalBytes, lastStat.txTotalBytes + newStat.txSystemBytes - lastStat.txSystemBytes); michael@0: do_check_eq(result[0].rxSystemBytes, newStat.rxSystemBytes); michael@0: do_check_eq(result[0].txSystemBytes, newStat.txSystemBytes); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_processSamplesDiffNextSample() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var date = filterTimestamp(new Date()); michael@0: michael@0: var lastStat = { appId: 0, serviceType: "", michael@0: network: network, timestamp: date, michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 1234, txSystemBytes: 1234, michael@0: rxTotalBytes: 2234, txTotalBytes: 2234 }; michael@0: michael@0: var newStat = { appId: 0, serviceType: "", michael@0: network: network, timestamp: date + sampleRate, michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 1734, txSystemBytes: 1734, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }; michael@0: michael@0: processSamplesDiff(networks, lastStat, newStat, function(result) { michael@0: do_check_eq(result.length, 2); michael@0: do_check_eq(result[1].appId, newStat.appId); michael@0: do_check_eq(result[1].serviceType, newStat.serviceType); michael@0: do_check_true(compareNetworks(result[1].network, newStat.network)); michael@0: do_check_eq(result[1].timestamp, newStat.timestamp); michael@0: do_check_eq(result[1].rxBytes, newStat.rxSystemBytes - lastStat.rxSystemBytes); michael@0: do_check_eq(result[1].txBytes, newStat.txSystemBytes - lastStat.txSystemBytes); michael@0: do_check_eq(result[1].rxSystemBytes, newStat.rxSystemBytes); michael@0: do_check_eq(result[1].txSystemBytes, newStat.txSystemBytes); michael@0: do_check_eq(result[1].rxTotalBytes, lastStat.rxTotalBytes + newStat.rxSystemBytes - lastStat.rxSystemBytes); michael@0: do_check_eq(result[1].txTotalBytes, lastStat.txTotalBytes + newStat.txSystemBytes - lastStat.txSystemBytes); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_processSamplesDiffSamplesLost() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: var samples = 5; michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var date = filterTimestamp(new Date()); michael@0: var lastStat = { appId: 0, serviceType: "", michael@0: network: network, timestamp: date, michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 1234, txSystemBytes: 1234, michael@0: rxTotalBytes: 2234, txTotalBytes: 2234}; michael@0: michael@0: var newStat = { appId: 0, serviceType: "", michael@0: network: network, timestamp: date + (sampleRate * samples), michael@0: rxBytes: 0, txBytes: 0, michael@0: rxSystemBytes: 2234, txSystemBytes: 2234, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }; michael@0: michael@0: processSamplesDiff(networks, lastStat, newStat, function(result) { michael@0: do_check_eq(result.length, samples + 1); michael@0: do_check_eq(result[0].appId, newStat.appId); michael@0: do_check_eq(result[0].serviceType, newStat.serviceType); michael@0: do_check_true(compareNetworks(result[samples].network, newStat.network)); michael@0: do_check_eq(result[samples].timestamp, newStat.timestamp); michael@0: do_check_eq(result[samples].rxBytes, newStat.rxTotalBytes - lastStat.rxTotalBytes); michael@0: do_check_eq(result[samples].txBytes, newStat.txTotalBytes - lastStat.txTotalBytes); michael@0: do_check_eq(result[samples].rxSystemBytes, newStat.rxSystemBytes); michael@0: do_check_eq(result[samples].txSystemBytes, newStat.txSystemBytes); michael@0: do_check_eq(result[samples].rxTotalBytes, lastStat.rxTotalBytes + newStat.rxSystemBytes - lastStat.rxSystemBytes); michael@0: do_check_eq(result[samples].txTotalBytes, lastStat.txTotalBytes + newStat.txSystemBytes - lastStat.txSystemBytes); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_saveStats() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: michael@0: var stats = { appId: 0, michael@0: serviceType: "", michael@0: networkId: networks[0].id, michael@0: networkType: networks[0].type, michael@0: date: new Date(), michael@0: rxBytes: 2234, michael@0: txBytes: 2234, michael@0: isAccumulative: true }; michael@0: michael@0: clearStore('net_stats_store', function() { michael@0: netStatsDb.saveStats(stats, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: do_check_eq(result[0].appId, stats.appId); michael@0: do_check_eq(result[0].serviceType, stats.serviceType); michael@0: do_check_true(compareNetworks(result[0].network, network)); michael@0: let timestamp = filterTimestamp(stats.date); michael@0: do_check_eq(result[0].timestamp, timestamp); michael@0: do_check_eq(result[0].rxBytes, stats.rxBytes); michael@0: do_check_eq(result[0].txBytes, stats.txBytes); michael@0: do_check_eq(result[0].rxSystemBytes, stats.rxBytes); michael@0: do_check_eq(result[0].txSystemBytes, stats.txBytes); michael@0: do_check_eq(result[0].rxTotalBytes, stats.rxBytes); michael@0: do_check_eq(result[0].txTotalBytes, stats.txBytes); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_saveAppStats() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: michael@0: var stats = { appId: 1, michael@0: serviceType: "", michael@0: networkId: networks[0].id, michael@0: networkType: networks[0].type, michael@0: date: new Date(), michael@0: rxBytes: 2234, michael@0: txBytes: 2234, michael@0: isAccumulative: false }; michael@0: michael@0: clearStore('net_stats_store', function() { michael@0: netStatsDb.saveStats(stats, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: do_check_eq(result[0].appId, stats.appId); michael@0: do_check_eq(result[0].serviceType, stats.serviceType); michael@0: do_check_true(compareNetworks(result[0].network, network)); michael@0: let timestamp = filterTimestamp(stats.date); michael@0: do_check_eq(result[0].timestamp, timestamp); michael@0: do_check_eq(result[0].rxBytes, stats.rxBytes); michael@0: do_check_eq(result[0].txBytes, stats.txBytes); michael@0: do_check_eq(result[0].rxSystemBytes, 0); michael@0: do_check_eq(result[0].txSystemBytes, 0); michael@0: do_check_eq(result[0].rxTotalBytes, 0); michael@0: do_check_eq(result[0].txTotalBytes, 0); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_saveServiceStats() { michael@0: var networks = getNetworks(); michael@0: var network = [networks[0].id, networks[0].type]; michael@0: michael@0: var stats = { appId: 0, michael@0: serviceType: "FakeType", michael@0: networkId: networks[0].id, michael@0: networkType: networks[0].type, michael@0: date: new Date(), michael@0: rxBytes: 2234, michael@0: txBytes: 2234, michael@0: isAccumulative: false }; michael@0: michael@0: clearStore('net_stats_store', function() { michael@0: netStatsDb.saveStats(stats, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: do_check_eq(result[0].appId, stats.appId); michael@0: do_check_eq(result[0].serviceType, stats.serviceType); michael@0: do_check_true(compareNetworks(result[0].network, network)); michael@0: let timestamp = filterTimestamp(stats.date); michael@0: do_check_eq(result[0].timestamp, timestamp); michael@0: do_check_eq(result[0].rxBytes, stats.rxBytes); michael@0: do_check_eq(result[0].txBytes, stats.txBytes); michael@0: do_check_eq(result[0].rxSystemBytes, 0); michael@0: do_check_eq(result[0].txSystemBytes, 0); michael@0: do_check_eq(result[0].rxTotalBytes, 0); michael@0: do_check_eq(result[0].txTotalBytes, 0); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: function prepareFind(stats, callback) { michael@0: clearStore('net_stats_store', function() { michael@0: netStatsDb.dbNewTxn("net_stats_store", "readwrite", function(txn, store) { michael@0: netStatsDb._saveStats(txn, store, stats); michael@0: }, function(error, result) { michael@0: callback(error, result); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: add_test(function test_find () { michael@0: var networks = getNetworks(); michael@0: var networkWifi = [networks[0].id, networks[0].type]; michael@0: var networkMobile = [networks[1].id, networks[1].type]; // Fake mobile interface michael@0: var appId = 0; michael@0: var serviceType = ""; michael@0: michael@0: var samples = 5; michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var start = Date.now(); michael@0: var saveDate = filterTimestamp(new Date()); michael@0: var end = new Date(start + (sampleRate * (samples - 1))); michael@0: start = new Date(start - sampleRate); michael@0: var stats = []; michael@0: for (var i = 0; i < samples; i++) { michael@0: stats.push({ appId: appId, serviceType: serviceType, michael@0: network: networkWifi, timestamp: saveDate + (sampleRate * i), michael@0: rxBytes: 0, txBytes: 10, michael@0: rxSystemBytes: 0, txSystemBytes: 0, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }); michael@0: michael@0: michael@0: stats.push({ appId: appId, serviceType: serviceType, michael@0: network: networkMobile, timestamp: saveDate + (sampleRate * i), michael@0: rxBytes: 0, txBytes: 10, michael@0: rxSystemBytes: 0, txSystemBytes: 0, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }); michael@0: } michael@0: michael@0: prepareFind(stats, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.find(function (error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.serviceType, serviceType); michael@0: do_check_eq(result.network.id, networks[0].id); michael@0: do_check_eq(result.network.type, networks[0].type); michael@0: do_check_eq(result.start.getTime(), start.getTime()); michael@0: do_check_eq(result.end.getTime(), end.getTime()); michael@0: do_check_eq(result.data.length, samples + 1); michael@0: do_check_eq(result.data[0].rxBytes, null); michael@0: do_check_eq(result.data[1].rxBytes, 0); michael@0: do_check_eq(result.data[samples].rxBytes, 0); michael@0: run_next_test(); michael@0: }, appId, serviceType, networks[0], start, end); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_findAppStats () { michael@0: var networks = getNetworks(); michael@0: var networkWifi = [networks[0].id, networks[0].type]; michael@0: var networkMobile = [networks[1].id, networks[1].type]; // Fake mobile interface michael@0: var appId = 1; michael@0: var serviceType = ""; michael@0: michael@0: var samples = 5; michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var start = Date.now(); michael@0: var saveDate = filterTimestamp(new Date()); michael@0: var end = new Date(start + (sampleRate * (samples - 1))); michael@0: start = new Date(start - sampleRate); michael@0: var stats = []; michael@0: for (var i = 0; i < samples; i++) { michael@0: stats.push({ appId: appId, serviceType: serviceType, michael@0: network: networkWifi, timestamp: saveDate + (sampleRate * i), michael@0: rxBytes: 0, txBytes: 10, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }); michael@0: michael@0: stats.push({ appId: appId, serviceType: serviceType, michael@0: network: networkMobile, timestamp: saveDate + (sampleRate * i), michael@0: rxBytes: 0, txBytes: 10, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }); michael@0: } michael@0: michael@0: prepareFind(stats, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.find(function (error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.serviceType, serviceType); michael@0: do_check_eq(result.network.id, networks[0].id); michael@0: do_check_eq(result.network.type, networks[0].type); michael@0: do_check_eq(result.start.getTime(), start.getTime()); michael@0: do_check_eq(result.end.getTime(), end.getTime()); michael@0: do_check_eq(result.data.length, samples + 1); michael@0: do_check_eq(result.data[0].rxBytes, null); michael@0: do_check_eq(result.data[1].rxBytes, 0); michael@0: do_check_eq(result.data[samples].rxBytes, 0); michael@0: run_next_test(); michael@0: }, appId, serviceType, networks[0], start, end); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_findServiceStats () { michael@0: var networks = getNetworks(); michael@0: var networkWifi = [networks[0].id, networks[0].type]; michael@0: var networkMobile = [networks[1].id, networks[1].type]; // Fake mobile interface michael@0: var appId = 0; michael@0: var serviceType = "FakeType"; michael@0: michael@0: var samples = 5; michael@0: var sampleRate = netStatsDb.sampleRate; michael@0: var start = Date.now(); michael@0: var saveDate = filterTimestamp(new Date()); michael@0: var end = new Date(start + (sampleRate * (samples - 1))); michael@0: start = new Date(start - sampleRate); michael@0: var stats = []; michael@0: for (var i = 0; i < samples; i++) { michael@0: stats.push({ appId: appId, serviceType: serviceType, michael@0: network: networkWifi, timestamp: saveDate + (sampleRate * i), michael@0: rxBytes: 0, txBytes: 10, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }); michael@0: michael@0: stats.push({ appId: appId, serviceType: serviceType, michael@0: network: networkMobile, timestamp: saveDate + (sampleRate * i), michael@0: rxBytes: 0, txBytes: 10, michael@0: rxTotalBytes: 0, txTotalBytes: 0 }); michael@0: } michael@0: michael@0: prepareFind(stats, function(error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.find(function (error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.serviceType, serviceType); michael@0: do_check_eq(result.network.id, networks[0].id); michael@0: do_check_eq(result.network.type, networks[0].type); michael@0: do_check_eq(result.start.getTime(), start.getTime()); michael@0: do_check_eq(result.end.getTime(), end.getTime()); michael@0: do_check_eq(result.data.length, samples + 1); michael@0: do_check_eq(result.data[0].rxBytes, null); michael@0: do_check_eq(result.data[1].rxBytes, 0); michael@0: do_check_eq(result.data[samples].rxBytes, 0); michael@0: run_next_test(); michael@0: }, appId, serviceType, networks[0], start, end); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_saveMultipleAppStats () { michael@0: var networks = getNetworks(); michael@0: var networkWifi = networks[0]; michael@0: var networkMobile = networks[1]; // Fake mobile interface michael@0: michael@0: var saveDate = filterTimestamp(new Date()); michael@0: var cached = Object.create(null); michael@0: var serviceType = "FakeType"; michael@0: var wifiNetId = networkWifi.id + '' + networkWifi.type; michael@0: var mobileNetId = networkMobile.id + '' + networkMobile.type; michael@0: michael@0: cached[0 + '' + serviceType + wifiNetId] = { michael@0: appId: 0, date: new Date(), michael@0: networkId: networkWifi.id, networkType: networkWifi.type, michael@0: rxBytes: 0, txBytes: 10, michael@0: serviceType: serviceType, isAccumulative: false michael@0: }; michael@0: michael@0: cached[0 + '' + serviceType + mobileNetId] = { michael@0: appId: 0, date: new Date(), michael@0: networkId: networkMobile.id, networkType: networkMobile.type, michael@0: rxBytes: 0, txBytes: 10, michael@0: serviceType: serviceType, isAccumulative: false michael@0: }; michael@0: michael@0: cached[1 + '' + wifiNetId] = { michael@0: appId: 1, date: new Date(), michael@0: networkId: networkWifi.id, networkType: networkWifi.type, michael@0: rxBytes: 0, txBytes: 10, michael@0: serviceType: "", isAccumulative: false michael@0: }; michael@0: michael@0: cached[1 + '' + mobileNetId] = { michael@0: appId: 1, date: new Date(), michael@0: networkId: networkMobile.id, networkType: networkMobile.type, michael@0: rxBytes: 0, txBytes: 10, michael@0: serviceType: "", isAccumulative: false michael@0: }; michael@0: michael@0: cached[2 + '' + wifiNetId] = { michael@0: appId: 2, date: new Date(), michael@0: networkId: networkWifi.id, networkType: networkWifi.type, michael@0: rxBytes: 0, txBytes: 10, michael@0: serviceType: "", isAccumulative: false michael@0: }; michael@0: michael@0: cached[2 + '' + mobileNetId] = { michael@0: appId: 2, date: new Date(), michael@0: networkId: networkMobile.id, networkType: networkMobile.type, michael@0: rxBytes: 0, txBytes: 10, michael@0: serviceType: "", isAccumulative: false michael@0: }; michael@0: michael@0: let keys = Object.keys(cached); michael@0: let index = 0; michael@0: michael@0: networks.push(networkMobile); michael@0: michael@0: clearStore('net_stats_store', function() { michael@0: netStatsDb.saveStats(cached[keys[index]], michael@0: function callback(error, result) { michael@0: do_check_eq(error, null); michael@0: michael@0: if (index == keys.length - 1) { michael@0: netStatsDb.logAllRecords(function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 6); michael@0: do_check_eq(result[0].serviceType, serviceType); michael@0: do_check_eq(result[3].appId, 1); michael@0: do_check_true(compareNetworks(result[0].network, [networkWifi.id, networkWifi.type])); michael@0: do_check_eq(result[0].rxBytes, 0); michael@0: do_check_eq(result[0].txBytes, 10); michael@0: run_next_test(); michael@0: }); michael@0: return; michael@0: } michael@0: michael@0: index += 1; michael@0: netStatsDb.saveStats(cached[keys[index]], callback); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: var networkWifi = '00'; michael@0: var networkMobile = '11'; michael@0: michael@0: var examplePageURL = "http://example.com/index.html"; michael@0: var exampleManifestURL = "http://example.com/manifest.webapp"; michael@0: michael@0: var testPageURL = "http://test.com/index.html"; michael@0: var testManifestURL = "http://test.com/manifest.webapp"; michael@0: michael@0: var alarms = [{ id: null, michael@0: networkId: networkWifi, michael@0: absoluteThreshold: 10000, michael@0: relativeThreshold: 10000, michael@0: data: {foo: "something"}, michael@0: pageURL: examplePageURL, michael@0: manifestURL: exampleManifestURL }, michael@0: { id: null, michael@0: networkId: networkWifi, michael@0: absoluteThreshold: 1000, michael@0: relativeThreshold: 1000, michael@0: data: {foo: "else"}, michael@0: pageURL: examplePageURL, michael@0: manifestURL: exampleManifestURL }, michael@0: { id: null, michael@0: networkId: networkMobile, michael@0: absoluteThreshold: 100, michael@0: relativeThreshold: 100, michael@0: data: {foo: "to"}, michael@0: pageURL: examplePageURL, michael@0: manifestURL: exampleManifestURL }, michael@0: { id: null, michael@0: networkId: networkMobile, michael@0: absoluteThreshold: 10, michael@0: relativeThreshold: 10, michael@0: data: {foo: "test"}, michael@0: pageURL: testPageURL, michael@0: manifestURL: testManifestURL }]; michael@0: michael@0: var alarmsDbId = 1; michael@0: michael@0: add_test(function test_addAlarm() { michael@0: // Add alarms[0] -> DB: [ alarms[0] (id: 1) ] michael@0: // Check the insertion is OK. michael@0: netStatsDb.addAlarm(alarms[0], function(error, result) { michael@0: do_check_eq(error, null); michael@0: alarmsDbId = result; michael@0: netStatsDb.getAlarms(Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, exampleManifestURL, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: do_check_eq(result[0].id, alarmsDbId); michael@0: do_check_eq(result[0].networkId, alarms[0].networkId); michael@0: do_check_eq(result[0].absoluteThreshold, alarms[0].absoluteThreshold); michael@0: do_check_eq(result[0].relativeThreshold, alarms[0].relativeThreshold); michael@0: do_check_eq(result[0].data.foo, alarms[0].data.foo); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_getFirstAlarm() { michael@0: // Add alarms[1] -> DB: [ alarms[0] (id: 1), alarms[1] (id: 2) ] michael@0: // Check first alarm is alarms[1] because threshold is lower. michael@0: alarmsDbId += 1; michael@0: netStatsDb.addAlarm(alarms[1], function (error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result, alarmsDbId); michael@0: netStatsDb.getFirstAlarm(networkWifi, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.id, alarmsDbId); michael@0: do_check_eq(result.networkId, alarms[1].networkId); michael@0: do_check_eq(result.absoluteThreshold, alarms[1].absoluteThreshold); michael@0: do_check_eq(result.relativeThreshold, alarms[1].relativeThreshold); michael@0: do_check_eq(result.data.foo, alarms[1].data.foo); michael@0: do_check_eq(result.pageURL, alarms[1].pageURL); michael@0: do_check_eq(result.manifestURL, alarms[1].manifestURL); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_removeAlarm() { michael@0: // Remove alarms[1] (id: 2) -> DB: [ alarms[0] (id: 1) ] michael@0: // Check get first return alarms[0]. michael@0: netStatsDb.removeAlarm(alarmsDbId, alarms[0].manifestURL, function (error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.getFirstAlarm(networkWifi, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.id, alarmsDbId - 1); michael@0: do_check_eq(result.networkId, alarms[0].networkId); michael@0: do_check_eq(result.absoluteThreshold, alarms[0].absoluteThreshold); michael@0: do_check_eq(result.relativeThreshold, alarms[0].relativeThreshold); michael@0: do_check_eq(result.data.foo, alarms[0].data.foo); michael@0: do_check_eq(result.pageURL, alarms[0].pageURL); michael@0: do_check_eq(result.manifestURL, alarms[0].manifestURL); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_removeAppAlarm() { michael@0: // Remove alarms[0] (id: 1) -> DB: [ ] michael@0: netStatsDb.removeAlarm(alarmsDbId - 1, alarms[0].manifestURL, function (error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.getAlarms(networkWifi, exampleManifestURL, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 0); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_getAlarms() { michael@0: // Add all alarms -> DB: [ alarms[0] (id: 3), michael@0: // alarms[1] (id: 4), michael@0: // alarms[2] (id: 5), michael@0: // alarms[3] (id: 6) ] michael@0: // Check that getAlarms for wifi returns 2 alarms. michael@0: // Check that getAlarms for all connections returns 3 alarms. michael@0: michael@0: var callback = function () { michael@0: netStatsDb.getAlarms(networkWifi, exampleManifestURL, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 2); michael@0: netStatsDb.getAlarms(null, exampleManifestURL, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 3); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }; michael@0: michael@0: var index = 0; michael@0: michael@0: var addFunction = function () { michael@0: alarmsDbId += 1; michael@0: netStatsDb.addAlarm(alarms[index], function (error, result) { michael@0: do_check_eq(error, null); michael@0: index += 1; michael@0: do_check_eq(result, alarmsDbId); michael@0: if (index >= alarms.length) { michael@0: callback(); michael@0: return; michael@0: } michael@0: addFunction(); michael@0: }); michael@0: }; michael@0: michael@0: addFunction(); michael@0: }); michael@0: michael@0: add_test(function test_removeAppAllAlarms() { michael@0: // Remove all alarms for exampleManifestURL -> DB: [ alarms[3] (id: 6) ] michael@0: netStatsDb.removeAlarms(exampleManifestURL, function (error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.getAlarms(null, exampleManifestURL, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 0); michael@0: netStatsDb.getAlarms(null, testManifestURL, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.length, 1); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_updateAlarm() { michael@0: // Update alarms[3] (id: 6) -> DB: [ alarms[3]* (id: 6) ] michael@0: michael@0: var updatedAlarm = alarms[1]; michael@0: updatedAlarm.id = alarmsDbId; michael@0: updatedAlarm.threshold = 10; michael@0: michael@0: netStatsDb.updateAlarm(updatedAlarm, function (error, result) { michael@0: do_check_eq(error, null); michael@0: netStatsDb.getFirstAlarm(networkWifi, function(error, result) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(result.id, updatedAlarm.id); michael@0: do_check_eq(result.networkId, updatedAlarm.networkId); michael@0: do_check_eq(result.absoluteThreshold, updatedAlarm.absoluteThreshold); michael@0: do_check_eq(result.relativeThreshold, updatedAlarm.relativeThreshold); michael@0: do_check_eq(result.data.foo, updatedAlarm.data.foo); michael@0: do_check_eq(result.pageURL, updatedAlarm.pageURL); michael@0: do_check_eq(result.manifestURL, updatedAlarm.manifestURL); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: function run_test() { michael@0: do_get_profile(); michael@0: run_next_test(); michael@0: }