00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include "TestBase.h"
00004
00005 #include "../../icat/src/icatMidLevelRoutines.c"
00006
00007 using namespace std;
00008
00009 static char **g_argv;
00010
00011 #define PARENT_OF_A "parent of a"
00012 #define A_VALUE "a"
00013
00014
00015
00016
00017 class TestCmlEnv : public ::TestBase {
00018 protected:
00019 virtual void SetUp() {
00020 TestBase::setUserPass(g_argv[1], g_argv[2]);
00021 if(cmlOpen(&_icss) == SQL_ERROR) {
00022
00023 cout << "TestCmlEnv::Setup():cmlOpen() - out of memory" << endl;
00024 exit(1);
00025 }
00026 }
00027
00028 virtual void TearDown() {
00029 if(cmlClose(&_icss) != 0) {
00030 cout << "TestCmlEnv::TearDown():cmlCloseEnv() - failed" << endl;
00031 }
00032 }
00033 };
00034
00035 TEST_F(TestCmlEnv, HandlesRodsEnv) {
00036 EXPECT_GE(0, getRodsEnv (&_myEnv));
00037 }
00038
00039 TEST_F(TestCmlEnv, HandlesNullEmptySql) {
00040 EXPECT_NE(0, cmlExecuteNoAnswerSql(NULL, &_icss));
00041 EXPECT_NE(0, cmlExecuteNoAnswerSql("", &_icss));
00042 }
00043
00044
00045
00046
00047 class TestCmlFunctions : public ::TestCmlEnv {
00048 protected:
00049 virtual void SetUp() {
00050 TestCmlEnv::SetUp();
00051
00052 if(getRodsEnv (&_myEnv) < 0) {
00053 exit(1);
00054 }
00055 int i;
00056
00057
00058 int nextseqval = cmlGetNextSeqVal(&_icss);
00059
00060
00061 snprintf(_sql, sizeof(_sql), "insert into R_COLL_MAIN (coll_id, " \
00062 "parent_coll_name, coll_name, coll_owner_name, coll_owner_zone) " \
00063 "values (%i, \'%s\', \'%s\', \'%s\', \'%s\')", nextseqval,
00064 PARENT_OF_A, A_VALUE, _myEnv.rodsUserName, _myEnv.rodsZone);
00065 if((i = cmlExecuteNoAnswerSql(_sql, &_icss))) {
00066 cllGetLastErrorMessage(_msg, sizeof(_msg));
00067 printf("%s\n", _msg);
00068 return;
00069 }
00070 snprintf(_sql, sizeof(_sql), "commit");
00071 if((i = cmlExecuteNoAnswerSql(_sql, &_icss))) {
00072 cllGetLastErrorMessage(_msg, sizeof(_msg));
00073 printf("%s\n", _msg);
00074 return;
00075 }
00076 }
00077
00078 virtual void TearDown() {
00079
00080 int i;
00081 snprintf(_sql, sizeof(_sql), "delete from R_COLL_MAIN where "\
00082 "coll_name = \'a\' and coll_owner_name = \'%s\' and "\
00083 "coll_owner_zone = \'%s\'", _myEnv.rodsUserName, _myEnv.rodsZone);
00084 if((i = cmlExecuteNoAnswerSql(_sql, &_icss))) {
00085 cllGetLastErrorMessage(_msg, sizeof(_msg));
00086 printf("%s\n", _msg);
00087 }
00088 snprintf(_sql, sizeof(_sql), "commit");
00089 if((i = cmlExecuteNoAnswerSql(_sql, &_icss))) {
00090 cllGetLastErrorMessage(_msg, sizeof(_msg));
00091 printf("%s\n", _msg);
00092 }
00093 TestCmlEnv::TearDown();
00094 }
00095
00096 };
00097
00098 #define MAX_COLUMNS 16
00099 #define MAX_COLUMN_WIDTH 64
00100 #define BLOCK_LEN 16
00101
00102
00103
00104
00105 static void reset_array(char **data, int cnt) {
00106 int i;
00107 for(i=0;i<cnt;i++)
00108 *data[i] = '\0';
00109 }
00110
00111
00112
00113
00114 static void alloc_array(char **data, int cnt, int width) {
00115 int i;
00116 for(i=0;i<cnt;i++) {
00117 data[i] = (char*)calloc(1, width);
00118 }
00119 }
00120
00121
00122
00123
00124 static void dealloc_array(char **data, int cnt) {
00125 int i;
00126 for(i=0;i<cnt;i++) {
00127 free(data[i]);
00128 data[i] = NULL;
00129 }
00130 }
00131
00132
00133
00134
00135 static void print_array(char **data, int cnt) {
00136 int i;
00137 for(i=0;i<cnt;i++) {
00138 if((data[i] == NULL) || (*data[i] == '\0'))
00139 continue;
00140 printf("\tcolumn %i = %s\n", i, data[i]);
00141 }
00142 }
00143
00144 TEST_F(TestCmlFunctions, HandlesSql) {
00145 int i, statement_num;
00146 char **column_data;
00147 int *column_width;
00148 char *row_block;
00149 rodsLong_t intValue;
00150
00151
00152 column_width = (int*)calloc(MAX_COLUMNS, sizeof(int));
00153 column_data = (char**)calloc(MAX_COLUMNS, sizeof(char*));
00154 row_block = (char*)calloc((BLOCK_LEN * MAX_COLUMN_WIDTH), sizeof(char));
00155 alloc_array(column_data, MAX_COLUMNS, MAX_COLUMN_WIDTH);
00156 for(i=0;i<MAX_COLUMNS;i++) {
00157 column_width[i] = MAX_COLUMN_WIDTH;
00158 }
00159
00160
00161 snprintf(_sql,sizeof(_sql), "select * from R_COLL_MAIN where "\
00162 "coll_name = \'%s\' and coll_owner_name = \'%s\' and coll_owner_zone"\
00163 " = \'%s\'", A_VALUE, _myEnv.rodsUserName, _myEnv.rodsZone);
00164 ASSERT_LT(0, cmlGetOneRowFromSql(_sql, column_data, column_width,
00165 MAX_COLUMNS, &_icss));
00166 ASSERT_EQ(0, cmlGetFirstRowFromSql(_sql, &statement_num, 0, &_icss));
00167 EXPECT_EQ(0, cmlFreeStatement(statement_num, &_icss));
00168 EXPECT_EQ(0, cmlGetIntegerValueFromSqlV3(_sql, &intValue, &_icss));
00169
00170
00171 dealloc_array(column_data, MAX_COLUMNS);
00172 snprintf(_sql,sizeof _sql, "select * from R_COLL_MAIN where "\
00173 "coll_name = ? and parent_coll_name = ?");
00174 ASSERT_LE(0, (statement_num = cmlGetOneRowFromSqlV2 (_sql, column_data,
00175 MAX_COLUMNS, A_VALUE, PARENT_OF_A, &_icss)));
00176 EXPECT_EQ(0, cmlFreeStatement(statement_num, &_icss));
00177
00178 alloc_array(column_data, MAX_COLUMNS, MAX_COLUMN_WIDTH);
00179 snprintf(_sql,sizeof(_sql), "select * from R_COLL_MAIN where "\
00180 "coll_name = ? and parent_coll_name = ? and coll_owner_name = ? "\
00181 "and coll_owner_zone = ?");
00182 ASSERT_LT(0, cmlGetOneRowFromSqlBV (_sql, column_data, column_width,
00183 MAX_COLUMNS, A_VALUE, PARENT_OF_A, _myEnv.rodsUserName,
00184 _myEnv.rodsZone, NULL, &_icss));
00185 ASSERT_EQ(0, cmlGetFirstRowFromSqlBV (_sql, A_VALUE, PARENT_OF_A,
00186 _myEnv.rodsUserName, _myEnv.rodsZone, &statement_num, &_icss));
00187 EXPECT_EQ(0, cmlGetIntegerValueFromSql(_sql, &intValue, A_VALUE,
00188 PARENT_OF_A, _myEnv.rodsUserName, _myEnv.rodsZone, NULL, &_icss));
00189
00190 snprintf(_sql,sizeof(_sql), "select * from R_COLL_MAIN");
00191 ASSERT_EQ(0, cmlGetFirstRowFromSqlBV (_sql, A_VALUE, PARENT_OF_A,
00192 _myEnv.rodsUserName, _myEnv.rodsZone, &statement_num, &_icss));
00193 ASSERT_EQ(0, cmlGetNextRowFromStatement(statement_num, &_icss));
00194
00195 snprintf(_sql,sizeof(_sql), "select * from R_COLL_MAIN where "\
00196 "coll_name = ? and parent_coll_name = ?");
00197 ASSERT_EQ(0, cmlGetStringValueFromSql(_sql, _msg, sizeof(_msg), A_VALUE,
00198 PARENT_OF_A, NULL, &_icss));
00199 printf("%s\n", _msg);
00200 ASSERT_EQ(0, cmlGetStringValuesFromSql(_sql, column_data, column_width, 3,
00201 A_VALUE, PARENT_OF_A, NULL, &_icss));
00202 printf("%s\n", column_data[0]);
00203 printf("%s\n", column_data[1]);
00204 printf("%s\n", column_data[2]);
00205
00206 int returned;
00207 EXPECT_LT(0, (returned = cmlGetMultiRowStringValuesFromSql(_sql, row_block,
00208 MAX_COLUMN_WIDTH, BLOCK_LEN, A_VALUE, PARENT_OF_A, &_icss)));
00209 for(int i=0;i<returned;i++) {
00210 cout << i << " = ";
00211 for(int j=0;j<MAX_COLUMN_WIDTH;j++) {
00212 cout << row_block[(i*MAX_COLUMN_WIDTH)+j];
00213 }
00214 cout << endl;
00215 }
00216
00217 EXPECT_LE(0, cmlCheckNameToken("token_namespace", "zone_type", &_icss));
00218 EXPECT_GT(0, cmlCheckNameToken("xtoken_namespace", "xzone_type", &_icss));
00219
00220
00221
00222
00223
00224
00225
00226
00227 cout << "cmlGetCurrentSeqVal" << endl;
00228 EXPECT_LT(0, cmlGetCurrentSeqVal(&_icss));
00229
00230 cout << "cmlGetNextSeqStr" << endl;
00231 EXPECT_LE(0, cmlGetNextSeqStr(_msg, sizeof(_msg), &_icss));
00232
00233 cout << "cmlCheckDir" << endl;
00234 char dir[1024];
00235 sprintf(dir, "/%s/home/rods", _myEnv.rodsZone);
00236
00237 EXPECT_LT(0, cmlCheckDir(dir, _myEnv.rodsUserName, _myEnv.rodsZone,
00238 ACCESS_MODIFY_OBJECT, &_icss));
00239 int flag;
00240 EXPECT_LT(0, cmlCheckDirAndGetInheritFlag(dir, _myEnv.rodsUserName,
00241 _myEnv.rodsZone, ACCESS_MODIFY_OBJECT, &flag, &_icss));
00242 EXPECT_EQ(0, cmlCheckDirId("10008", _myEnv.rodsUserName,
00243 _myEnv.rodsZone, ACCESS_NULL, &_icss));
00244 EXPECT_LT(0, cmlCheckDirOwn(dir, _myEnv.rodsUserName, _myEnv.rodsZone,
00245 &_icss));
00246
00247
00248 dealloc_array(column_data, MAX_COLUMNS);
00249 free(column_data);
00250 free(column_width);
00251 free(row_block);
00252 }
00253
00254 int main(int argc, char **argv) {
00255 g_argv = argv;
00256 ::testing::GTEST_FLAG(output) = "xml:icatLowLevelOdbc.xml";
00257 ::testing::InitGoogleTest(&argc, argv);
00258 return RUN_ALL_TESTS();
00259 }
00260