249 lines
6.8 KiB
JavaScript
249 lines
6.8 KiB
JavaScript
/*
|
|
Copyright (c) 2012, 2013, 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";
|
|
|
|
try {
|
|
require("./suite_config.js");
|
|
} catch(e) {}
|
|
|
|
var assert = require("assert");
|
|
var util = require("util");
|
|
var spi_lib = require("./lib.js");
|
|
var dbtablehandler = require(mynode.common.DBTableHandler);
|
|
var udebug = unified_debug.getLogger("UniqueKeyTest.js");
|
|
var TableMapping = require(mynode.api.TableMapping).TableMapping;
|
|
|
|
var dbSession = null;
|
|
var table = null;
|
|
var dbt = null;
|
|
var mapping = new TableMapping("test.tbl4");
|
|
mapping.mapField("id", "i");
|
|
mapping.mapField("uk", "k");
|
|
mapping.mapField("name", "c");
|
|
|
|
/// Common prep
|
|
|
|
function prepare(testCase, runTestMethod, testObj) {
|
|
|
|
var connection = null;
|
|
|
|
if(dbSession && table) { // already set up
|
|
runTestMethod(testCase, testObj);
|
|
return;
|
|
}
|
|
|
|
function onTable(err, dbTable) {
|
|
udebug.log("prepare onTable");
|
|
table = dbTable; // set global
|
|
if(err) {
|
|
testCase.fail(err);
|
|
}
|
|
else { // set global
|
|
dbt = new dbtablehandler.DBTableHandler(table, mapping, null);
|
|
runTestMethod(testCase, testObj);
|
|
}
|
|
}
|
|
|
|
function onSession(err, sess) {
|
|
udebug.log("prepare onSession");
|
|
dbSession = sess; // set global
|
|
if(err) { testCase.fail(err); }
|
|
else {
|
|
dbSession.getConnectionPool().getTableMetadata("test", "tbl4", dbSession, onTable);
|
|
}
|
|
}
|
|
|
|
function onConnect(err, conn) {
|
|
udebug.log("prepare onConnect");
|
|
connection = conn;
|
|
connection.getDBSession(spi_lib.allocateSessionSlot(), onSession);
|
|
}
|
|
|
|
spi_lib.getConnectionPool(onConnect);
|
|
}
|
|
|
|
|
|
function do_insert_op(testCase, dataObj) {
|
|
udebug.log("do_insert_op for", testCase.name);
|
|
var tx = dbSession.getTransactionHandler();
|
|
var op = dbSession.buildInsertOperation(dbt, dataObj, tx, null);
|
|
tx.execute([ op ], testCase.checkResult);
|
|
}
|
|
|
|
function do_read_op(testCase, keyObj) {
|
|
udebug.log("do_read_op for", testCase.name);
|
|
var tx = dbSession.getTransactionHandler();
|
|
var index = dbt.getIndexHandler(keyObj);
|
|
var op = dbSession.buildReadOperation(index, keyObj, tx);
|
|
tx.execute([ op ], testCase.checkResult);
|
|
}
|
|
|
|
function do_update_op(testCase, dataObj) {
|
|
assert(typeof testCase.checkResult === 'function');
|
|
udebug.log("do_update_op for", testCase.name);
|
|
var tx = dbSession.getTransactionHandler();
|
|
var dbix = dbt.getIndexHandler(dataObj.keys);
|
|
var op = dbSession.buildUpdateOperation(dbix, dataObj.keys, dataObj.values, tx, null);
|
|
tx.execute([ op ], testCase.checkResult);
|
|
}
|
|
|
|
function do_write_op(testCase, dataObj) {
|
|
assert(typeof testCase.checkResult === 'function');
|
|
udebug.log("do_write_op for", testCase.name);
|
|
var tx = dbSession.getTransactionHandler();
|
|
var dbix = dbt.getIndexHandler(dataObj);
|
|
var op = dbSession.buildWriteOperation(dbix, dataObj, tx, null);
|
|
tx.execute([ op ], testCase.checkResult);
|
|
}
|
|
|
|
function do_delete_op(testCase, keyObj) {
|
|
udebug.log("do_delete_op for", testCase.name);
|
|
var tx = dbSession.getTransactionHandler();
|
|
var dbix = dbt.getIndexHandler(keyObj);
|
|
var op = dbSession.buildDeleteOperation(dbix, keyObj, tx, null);
|
|
tx.execute([ op ], testCase.checkResult);
|
|
}
|
|
|
|
function ReadTest(key, value, result_col, result_val) {
|
|
var test = this;
|
|
this.name = "Read_" + key + "_" + value + "_" + result_val;
|
|
this.run = function() {
|
|
var readObj = {};
|
|
readObj[key] = value;
|
|
prepare(test, do_read_op, readObj);
|
|
};
|
|
|
|
this.checkResult = function(err, tx) {
|
|
var op;
|
|
if(err) {
|
|
test.appendErrorMessage(err.message);
|
|
}
|
|
else {
|
|
op = tx.executedOperations.pop();
|
|
test.errorIfNull("Null op", op);
|
|
test.errorIfNull("Null op.result", op.result);
|
|
test.errorIfNull("Null op.result.value", op.result.value);
|
|
test.errorIfNotEqual("Read Test", result_val, op.result.value[result_col]);
|
|
}
|
|
test.failOnError();
|
|
};
|
|
}
|
|
ReadTest.prototype = new harness.SerialTest("Read");
|
|
|
|
|
|
function checkSuccess(testCase) {
|
|
return function(err, tx) {
|
|
var op;
|
|
if(err) {
|
|
testCase.appendErrorMessage('UniqueKeyTest.checkSuccess', util.inspect(err));
|
|
}
|
|
else {
|
|
op = tx.executedOperations.pop();
|
|
testCase.errorIfNotEqual("operation failed", true, op.result.success);
|
|
}
|
|
testCase.failOnError();
|
|
};
|
|
}
|
|
|
|
|
|
var
|
|
t0 = new harness.SerialTest("Prelim_Delete"),
|
|
t1 = new harness.SerialTest("Insert"),
|
|
t2 = new ReadTest("uk",11,"name","Henry"),
|
|
t3 = new harness.SerialTest("UK_Update"),
|
|
t4 = new ReadTest("uk",11,"name","Henrietta"),
|
|
t5 = new harness.SerialTest("UK_Write"),
|
|
t6 = new ReadTest("uk",11,"name","Henry V"),
|
|
t7 = new ReadTest("uk",11,"id",1),
|
|
t8 = new harness.SerialTest("UK_Delete"),
|
|
t9 = new harness.SerialTest("UK_Delete_NotFound"),
|
|
close = new harness.SerialTest("CloseSession");
|
|
|
|
|
|
// PRELIMINARY DELETE. THIS TEST WILL ALWAYS PASS.
|
|
t0.run = function() {
|
|
prepare(t0, do_delete_op, {id : 1});
|
|
};
|
|
t0.checkResult = function(err, tx) {
|
|
t0.pass();
|
|
};
|
|
|
|
|
|
/// INSERT
|
|
t1.run = function() {
|
|
var insertObj = { id : 1 , uk: 11, name : "Henry" };
|
|
prepare(t1, do_insert_op, insertObj);
|
|
};
|
|
|
|
t1.checkResult = checkSuccess(t1);
|
|
|
|
|
|
// ACCESS BY UNIQUE KEY AND UPDATE
|
|
t3.run = function() {
|
|
var dataObj = { keys: { uk : 11 }, values: {name: "Henrietta" } };
|
|
prepare(t3, do_update_op, dataObj);
|
|
};
|
|
|
|
t3.checkResult = checkSuccess(t3);
|
|
|
|
|
|
// ACCESS BY UNIQUE KEY AND WRITE
|
|
t5.run = function() {
|
|
prepare(t5, do_write_op, { uk: 11, name: "Henry V" });
|
|
};
|
|
|
|
t5.checkResult = checkSuccess(t5);
|
|
|
|
// DELETE BY UK
|
|
t8.run = function() {
|
|
var deleteKey = { uk : 11 };
|
|
prepare(t8, do_delete_op, deleteKey);
|
|
};
|
|
|
|
t8.checkResult = checkSuccess(t8);
|
|
|
|
// DELETE AGAIN (EXPECT ERROR)
|
|
t9.run = function() {
|
|
var deleteKey = { uk : 11 };
|
|
prepare(t9, do_delete_op, deleteKey);
|
|
};
|
|
|
|
t9.checkResult = function(err, tx) {
|
|
var op = tx.executedOperations.pop();
|
|
t9.errorIfNotEqual("t9 operation result error sqlstate", "02000", op.result.error.sqlstate);
|
|
t9.failOnError();
|
|
};
|
|
|
|
/** This test function must be the last in the test file.
|
|
*/
|
|
close.run = function() {
|
|
dbSession.close(function(err) {
|
|
if (err) {
|
|
close.fail("Close got error: " + err);
|
|
} else {
|
|
close.pass();
|
|
}
|
|
});
|
|
};
|
|
|
|
|
|
exports.tests = [ t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, close ];
|