Navigation


Changeset 706:4ffbc9f1e922 in freeDiameter for tests/testsess.c


Ignore:
Timestamp:
Feb 9, 2011, 3:26:58 PM (13 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Large UNTESTED commit with the following changes:

  • Improved DiameterIdentity? handling (esp. interationalization issues), and improve efficiency of some string operations in peers, sessions, and dictionary modules (closes #7)
  • Cleanup in the session module to free only unreferenced sessions (#16)
  • Removed fd_cpu_flush_cache(), replaced by more robust alternatives.
  • Improved peer state machine algorithm to counter SCTP multistream race condition.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/testsess.c

    r662 r706  
    3737
    3838#define TEST_DIAM_ID    "testsess.myid"
    39 #define TEST_OPT        "suffix"
    40 #define TEST_SID        TEST_DIAM_ID ";1234;5678;" TEST_OPT
     39#define TEST_OPT_IN     "suffix"
     40#define TEST_OPT        (os0_t)TEST_OPT_IN
     41#define TEST_SID_IN     TEST_DIAM_ID ";1234;5678;" TEST_OPT_IN
     42#define TEST_SID        (os0_t)TEST_SID_IN
    4143
    4244#define TEST_EYEC       0x7e57e1ec
    4345struct mystate {
    4446        int     eyec;   /* TEST_EYEC */
    45         char *  sid;    /* the session with which the data was registered */
     47        os0_t   sid;    /* the session with which the data was registered */
    4648        int  *  freed;  /* location where to write the freed status */
    4749        void *  opaque; /* if opaque was provided, this is the value we expect */
    4850};
    4951
    50 static void mycleanup( struct mystate * data, char * sid, void * opaque )
     52static void mycleanup( struct mystate * data, os0_t sid, void * opaque )
    5153{
    5254        /* sanity */
     
    5456        CHECK( 1, data? 1 : 0 );
    5557        CHECK( TEST_EYEC, data->eyec );
    56         CHECK( 0, strcmp(sid, data->sid) );
     58        CHECK( 0, strcmp((char *)sid, (char *)data->sid) );
    5759        if (data->freed)
    5860                *(data->freed) += 1;
     
    6567}
    6668
    67 static __inline__ struct mystate * new_state(char * sid, int *freed)
     69static __inline__ struct mystate * new_state(os0_t sid, int *freed)
    6870{
    6971        struct mystate *new;
     
    7274        memset(new, 0, sizeof(struct mystate));
    7375        new->eyec = TEST_EYEC;
    74         new->sid = strdup(sid);
     76        new->sid = os0dup(sid, strlen((char *)sid));
    7577        CHECK( 1, new->sid ? 1 : 0 );
    7678        new->freed = freed;
     
    7981
    8082void * g_opaque = (void *)"test";
     83
     84/* Avoid a lot of casts */
     85#define strlen(s) strlen((char *)s)
     86#define strncmp(s1,s2,l) strncmp((char *)s1, (char *)s2, l)
     87#define strcmp(s1,s2) strcmp((char *)s1, (char *)s2)
    8188       
    8289
     
    8693        struct session_handler * hdl1, *hdl2;
    8794        struct session *sess1, *sess2, *sess3;
    88         char *str1, *str2;
     95        os0_t str1, str2;
     96        size_t str1len, str2len;
    8997        int new;
    9098       
     
    109117        {
    110118                /* DiamId is provided, not opt */
    111                 CHECK( 0, fd_sess_new( &sess1, TEST_DIAM_ID, NULL, 0 ) );
    112                 CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, NULL, 0 ) );
     119                CHECK( 0, fd_sess_new( &sess1, TEST_DIAM_ID, CONSTSTRLEN(TEST_DIAM_ID), NULL, 0 ) );
     120                CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, CONSTSTRLEN(TEST_DIAM_ID), NULL, 0 ) );
    113121                #if 0
    114122                fd_sess_dump(0, sess1);
     
    117125               
    118126                /* Check both string start with the diameter Id, but are different */
    119                 CHECK( 0, fd_sess_getsid(sess1, &str1) );
    120                 CHECK( 0, strncmp(str1, TEST_DIAM_ID ";", strlen(TEST_DIAM_ID) + 1) );
    121                 CHECK( 0, fd_sess_getsid(sess2, &str2) );
    122                 CHECK( 0, strncmp(str2, TEST_DIAM_ID ";", strlen(TEST_DIAM_ID) + 1) );
     127                CHECK( 0, fd_sess_getsid(sess1, &str1, &str1len) );
     128                CHECK( 1, (strlen(str1) == str1len) ? 1 : 0 );
     129                CHECK( 0, strncmp(str1, TEST_DIAM_ID ";", CONSTSTRLEN(TEST_DIAM_ID) + 1) );
     130                CHECK( 0, fd_sess_getsid(sess2, &str2, &str2len) );
     131                CHECK( 0, strncmp(str2, TEST_DIAM_ID ";", CONSTSTRLEN(TEST_DIAM_ID) + 1) );
    123132                CHECK( 1, strcmp(str1, str2) ? 1 : 0 );
    124133                CHECK( 0, fd_sess_destroy( &sess1 ) );
     
    126135               
    127136                /* diamId and opt */
    128                 CHECK( 0, fd_sess_new( &sess1, TEST_DIAM_ID, TEST_OPT, 0 ) );
    129                 CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, TEST_OPT, strlen(TEST_OPT) - 1 ) );
    130                 #if 0
    131                 fd_sess_dump(0, sess1);
    132                 fd_sess_dump(0, sess2);
    133                 #endif
    134                
    135                 CHECK( 0, fd_sess_getsid(sess1, &str1) );
    136                 CHECK( 0, strncmp(str1, TEST_DIAM_ID ";", strlen(TEST_DIAM_ID) + 1) );
    137                 CHECK( 0, strcmp(str1 + strlen(str1) - strlen(TEST_OPT) - 1, ";" TEST_OPT) );
    138                
    139                 CHECK( 0, fd_sess_getsid(sess2, &str2) );
    140                 CHECK( 0, strncmp(str2, TEST_DIAM_ID ";", strlen(TEST_DIAM_ID) + 1) );
    141                 CHECK( 0, strncmp(str2 + strlen(str2) - strlen(TEST_OPT), ";" TEST_OPT, strlen(TEST_OPT)) );
     137                CHECK( 0, fd_sess_new( &sess1, TEST_DIAM_ID, 0, TEST_OPT, 0 ) );
     138                CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, CONSTSTRLEN(TEST_DIAM_ID), TEST_OPT, CONSTSTRLEN(TEST_OPT_IN) - 1 ) );
     139                #if 0
     140                fd_sess_dump(0, sess1);
     141                fd_sess_dump(0, sess2);
     142                #endif
     143               
     144                CHECK( 0, fd_sess_getsid(sess1, &str1, &str1len) );
     145                CHECK( 0, strncmp(str1, TEST_DIAM_ID ";", CONSTSTRLEN(TEST_DIAM_ID) + 1) );
     146                CHECK( 0, strcmp(str1 + str1len - CONSTSTRLEN(TEST_OPT_IN) - 1, ";" TEST_OPT_IN) );
     147               
     148                CHECK( 0, fd_sess_getsid(sess2, &str2, &str2len) );
     149                CHECK( 0, strncmp(str2, TEST_DIAM_ID ";", CONSTSTRLEN(TEST_DIAM_ID) + 1) );
     150                CHECK( 0, strncmp(str2 + str2len - CONSTSTRLEN(TEST_OPT_IN), ";" TEST_OPT_IN, CONSTSTRLEN(TEST_OPT_IN)) );
    142151               
    143152                CHECK( 1, strcmp(str1, str2) ? 1 : 0 );
     
    146155               
    147156                /* Now, only opt is provided */
    148                 CHECK( 0, fd_sess_new( &sess1, NULL, TEST_SID, 0 ) );
    149                 CHECK( EALREADY, fd_sess_new( &sess2, NULL, TEST_SID, 0 ) );
     157                CHECK( 0, fd_sess_new( &sess1, NULL, 0, TEST_SID, 0 ) );
     158                CHECK( EALREADY, fd_sess_new( &sess2, NULL, 0, TEST_SID, 0 ) );
    150159                CHECK( sess2, sess1 );
    151                 CHECK( EALREADY, fd_sess_new( &sess3, NULL, TEST_SID, strlen(TEST_SID) ) );
     160                CHECK( EALREADY, fd_sess_new( &sess3, NULL, 0, TEST_SID, CONSTSTRLEN(TEST_SID_IN) ) );
    152161                CHECK( sess3, sess1 );
    153                 CHECK( 0, fd_sess_new( &sess2, NULL, TEST_SID, strlen(TEST_SID) - 1 ) );
    154                 #if 0
    155                 fd_sess_dump(0, sess1);
    156                 fd_sess_dump(0, sess2);
    157                 #endif
    158                 CHECK( 0, fd_sess_getsid(sess1, &str1) );
    159                 CHECK( 0, fd_sess_getsid(sess2, &str2) );
    160                 CHECK( 0, strncmp( str1, str2, strlen(TEST_SID) - 1 ) );
     162                CHECK( 0, fd_sess_new( &sess2, NULL, 0, TEST_SID, CONSTSTRLEN(TEST_SID_IN) - 1 ) );
     163                #if 0
     164                fd_sess_dump(0, sess1);
     165                fd_sess_dump(0, sess2);
     166                #endif
     167                CHECK( 0, fd_sess_getsid(sess1, &str1, &str1len) );
     168                CHECK( 0, fd_sess_getsid(sess2, &str2, &str2len) );
     169                CHECK( 0, strncmp( str1, str2, CONSTSTRLEN(TEST_SID_IN) - 1 ) );
    161170                CHECK( 0, strcmp( str1, TEST_SID ) );
     171                CHECK( 1, strcmp( str1, str2 ) ? 1 : 0 );
    162172               
    163173                CHECK( 0, fd_sess_destroy( &sess2 ) );
     
    167177        /* Test fd_sess_fromsid */
    168178        {
    169                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
    170                 CHECK( 1, new ? 1 : 0 );
    171                
    172                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess2, &new ) );
     179                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
     180                CHECK( 1, new ? 1 : 0 );
     181               
     182                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess2, &new ) );
    173183                CHECK( 0, new );
    174184                CHECK( sess1, sess2 );
    175185               
    176                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess3, NULL ) );
     186                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess3, NULL ) );
    177187                CHECK( sess1, sess3 );
    178188               
     
    184194                struct mystate *tms;
    185195               
    186                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
     196                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
    187197                CHECK( 1, new ? 1 : 0 );
    188198               
     
    190200                CHECK( NULL, sess1 );
    191201               
    192                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
     202                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
    193203                CHECK( 1, new ? 1 : 0 );
    194204               
     
    199209                CHECK( NULL, sess1 );
    200210               
    201                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
     211                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
    202212                CHECK( 0, new );
    203213               
    204214                CHECK( 0, fd_sess_destroy( &sess1 ) );
    205215               
    206                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
     216                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
    207217                CHECK( 1, new ? 1 : 0 );
    208218               
     
    214224                struct timespec timeout;
    215225               
    216                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
     226                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
    217227                CHECK( 1, new ? 1 : 0 );
    218228               
    219229                CHECK( 0, clock_gettime(CLOCK_REALTIME, &timeout) );
    220                 CHECK( 0, fd_sess_settimeout( sess1, &timeout) );
     230                CHECK( 0, fd_sess_settimeout( sess1, &timeout) ); /* expire now */
    221231                timeout.tv_sec = 0;
    222232                timeout.tv_nsec= 50000000; /* 50 ms */
    223233                CHECK( 0, nanosleep(&timeout, NULL) );
    224234               
    225                 CHECK( 0, fd_sess_fromsid( TEST_SID, strlen(TEST_SID), &sess1, &new ) );
     235                CHECK( 0, fd_sess_fromsid( TEST_SID, CONSTSTRLEN(TEST_SID_IN), &sess1, &new ) );
    226236                CHECK( 1, new ? 1 : 0 );
    227237               
     
    231241               
    232242                /* Create a second session */
    233                 CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, NULL, 0 ) );
    234                
    235                 /* We don't really have away to verify the expiry list is in proper order automatically here... */
     243                CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, 0, NULL, 0 ) );
     244               
     245                /* We don't really have a way to verify the expiry list is in proper order automatically here... */
    236246               
    237247                CHECK( 0, fd_sess_destroy( &sess2 ) );
     
    248258               
    249259                /* Create three sessions */
    250                 CHECK( 0, fd_sess_new( &sess1, TEST_DIAM_ID, NULL, 0 ) );
    251                 CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, NULL, 0 ) );
    252                 CHECK( 0, fd_sess_new( &sess3, TEST_DIAM_ID, NULL, 0 ) );
     260                CHECK( 0, fd_sess_new( &sess1, TEST_DIAM_ID, 0, NULL, 0 ) );
     261                CHECK( 0, fd_sess_new( &sess2, TEST_DIAM_ID, 0, NULL, 0 ) );
     262                CHECK( 0, fd_sess_new( &sess3, TEST_DIAM_ID, 0, NULL, 0 ) );
    253263               
    254264                /* Create 2 states */
    255                 CHECK( 0, fd_sess_getsid(sess1, &str1) );
     265                CHECK( 0, fd_sess_getsid(sess1, &str1, &str1len) );
    256266                freed[0] = 0;
    257267                ms[0] = new_state(str1, &freed[0]);
     
    281291                /* Now create 6 states */
    282292                memset(&freed[0], 0, sizeof(freed));
    283                 CHECK( 0, fd_sess_getsid(sess1, &str1) );
     293                CHECK( 0, fd_sess_getsid(sess1, &str1, &str1len) );
    284294                ms[0] = new_state(str1, &freed[0]);
    285295                ms[1] = new_state(str1, &freed[1]);
    286                 CHECK( 0, fd_sess_getsid(sess2, &str1) );
     296                CHECK( 0, fd_sess_getsid(sess2, &str1, &str1len) );
    287297                ms[2] = new_state(str1, &freed[2]);
    288298                ms[3] = new_state(str1, &freed[3]);
    289                 CHECK( 0, fd_sess_getsid(sess3, &str1) );
     299                CHECK( 0, fd_sess_getsid(sess3, &str1, &str1len) );
    290300                ms[4] = new_state(str1, &freed[4]);
    291301                ms[5] = new_state(str1, &freed[5]);
    292302                ms[5]->opaque = g_opaque;
    293                 str2 = strdup(str1);
     303                str2 = os0dup(str1, str1len);
    294304                CHECK( 1, str2 ? 1 : 0 );
    295305               
     
    333343               
    334344                /* Create again session 3, check that no data is associated to it */
    335                 CHECK( 0, fd_sess_fromsid( str2, strlen(str2), &sess3, &new ) );
     345                CHECK( 0, fd_sess_fromsid( str2, str1len, &sess3, &new ) );
    336346                CHECK( 1, new ? 1 : 0 );
    337347                CHECK( 0, fd_sess_state_retrieve( hdl1, sess3, &tms ) );
     
    359369                /* Check the last data can still be retrieved */
    360370                CHECK( 0, fd_sess_state_retrieve( hdl1, sess1, &tms ) );
    361                 CHECK( 0, fd_sess_getsid(sess1, &str1) );
     371                CHECK( 1, tms ? 1 : 0);
     372                CHECK( 0, fd_sess_getsid(sess1, &str1, &str1len) );
    362373                mycleanup(tms, str1, NULL);
    363374        }
    364375       
     376        /* TODO: add tests on messages referencing sessions */
    365377       
    366378        /* That's all for the tests yet */
Note: See TracChangeset for help on using the changeset viewer.