0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 #include <cgreen/cgreen.h>
0038 #include <ndrstandard.h>
0039 #include <exhash.h>
0040 #include <nstdutil.h>
0041 #include <thlock.h>
0042 #include <ndebug.h>
0043 #include <sys/time.h>
0044
0045
0046
0047
0048
0049 typedef struct
0050 {
0051 exuuid_t cid;
0052 EX_hash_handle hh;
0053 } cid_hash_t;
0054
0055
0056
0057
0058 exprivate cid_hash_t *M_hash = NULL;
0059 exprivate MUTEX_LOCKDECL(M_lock);
0060
0061
0062
0063
0064
0065 exprivate cid_hash_t * do_lookup(exuuid_t cid)
0066 {
0067 cid_hash_t *ent=NULL;
0068
0069 MUTEX_LOCK_V(M_lock);
0070
0071 EXHASH_FIND(hh, M_hash, cid, sizeof(exuuid_t), ent);
0072
0073
0074 MUTEX_UNLOCK_V(M_lock);
0075
0076 return ent;
0077 }
0078
0079
0080
0081
0082
0083 exprivate void do_add(exuuid_t cid)
0084 {
0085 cid_hash_t *add=NDRX_MALLOC(sizeof(cid_hash_t));
0086 if (NULL==add)
0087 {
0088 abort();
0089 }
0090 memcpy(add->cid, cid, sizeof(exuuid_t));
0091 MUTEX_LOCK_V(M_lock);
0092 EXHASH_ADD(hh, M_hash, cid, sizeof(exuuid_t), add);
0093 MUTEX_UNLOCK_V(M_lock);
0094 }
0095
0096
0097
0098
0099 static void * thread_start(void *arg)
0100 {
0101 int i, j;
0102 exuuid_t cid;
0103
0104
0105 for (i=0; i<2; i++)
0106 {
0107 for (j=0; j<100000; j++)
0108 {
0109 ndrx_cid_generate(129, cid);
0110
0111
0112 if (NULL!=do_lookup(cid))
0113 {
0114 fail_test("Geneate 0 exists!");
0115 break;
0116 }
0117
0118 do_add(cid);
0119 }
0120 sleep(1);
0121 }
0122
0123 return NULL;
0124 }
0125
0126
0127
0128
0129 Ensure(test_nstd_cid_unq)
0130 {
0131 pthread_t th1;
0132 pthread_t th2;
0133 pthread_t th3;
0134 pthread_t th4;
0135
0136 int ret;
0137
0138 ret=pthread_create(&th1, NULL, thread_start, NULL);
0139 assert_equal(ret, EXSUCCEED);
0140
0141 ret=pthread_create(&th2, NULL, thread_start, NULL);
0142 assert_equal(ret, EXSUCCEED);
0143
0144 ret=pthread_create(&th3, NULL, thread_start, NULL);
0145 assert_equal(ret, EXSUCCEED);
0146
0147 ret=pthread_create(&th4, NULL, thread_start, NULL);
0148 assert_equal(ret, EXSUCCEED);
0149
0150 pthread_join(th1, NULL);
0151 pthread_join(th2, NULL);
0152 pthread_join(th3, NULL);
0153 pthread_join(th4, NULL);
0154 }
0155
0156
0157
0158
0159 Ensure(test_nstd_cid_fmt)
0160 {
0161 exuuid_t cid, cid2;
0162 unsigned seq1=0, seq2=0;
0163 pid_t pid;
0164 struct timeval tv, tv2, tvt;
0165 int i, got_diff;
0166
0167 memset(cid, 0, sizeof(exuuid_t));
0168 memset(cid2, 0, sizeof(exuuid_t));
0169
0170 ndrx_cid_generate(129, cid);
0171 sleep(2);
0172 ndrx_cid_generate(4, cid2);
0173
0174
0175 assert_equal((unsigned char)129, cid[0]);
0176 assert_equal((unsigned char)4, cid2[0]);
0177
0178 pid=getpid();
0179
0180 assert_equal( (pid>>24 & 0xff), cid[1]);
0181 assert_equal( (pid>>16 & 0xff), cid[2]);
0182 assert_equal( (pid>>8 & 0xff), cid[3]);
0183 assert_equal( (pid & 0xff), cid[4]);
0184
0185
0186
0187
0188
0189 seq1 |= cid[6];
0190 seq1<<=8;
0191 seq1 |= cid[7];
0192 seq1<<=8;
0193 seq1 |= cid[8];
0194
0195
0196
0197
0198
0199 seq2 |= cid2[6];
0200 seq2<<=8;
0201 seq2 |= cid2[7];
0202 seq2<<=8;
0203 seq2 |= cid2[8];
0204
0205
0206 assert_not_equal(seq1, seq2);
0207
0208 if ((seq1+1)!=seq2 )
0209 {
0210 fail_test("Sequence not incremented!");
0211 }
0212
0213 gettimeofday(&tvt, 0);
0214
0215 memset(&tv, 0, sizeof(tv));
0216 memset(&tv2, 0, sizeof(tv2));
0217
0218 tv.tv_sec |= (cid[9] & 0x01);
0219 tv.tv_sec<<=8;
0220 tv.tv_sec |= cid[10];
0221 tv.tv_sec<<=8;
0222 tv.tv_sec |= cid[11];
0223 tv.tv_sec<<=8;
0224 tv.tv_sec |= cid[12];
0225 tv.tv_sec<<=8;
0226 tv.tv_sec |= cid[13];
0227
0228
0229 tv2.tv_sec |= (cid2[9] & 0x01);
0230 tv2.tv_sec<<=8;
0231 tv2.tv_sec |= cid2[10];
0232 tv2.tv_sec<<=8;
0233 tv2.tv_sec |= cid2[11];
0234 tv2.tv_sec<<=8;
0235 tv2.tv_sec |= cid2[12];
0236 tv2.tv_sec<<=8;
0237 tv2.tv_sec |= cid2[13];
0238
0239 assert_not_equal(tv.tv_sec, tv2.tv_sec);
0240
0241 if (tv2.tv_sec - tv.tv_sec > 10)
0242 {
0243 fail_test("Time difference too large");
0244 }
0245
0246 if (labs(tv.tv_sec - tvt.tv_sec) > 10)
0247 {
0248 UBF_LOG(log_error, "Time difference too large (from clock): %ld vs %ld",
0249 (long)tv.tv_sec, (long)tvt.tv_sec);
0250 fail_test("Time difference too large (from clock)");
0251 }
0252
0253 got_diff=EXFALSE;
0254 for (i=0; i<1000; i++)
0255 {
0256 ndrx_cid_generate(129, cid);
0257 ndrx_cid_generate(4, cid2);
0258
0259 if (0!=memcmp(cid+14, cid2+14, 2))
0260 {
0261 got_diff=EXTRUE;
0262 }
0263 }
0264
0265 assert_equal(got_diff, EXTRUE);
0266
0267 }
0268
0269
0270
0271
0272
0273 TestSuite *ubf_nstd_cid(void)
0274 {
0275 TestSuite *suite = create_test_suite();
0276
0277 add_test(suite, test_nstd_cid_unq);
0278 add_test(suite, test_nstd_cid_fmt);
0279
0280 return suite;
0281 }
0282