You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
14 KiB
169 lines
14 KiB
2 years ago
|
var fs = require('fs');
|
||
|
var safe = require('safe-regex');
|
||
|
var assert = require('assert');
|
||
|
var requirejs = require('requirejs');
|
||
|
var parseJS = require('@babel/parser').parse;
|
||
|
var traverse = require('@babel/traverse').default;
|
||
|
var UAParser = require('./../src/ua-parser');
|
||
|
var browsers = require('./browser-test.json');
|
||
|
var cpus = require('./cpu-test.json');
|
||
|
var devices = require('./device-test.json');
|
||
|
var engines = require('./engine-test.json');
|
||
|
var os = require('./os-test.json');
|
||
|
var parser = new UAParser();
|
||
|
var methods = [
|
||
|
{
|
||
|
title : 'getBrowser',
|
||
|
label : 'browser',
|
||
|
list : browsers,
|
||
|
properties : ['name', 'major', 'version']
|
||
|
},
|
||
|
{
|
||
|
title : 'getCPU',
|
||
|
label : 'cpu',
|
||
|
list : cpus,
|
||
|
properties : ['architecture']
|
||
|
},
|
||
|
{
|
||
|
title : 'getDevice',
|
||
|
label : 'device',
|
||
|
list : devices,
|
||
|
properties : ['model', 'type', 'vendor']
|
||
|
},
|
||
|
{
|
||
|
title : 'getEngine',
|
||
|
label : 'engine',
|
||
|
list : engines,
|
||
|
properties : ['name', 'version']
|
||
|
},
|
||
|
{
|
||
|
title : 'getOS',
|
||
|
label : 'os',
|
||
|
list : os,
|
||
|
properties : ['name', 'version']
|
||
|
}];
|
||
|
|
||
|
describe('UAParser()', function () {
|
||
|
var ua = 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6';
|
||
|
assert.deepStrictEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
|
||
|
});
|
||
|
|
||
|
describe('UAParser() constructor does not throw with undefined ua argument', function () {
|
||
|
assert.doesNotThrow(() => new UAParser(undefined).getResult());
|
||
|
});
|
||
|
|
||
|
describe('UAParser.setUA method does not throw with undefined ua argument', function () {
|
||
|
assert.doesNotThrow(() => new UAParser().setUA(undefined).getResult());
|
||
|
});
|
||
|
|
||
|
for (var i in methods) {
|
||
|
describe(methods[i]['title'], function () {
|
||
|
for (var j in methods[i]['list']) {
|
||
|
if (!!methods[i]['list'][j].ua) {
|
||
|
describe('[' + methods[i]['list'][j].desc + ']', function () {
|
||
|
describe('"' + methods[i]['list'][j].ua + '"', function () {
|
||
|
var expect = methods[i]['list'][j].expect;
|
||
|
var result = parser.setUA(methods[i]['list'][j].ua).getResult()[methods[i]['label']];
|
||
|
|
||
|
methods[i]['properties'].forEach(function(m) {
|
||
|
it('should return ' + methods[i]['label'] + ' ' + m + ': ' + expect[m], function () {
|
||
|
assert.strictEqual(result[m], expect[m] != 'undefined' ? expect[m] : undefined);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
describe('Returns', function () {
|
||
|
it('getResult() should returns JSON', function(done) {
|
||
|
assert.deepStrictEqual(new UAParser('').getResult(),
|
||
|
{
|
||
|
ua : '',
|
||
|
browser: { name: undefined, version: undefined, major: undefined },
|
||
|
cpu: { architecture: undefined },
|
||
|
device: { vendor: undefined, model: undefined, type: undefined },
|
||
|
engine: { name: undefined, version: undefined},
|
||
|
os: { name: undefined, version: undefined }
|
||
|
});
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Extending Regex', function () {
|
||
|
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||
|
var myOwnBrowser = [[/(myownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
|
||
|
|
||
|
var parser1 = new UAParser(uaString, {browser: myOwnBrowser});
|
||
|
assert.strictEqual(parser1.getBrowser().name, 'MyOwnBrowser');
|
||
|
assert.strictEqual(parser1.getBrowser().version, '1.3');
|
||
|
assert.strictEqual(parser1.getBrowser().major, '1');
|
||
|
|
||
|
var parser2 = new UAParser({browser: myOwnBrowser});
|
||
|
assert.strictEqual(parser2.getBrowser().name, undefined);
|
||
|
parser2.setUA(uaString);
|
||
|
assert.strictEqual(parser2.getBrowser().name, 'MyOwnBrowser');
|
||
|
assert.strictEqual(parser1.getBrowser().version, '1.3');
|
||
|
});
|
||
|
|
||
|
describe('User-agent length', function () {
|
||
|
var UA_MAX_LENGTH = 255;
|
||
|
|
||
|
// Real data from https://stackoverflow.com/questions/654921/how-big-can-a-user-agent-string-get#answer-6595973
|
||
|
var uaString = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; (R1 1.6); SLCC1; .NET CLR 2.0.50727; InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; 66760635803; runtime 11.00294; 876906799603; 97880703; 669602703; 9778063903; 877905603; 89670803; 96690803; 8878091903; 7879040603; 999608065603; 799808803; 6666059903; 669602102803; 888809342903; 696901603; 788907703; 887806555703; 97690214703; 66760903; 968909903; 796802422703; 8868026703; 889803611803; 898706903; 977806408603; 976900799903; 9897086903; 88780803; 798802301603; 9966008603; 66760703; 97890452603; 9789064803; 96990759803; 99960107703; 8868087903; 889801155603; 78890703; 8898070603; 89970603; 89970539603; 89970488703; 8789007603; 87890903; 877904603; 9887077703; 798804903; 97890264603; 967901703; 87890703; 97690420803; 79980706603; 9867086703; 996602846703; 87690803; 6989010903; 977809603; 666601903; 876905337803; 89670603; 89970200903; 786903603; 696901911703; 788905703; 896709803; 96890703; 998601903; 88980703; 666604769703; 978806603; 7988020803; 996608803; 788903297903; 98770043603; 899708803; 66960371603; 9669088903; 69990703; 99660519903; 97780603; 888801803; 9867071703; 79780803; 9779087603; 899708603; 66960456803; 898706824603; 78890299903; 99660703; 9768079803; 977901591603; 89670605603; 787903608603; 998607934903; 799808573903; 878909603; 979808146703; 9996088603; 797803154903; 69790603; 99660565603; 7869028603; 896707703; 97980965603; 976907191703; 88680703; 888809803; 69690903; 889805523703; 899707703; 997605035603; 89970029803; 9699094903; 877906803; 899707002703; 786905857603; 69890803; 97980051903; 997603978803; 9897097903; 66960141703; 7968077603; 977804603; 88980603; 989700803; 999607887803; 78690772803; 96990560903; 98970961603; 9996032903; 9699098703; 69890655603; 978903803; 698905066803; 977806903; 9789061703; 967903747703; 976900550903; 88980934703; 8878075803; 8977028703; 97980903; 9769006603; 786900803; 98770682703; 78790903; 878906967903; 87690399603; 99860976703; 796805703; 87990603; 968906803; 967904724603; 999606603; 988705903; 989702842603; 96790603; 99760703; 88980166703; 9799038903; 98670903; 697905248603; 7968043603; 66860703; 66860127903; 9779048903; 89670123903; 78890397703; 97890603; 87890803; 8789030603; 69990603; 88880763703; 9769000603; 96990203903; 978900405903; 7869022803; 699905422903; 97890703; 87990903; 878908703; 7998093903; 898702507603; 97780637603; 966907903; 896702603; 9769004803; 7869007903; 99660158803; 7899099603; 8977055803; 99660603; 7889080903; 66660981603; 997604603; 6969089803; 899701903; 9769072703; 666603903; 99860803; 997608803; 69790903; 88680756703; 979805677903; 9986047703; 89970803; 66660603; 96690903; 8997051603; 789901209803; 8977098903; 968900326803; 87790703; 98770024803; 697901794603; 69990803; 887805925803; 968908903; 97880603; 897709148703; 877909476903; 66760197703; 977908603; 698902703; 988706504803; 977802026603; 88680964703; 8878068703; 987705107903; 978902878703; 8898069803; 9768031703; 79680803; 79980803; 669609328703; 89870238703; 99960593903; 969904218703; 78890603; 9788000703; 69690630903; 889800982903; 988709748803; 7968052803; 99960007803; 969900800803; 668604817603; 66960903; 78790734603; 8868007703; 79780034903; 8878085903; 976907603; 89670830803; 877900903; 969904889703; 7978033903; 8987043903; 99860703; 979805903; 667603803; 976805348603; 999604127603; 97790701603; 78990342903; 98770672903; 87990253903; 9877027703; 97790803; 877901895603; 8789076903; 896708595603; 997601903; 799806903; 97690603; 87790371703; 667605603; 99760303703; 97680283803; 788902750803; 787909803; 79780603; 79880866903; 9986050903; 87890543903; 979800803; 97690179703; 876901603; 699909903; 96990192603; 878904903; 877904734903; 796801446903; 977904803; 9887044803; 797805565603; 98870789703; 7869093903; 87790727703; 797801232803; 666604803; 9778071903; 9799086703; 6969000903; 89670903; 8799075903; 897708903; 88680903; 97980362603; 97980503903; 889803256703; 88980388703; 789909376803; 69690703; 6969025903; 89970309903; 96690703; 877901847
|
||
|
|
||
|
it('greater than ' + UA_MAX_LENGTH + ' should be trimmed down', function () {
|
||
|
assert.strictEqual(UAParser(uaString).ua.length, UA_MAX_LENGTH);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Using Require.js', function () {
|
||
|
it('should loaded automatically', function(done) {
|
||
|
requirejs.config({
|
||
|
baseUrl : 'dist',
|
||
|
paths : {
|
||
|
'ua-parser-js' : 'ua-parser.min'
|
||
|
}
|
||
|
});
|
||
|
requirejs(['ua-parser-js'], function(ua) {
|
||
|
var parser = new ua('Dillo/1.0');
|
||
|
assert.deepStrictEqual(parser.getBrowser().name, 'Dillo');
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Testing regexes', function () {
|
||
|
|
||
|
var regexes;
|
||
|
|
||
|
before('Read main js file', function () {
|
||
|
var code = fs.readFileSync('src/ua-parser.js', 'utf8').toString();
|
||
|
var ast = parseJS(code, { sourceType: "script" });
|
||
|
regexes = [];
|
||
|
traverse(ast, {
|
||
|
RegExpLiteral: (path) => {
|
||
|
regexes.push(path.node.pattern);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (regexes.length === 0) {
|
||
|
throw new Error("Regexes cannot be empty!");
|
||
|
}
|
||
|
});
|
||
|
|
||
|
describe('Begin testing', function () {
|
||
|
it('all regexes in main file', function () {
|
||
|
regexes.forEach(function (regex) {
|
||
|
describe('Test against `safe-regex` : ' + regex, function () {
|
||
|
it('should be safe from potentially vulnerable regex', function () {
|
||
|
assert.strictEqual(safe(regex), true);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|