[complement-svn] SF.net SVN: complement: [1638] trunk/complement/explore/test/virtual_time
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-07-24 07:49:07
|
Revision: 1638 http://svn.sourceforge.net/complement/?rev=1638&view=rev Author: complement Date: 2007-07-24 00:49:03 -0700 (Tue, 24 Jul 2007) Log Message: ----------- test for delivery VT message established; throw exception, if message has no chance to be delivered Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-23 12:17:18 UTC (rev 1637) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-24 07:49:03 UTC (rev 1638) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/20 09:26:15 ptr> +// -*- C++ -*- Time-stamp: <07/07/23 23:46:02 ptr> #include <exam/suite.h> @@ -22,6 +22,8 @@ int EXAM_DECL(gvt_add); int EXAM_DECL(VTMess_core); + + int EXAM_DECL(vt_object); }; int EXAM_IMPL(vtime_operations::vt_compare) @@ -303,6 +305,8 @@ EXAM_CHECK( gvt1[1][1] == 1 ); EXAM_CHECK( gvt1[1][2] == 1 ); } + + return EXAM_RESULT; } class VTM_handler : @@ -440,12 +444,94 @@ return EXAM_RESULT; } +int EXAM_IMPL(vtime_operations::vt_object) +{ + vtime_obj_rec ob; + const group_type gr0 = 0; + const group_type gr1 = 0; + const oid_type obj0 = 0; + const oid_type obj1 = 1; + const oid_type obj2 = 2; + + ob.add_group( gr0 ); + ob.add_group_member( gr0, obj0 ); + ob.add_group_member( gr0, obj1 ); + ob.add_group_member( gr0, obj2 ); + + // gvtime gvt; + // gvt[gr0][obj1] = 1; + + VTmess mess; + VTmess mess_bad; + + mess_bad.code = mess.code = 1; + mess_bad.src = mess.src = obj1; + mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] = 1; + mess_bad.grp = mess.grp = gr0; + mess_bad.mess = mess.mess = "data"; + + EXAM_CHECK( ob.deliver(mess) ); // ack + + ++mess.gvt[gr0][obj1]; + + EXAM_CHECK( ob.deliver(mess) ); // ack + + ++mess.gvt[gr0][obj1]; + + try { + EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: too old (out of order) + EXAM_ERROR( "exception expected" ); + } + catch ( const out_of_range& ) { + } + + mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] + 1; + + EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: too new (out of order) + + EXAM_CHECK( ob.deliver(mess) ); // ack + + mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; + + // ---- + + VTmess mess2; + + mess2.code = 1; + mess2.src = obj2; + mess2.gvt[gr0][obj2] = 1; + mess2.grp = gr0; + mess2.mess = "data"; + + mess_bad.gvt[gr0][obj2] = 1; + + EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: obj0 don't seen mess from obj2, but obj1 seen mess from obj2 + + EXAM_CHECK( ob.deliver(mess2) ); // ack: obj0 see first mess from obj2 + + ++mess2.gvt[gr0][obj2]; + + EXAM_CHECK( ob.deliver(mess_bad) ); // ack: now obj0 and obj1 sync dependency from obj2 + + mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; + mess.gvt[gr0][obj2] = 1; + + // ---- + + ob.add_group( gr0 ); + ob.add_group_member( gr1, obj0 ); + ob.add_group_member( gr1, obj1 ); + ob.add_group_member( gr1, obj2 ); + + return EXAM_RESULT; +} + int EXAM_DECL(vtime_test_suite); int EXAM_IMPL(vtime_test_suite) { - exam::test_suite::test_case_type tc[2]; + exam::test_suite::test_case_type tc[3]; exam::test_suite t( "virtual time operations" ); @@ -457,8 +543,10 @@ t.add( &vtime_operations::vt_diff, vt_oper, "Differences", tc[0] ); t.add( &vtime_operations::VTMess_core, vt_oper, "VTmess core transfer", - t.add( &vtime_operations::gvt_add, vt_oper, "Group VT add", tc[1] ) ); + tc[2] = t.add( &vtime_operations::gvt_add, vt_oper, "Group VT add", tc[1] ) ); + t.add( &vtime_operations::vt_object, vt_oper, "VT order", tc[2] ); + return t.girdle(); } Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-23 12:17:18 UTC (rev 1637) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-24 07:49:03 UTC (rev 1638) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/19 23:11:01 ptr> +// -*- C++ -*- Time-stamp: <07/07/23 20:32:22 ptr> #include "vtime.h" @@ -212,6 +212,15 @@ return tmp; } +vtime_type& sup( vtime_type& l, const vtime_type& r ) +{ + for ( vtime_type::const_iterator i = r.begin(); i != r.end(); ++i ) { + l[i->first] = std::max( l[i->first], i->second ); + } + return l; +} + + // template <> vtime max( const vtime& l, const vtime& r ) { @@ -223,6 +232,14 @@ return tmp; } +vtime& sup( vtime& l, const vtime& r ) +{ + for ( vtime_type::const_iterator i = r.vt.begin(); i != r.vt.end(); ++i ) { + l[i->first] = std::max( l[i->first], i->second ); + } + return l; +} + vtime& vtime::operator +=( const vtime_type::value_type& t ) { vt[t.first] += t.second; @@ -292,27 +309,32 @@ // cout << ev.value().gvt.gvt << endl; if ( order_correct( m ) ) { - cout << "Order correct" << endl; lvt[m.src] += m.gvt.gvt; lvt[m.src][m.grp][m.src] = vt.gvt[m.grp][m.src] + 1; - vt.gvt[m.grp] = vt::max( vt.gvt[m.grp], lvt[m.src][m.grp] ); - cout << vt.gvt << endl; + sup( vt.gvt[m.grp], lvt[m.src][m.grp] ); + // cout << vt.gvt << endl; return true; } - cout << "Order not correct" << endl; return false; } bool vtime_obj_rec::order_correct( const VTmess& m ) { + if ( groups.find( m.grp ) == groups.end() ) { + throw domain_error( "VT object not member of group" ); + } + gvtime gvt( m.gvt ); if ( vt.gvt[m.grp][m.src] + 1 != gvt[m.grp][m.src] ) { - cerr << "1" << endl; - cerr << vt.gvt[m.grp][m.src] << "\n" - << gvt[m.grp][m.src] - << endl; + // cerr << "1" << endl; + // cerr << vt.gvt[m.grp][m.src] << "\n" + // << gvt[m.grp][m.src] + // << endl; + if ( vt.gvt[m.grp][m.src] + 1 > gvt[m.grp][m.src] ) { + throw out_of_range( "duplicate or wrong VT message" ); + } return false; } Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-23 12:17:18 UTC (rev 1637) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-24 07:49:03 UTC (rev 1638) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/20 09:29:00 ptr> +// -*- C++ -*- Time-stamp: <07/07/23 21:33:09 ptr> #ifndef __vtime_h #define __vtime_h @@ -7,6 +7,7 @@ #include <list> #include <vector> #include <hash_map> +#include <hash_set> #include <iterator> #include <istream> @@ -34,6 +35,7 @@ vtime_type& operator +=( vtime_type& l, const vtime_type& r ); vtime_type max( const vtime_type& l, const vtime_type& r ); +vtime_type& sup( vtime_type& l, const vtime_type& r ); struct vtime : public stem::__pack_base @@ -90,6 +92,7 @@ vtime max( const vtime& l, const vtime& r ); +vtime& sup( vtime& l, const vtime& r ); // typedef std::pair<group_type, vtime> vtime_group_type; // typedef std::list<vtime_group_type> gvtime_type; @@ -159,11 +162,11 @@ { public: - typedef std::list<group_type> groups_container_type; + typedef std::hash_set<group_type> groups_container_type; typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; void add_group( group_type g ) - { groups.push_back( g ); } + { groups.insert(g); } void add_group_member( group_type g, oid_type p ) { vt[g][p]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |