diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dae2fda..4e18cd6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * CONJS-277 using connection.importFile when connection is not connected to database result in error * CONJS-278 Possible buffer overwrite when sending query bigger than 16M * CONJS-282 error when using mysql_clear_test password authentication plugin +* CONJS-283 wrong decoding of binary unsigned MEDIUMINT ## [3.2.3](https://github.com/mariadb-corporation/mariadb-connector-nodejs/tree/3.2.3) (Dec 2023) diff --git a/test/integration/test-debug.js b/test/integration/test-debug.js index 29fd82eb..80093b4e 100644 --- a/test/integration/test-debug.js +++ b/test/integration/test-debug.js @@ -17,14 +17,14 @@ describe('debug', () => { const smallFileName = path.join(os.tmpdir(), 'smallLocalInfileDebug.txt'); let permitLocalInfile = true; - let tmpLogFile = path.join(os.tmpdir(), 'combined.txt'); let logger; let setNameAddition = 0; + let fileIncrement = 0; before(async function () { if (!isXpand()) { try { - fs.unlinkSync(tmpLogFile); + fs.unlinkSync(path.join(os.tmpdir(), 'combined*.txt')); } catch (e) {} const rows = await shareConn.query('select @@local_infile'); permitLocalInfile = rows[0]['@@local_infile'] === 1 || rows[0]['@@local_infile'] === 1n; @@ -38,6 +38,7 @@ describe('debug', () => { }); beforeEach(async function () { + let tmpLogFile = path.join(os.tmpdir(), 'combined' + ++fileIncrement + '.txt'); logger = winston.createLogger({ transports: [new winston.transports.File({ filename: tmpLogFile })] }); @@ -46,6 +47,7 @@ describe('debug', () => { //ensure that debug from previous test are written to console afterEach(async function () { + let tmpLogFile = path.join(os.tmpdir(), 'combined' + fileIncrement + '.txt'); await closeLogger(logger); try { fs.unlinkSync(tmpLogFile); @@ -59,120 +61,98 @@ describe('debug', () => { } }); - it('select request debug', function (done) { - testQueryDebug(false, done); + it('select request debug', async function () { + await testQueryDebug(false); }); - it('select request debug compress', function (done) { + it('select request debug compress', async function () { if (isXpand()) this.skip(); - testQueryDebug(true, done); + await testQueryDebug(true); }); - function testQueryDebug(compress, done) { - base - .createConnection({ - compress: compress, - prepareCacheLength: 0, - logger: { - network: null, - query: (msg) => logger.info(msg), - error: (msg) => logger.info(msg) - } - }) - .then((conn) => { - conn - .query('CREATE TABLE debugVoid (val int)') - .then(() => { - if (compress && !isMaxscale() && process.env.srv !== 'skysql' && process.env.srv !== 'skysql-ha') { - conn.debugCompress((msg) => logger.info(msg)); - } else { - conn.debug((msg) => logger.info(msg)); - } - return conn.query('SELECT 2'); - }) - .then(() => { - if (compress && !isMaxscale() && process.env.srv !== 'skysql' && process.env.srv !== 'skysql-ha') { - conn.debugCompress(false); - } else { - conn.debug(false); - } - return conn.query('SELECT 3'); - }) - .then(() => { - return conn.prepare('SELECT ?'); - }) - .then((prepare) => { - return prepare.execute(['t']).then((res) => prepare.close()); - }) - .then(() => { - return conn.batch('INSERT INTO debugVoid VALUES (?)', [[1], [2]]); - }) - .then(() => { - return conn.end(); - }) - .then(() => { - //wait 100ms to ensure stream has been written - setTimeout(() => { - const serverVersion = conn.serverVersion(); - if (isMaxscale() || process.env.srv === 'skysql' || process.env.srv === 'skysql-ha') compress = false; - const rangeWithEOF = compress ? [1500, 2000] : [1800, 4250]; - const rangeWithoutEOF = compress ? [1500, 2000] : [2350, 3250]; - const data = fs.readFileSync(tmpLogFile, 'utf8'); - console.log(data); - assert.isTrue(data.includes('QUERY: SELECT 3')); - assert.isTrue(data.includes('PREPARE:')); - assert.isTrue(data.includes('EXECUTE:')); - assert.isTrue(data.includes("SELECT ? - parameters:['t']")); - assert.isTrue(data.includes('CLOSE PREPARE:')); - if (conn.info.isMariaDB() && conn.info.hasMinVersion(10, 2, 2)) { - assert.isTrue(data.includes('BULK:')); - assert.isTrue(data.includes('INSERT INTO debugVoid VALUES (?) - parameters:[[1],[2]]')); - } - assert.isTrue(data.includes('QUIT')); - if ( - ((conn.info.isMariaDB() && conn.info.hasMinVersion(10, 2, 2)) || - (!conn.info.isMariaDB() && conn.info.hasMinVersion(5, 7, 5))) && - !isMaxscale() && - process.env.srv !== 'skysql' && - process.env.srv !== 'skysql-ha' - ) { - assert( - data.length > rangeWithoutEOF[0] && data.length < rangeWithoutEOF[1], - 'wrong data length : ' + - data.length + - ' expected value between ' + - rangeWithoutEOF[0] + - ' and ' + - rangeWithoutEOF[1] + - '.' + - '\n server version : ' + - serverVersion + - '\n data :\n' + - data - ); - } else { - //EOF Packet make exchange bigger - assert( - data.length > rangeWithEOF[0] && data.length < rangeWithEOF[1], - 'wrong data length : ' + - data.length + - ' expected value between ' + - rangeWithEOF[0] + - ' and ' + - rangeWithEOF[1] + - '.' + - '\n server version : ' + - serverVersion + - '\n data :\n' + - data - ); - } - done(); - }, 100); - }) - .catch(done); - }) - .catch(done); + async function testQueryDebug(compress) { + const conn = await base.createConnection({ + compress: compress, + prepareCacheLength: 0, + logger: { + network: null, + query: (msg) => logger.info(msg), + error: (msg) => logger.info(msg) + } + }); + await conn.query('CREATE TABLE debugVoid (val int)'); + if (compress && !isMaxscale() && process.env.srv !== 'skysql' && process.env.srv !== 'skysql-ha') { + conn.debugCompress((msg) => logger.info(msg)); + } else { + conn.debug((msg) => logger.info(msg)); + } + await conn.query('SELECT 2'); + if (compress && !isMaxscale() && process.env.srv !== 'skysql' && process.env.srv !== 'skysql-ha') { + conn.debugCompress(false); + } else { + conn.debug(false); + } + await conn.query('SELECT 3'); + const prepare = await conn.prepare('SELECT ?'); + await prepare.execute(['t']).then((res) => prepare.close()); + await conn.batch('INSERT INTO debugVoid VALUES (?)', [[1], [2]]); + conn.end(); + //wait 100ms to ensure stream has been written + await new Promise((resolve) => new setTimeout(resolve, 100)); + const serverVersion = conn.serverVersion(); + if (isMaxscale() || process.env.srv === 'skysql' || process.env.srv === 'skysql-ha') compress = false; + const rangeWithEOF = compress ? [1500, 2000] : [1800, 4250]; + const rangeWithoutEOF = compress ? [1500, 2000] : [2350, 3250]; + const data = fs.readFileSync(path.join(os.tmpdir(), 'combined' + fileIncrement + '.txt'), 'utf8'); + console.log(data); + assert.isTrue(data.includes('QUERY: SELECT 3')); + assert.isTrue(data.includes('PREPARE:')); + assert.isTrue(data.includes('EXECUTE:')); + assert.isTrue(data.includes("SELECT ? - parameters:['t']")); + assert.isTrue(data.includes('CLOSE PREPARE:')); + if (conn.info.isMariaDB() && conn.info.hasMinVersion(10, 2, 2)) { + assert.isTrue(data.includes('BULK:')); + assert.isTrue(data.includes('INSERT INTO debugVoid VALUES (?) - parameters:[[1],[2]]')); + } + assert.isTrue(data.includes('QUIT')); + if ( + ((conn.info.isMariaDB() && conn.info.hasMinVersion(10, 2, 2)) || + (!conn.info.isMariaDB() && conn.info.hasMinVersion(5, 7, 5))) && + !isMaxscale() && + process.env.srv !== 'skysql' && + process.env.srv !== 'skysql-ha' + ) { + assert( + data.length > rangeWithoutEOF[0] && data.length < rangeWithoutEOF[1], + 'wrong data length : ' + + data.length + + ' expected value between ' + + rangeWithoutEOF[0] + + ' and ' + + rangeWithoutEOF[1] + + '.' + + '\n server version : ' + + serverVersion + + '\n data :\n' + + data + ); + } else { + //EOF Packet make exchange bigger + assert( + data.length > rangeWithEOF[0] && data.length < rangeWithEOF[1], + 'wrong data length : ' + + data.length + + ' expected value between ' + + rangeWithEOF[0] + + ' and ' + + rangeWithEOF[1] + + '.' + + '\n server version : ' + + serverVersion + + '\n data :\n' + + data + ); + } } it('select big request (compressed data) debug', function (done) { @@ -191,7 +171,7 @@ describe('debug', () => { .end() .then(() => { const serverVersion = conn.serverVersion(); - const data = fs.readFileSync(tmpLogFile, 'utf8'); + const data = fs.readFileSync(path.join(os.tmpdir(), 'combined' + fileIncrement + '.txt'), 'utf8'); let range = [8900, 12000 + setNameAddition]; assert( data.length > range[0] && data.length < range[1], @@ -283,7 +263,7 @@ describe('debug', () => { conn.end(); //wait 100ms to ensure stream has been written setTimeout(() => { - const data = fs.readFileSync(tmpLogFile, 'utf8'); + const data = fs.readFileSync(path.join(os.tmpdir(), 'combined' + fileIncrement + '.txt'), 'utf8'); const serverVersion = conn.serverVersion(); const range = [7500, 11000 + (Conf.baseConfig.ssl ? 800 : 0) + setNameAddition]; assert( @@ -337,7 +317,7 @@ describe('debug', () => { const serverVersion = conn.serverVersion(); if (isMaxscale() || process.env.srv === 'skysql' || process.env.srv === 'skysql-ha') compress = false; const range = compress ? [60, 180] : [60, 170]; - const data = fs.readFileSync(tmpLogFile, 'utf8'); + const data = fs.readFileSync(path.join(os.tmpdir(), 'combined' + fileIncrement + '.txt'), 'utf8'); assert.isTrue(data.includes('PING')); assert.isTrue(data.includes('QUIT'));