290 lines
9.7 KiB
JavaScript

/*
Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights
reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
"use strict";
var util = require("util");
var mindb = 1;
var maxdb = 8;
var numberOfDBs = maxdb - mindb + 1;
var tbl3 = function(i, j) {
this.i = i;
this.j = j;
};
new mynode.TableMapping('mysqljs_multidb_test3.tbl3').applyToClass(tbl3);
var tbl4 = function(i, j) {
this.i = i;
this.j = j;
};
new mynode.TableMapping('mysqljs_multidb_test4.tbl4').applyToClass(tbl4);
var tbl7 = function(i, j) {
this.i = i;
this.j = j;
};
new mynode.TableMapping('tbl7').applyToClass(tbl7);
var tbl8 = function(i, j) {
this.i = i;
this.j = j;
};
new mynode.TableMapping('tbl8').applyToClass(tbl8);
// badtbl8 is mapped to a table that only exists in database test8
var badtbl8 = function(i, j) {
this.i = i;
this.j = j;
};
new mynode.TableMapping('tbl8').applyToClass(badtbl8);
// badtesttbl8 is mapped to a non-existent table
var badtesttbl8 = function(i, j) {
this.i = i;
this.j = j;
};
new mynode.TableMapping('mysqljs_multidb_test.tbl8').applyToClass(badtesttbl8);
// badtbl9 is not mapped
var badtbl9 = function(i, j) {
this.i = i;
this.j = j;
};
// create all properties for connecting with different default databases
var properties = mynode.ConnectionProperties(global.adapter);
// make a local copy of the properties
var propertiesList = [];
var p, x, props = {};
for (p = mindb; p < mindb + numberOfDBs; ++p) {
for (x in properties) if (properties.hasOwnProperty(x)) {
props[x] = properties[x];
}
props.database = 'mysqljs_multidb_test' + p;
propertiesList[p] = props;
}
var connectWithDefaultDb = function(testCase, db, callback) {
console.log('ConnectTest openSession with', propertiesList[db].database);
var tbl = 'tbl' + db;
mynode.openSession(propertiesList[db], tbl, function(err, session) {
if (err) {
testCase.appendErrorMessage('error opening session ' + db);
} else {
console.log('ConnectTest openSession success for', propertiesList[db].database);
// verify that the named table has an entry for cached metadata and chached table handler
// session.find()
}
callback(db);
});
};
var verifyTableMetadataCached = function(testCase, sessionFactory, qualifiedTableName) {
// look in sessionFactory to see if there is a cached table metadata
var split = qualifiedTableName.split('\.');
var databaseName = split[0];
var tableName = split[1];
var tableMetadata = sessionFactory.tableMetadatas[qualifiedTableName];
if (tableMetadata === undefined) {
testCase.appendErrorMessage(tableName + 'was not cached in session factory.');
} else {
testCase.errorIfNotEqual('verifyTableMetadataCached mismatch database name', tableMetadata.database, databaseName);
testCase.errorIfNotEqual('verifyTableMetadataCached mismatch table name', tableMetadata.name, tableName);
}
};
var verifyConstructorMetadataCached = function(testCase, sessionFactory, qualifiedTableName, constructor) {
verifyTableMetadataCached(testCase, sessionFactory, qualifiedTableName);
// look in constructor to see if there is a cached table handler
var split = qualifiedTableName.split('\.');
var databaseName = split[0];
var tableName = split[1];
var tableHandler = constructor.prototype.mynode.tableHandler;
if (tableHandler === undefined) {
testCase.appendErrorMessage(tableName + 'table handler was not cached in constructor.');
} else {
testCase.errorIfNotEqual('verifyConstructorMetadataCached mismatch database name', tableHandler.dbTable.database, databaseName);
testCase.errorIfNotEqual('verifyConstructorMetadataCached mismatch table name', tableHandler.dbTable.name, tableName);
}
};
var t1 = new harness.ConcurrentTest('testOpenSessionExplicitTable');
t1.run = function() {
var testCase = this;
mynode.openSession(propertiesList[1], 'mysqljs_multidb_test1.tbl1', function(err, session) {
if (err) {
testCase.appendErrorMessage('t1 error on openSession with mysqljs_multidb_test1.tbl1');
} else {
testCase.session = session;
verifyTableMetadataCached(testCase, session.sessionFactory, 'mysqljs_multidb_test1.tbl1');
}
testCase.failOnError();
});
};
var t2 = new harness.ConcurrentTest('testConnectExplicitTable');
t2.run = function() {
var testCase = this;
mynode.connect(propertiesList[2], 'mysqljs_multidb_test2.tbl2', function(err, sessionFactory) {
if (err) {
testCase.appendErrorMessage('t2 error on connect with mysqljs_multidb_test2.tbl2');
} else {
verifyTableMetadataCached(testCase, sessionFactory, 'mysqljs_multidb_test2.tbl2');
}
testCase.failOnError();
});
};
var t3 = new harness.ConcurrentTest('testOpenSessionExplicitConstructor');
t3.run = function() {
var testCase = this;
mynode.openSession(propertiesList[3], tbl3, function(err, session) {
if (err) {
testCase.appendErrorMessage('t3 error on openSession with mysqljs_multidb_test3.tbl3');
} else {
testCase.session = session;
verifyConstructorMetadataCached(testCase, session.sessionFactory, 'mysqljs_multidb_test3.tbl3', tbl3);
}
testCase.failOnError();
});
};
var t4 = new harness.ConcurrentTest('testConnectExplicitConstructor');
t4.run = function() {
var testCase = this;
mynode.connect(propertiesList[4], tbl4, function(err, sessionFactory) {
if (err) {
testCase.appendErrorMessage('t4 error on connect with mysqljs_multidb_test4.tbl4 ' + err);
} else {
verifyConstructorMetadataCached(testCase, sessionFactory, 'mysqljs_multidb_test4.tbl4', tbl4);
}
testCase.failOnError();
});
};
var t5 = new harness.ConcurrentTest('testOpenSessionImplicitTable');
t5.run = function() {
var testCase = this;
mynode.openSession(propertiesList[5], 'tbl5', function(err, session) {
if (err) {
testCase.appendErrorMessage('t5 error on openSession with tbl5 with properties ' +
'\n' + util.inspect(propertiesList[5]) + '\n' + err);
} else {
testCase.session = session;
verifyTableMetadataCached(testCase, session.sessionFactory, 'mysqljs_multidb_test5.tbl5');
}
testCase.failOnError();
});
};
var t6 = new harness.ConcurrentTest('testConnectImplicitTable');
t6.run = function() {
var testCase = this;
mynode.connect(propertiesList[6], 'tbl6', function(err, sessionFactory) {
if (err) {
testCase.appendErrorMessage('t6 error on connect with tbl6 with properties ' +
'\n' + util.inspect(propertiesList[6]) + '\n' + err);
} else {
verifyTableMetadataCached(testCase, sessionFactory, 'mysqljs_multidb_test6.tbl6');
}
testCase.failOnError();
});
};
var t7 = new harness.ConcurrentTest('testOpenSessionImplicitConstructor');
t7.run = function() {
var testCase = this;
mynode.openSession(propertiesList[7], tbl7, function(err, session) {
if (err) {
testCase.appendErrorMessage('t7 error on openSession with tbl7 with properties ' +
'\n' + util.inspect(propertiesList[7]) + '\n' + err);
} else {
testCase.session = session;
verifyConstructorMetadataCached(testCase, session.sessionFactory, 'mysqljs_multidb_test7.tbl7', tbl7);
}
testCase.failOnError();
});
};
var t8 = new harness.ConcurrentTest('testConnectImplicitConstructor');
t8.run = function() {
var testCase = this;
mynode.connect(propertiesList[8], tbl8, function(err, sessionFactory) {
if (err) {
testCase.appendErrorMessage('t8 error on connect with tbl8 ' + err);
} else {
verifyConstructorMetadataCached(testCase, sessionFactory, 'mysqljs_multidb_test8.tbl8', tbl8);
}
testCase.failOnError();
});
};
// count the number of subtests in t9 and end the test case when all have reported
function reportResults(testCase) {
if (++testCase.actualResultCount > testCase.expectedResultCount) {
testCase.failOnError();
}
}
var t9 = new harness.ConcurrentTest('testFailureCases');
t9.run = function() {
var testCase = this;
testCase.expectedResultCount = 1;
testCase.actualResultCount = 0;
mynode.connect(properties, 'tbl8', function(err) {
if (!err) {
testCase.appendErrorMessage('t9 failed to return error on tbl8');
}
reportResults(testCase);
});
++testCase.expectedResultCount;
mynode.connect(properties, 'mysqljs_multidb_test.tbl8', function(err) {
if (!err) {
testCase.appendErrorMessage('t9 failed to return error on mysqljs_multidb_test.tbl8');
}
reportResults(testCase);
});
++testCase.expectedResultCount;
mynode.connect(properties, badtbl8, function(err) {
if (!err) {
testCase.appendErrorMessage('t9 failed to return error on badtbl8');
}
reportResults(testCase);
});
++testCase.expectedResultCount;
mynode.connect(properties, badtesttbl8, function(err) {
if (!err) {
testCase.appendErrorMessage('t9 failed to return error on badtesttbl8');
}
reportResults(testCase);
});
++testCase.expectedResultCount;
mynode.connect(properties, badtbl9, function(err) {
if (!err) {
testCase.appendErrorMessage('t9 failed to return error on badtbl9');
}
reportResults(testCase);
});
reportResults(testCase);
};
/*************** EXPORT THE TOP-LEVEL GROUP ********/
module.exports.tests = [t1, t2, t3, t4, t5, t6, t7, t8, t9];