#include #include #include #include #include #include #include #include #include #include "util/util.h" #include "xbee.h" using namespace std; class ProtocolTestSuite : public Test::Suite{ string src; public: ProtocolTestSuite() : src() { TEST_ADD(ProtocolTestSuite::test_encode_decode0); TEST_ADD(ProtocolTestSuite::test_encode_decode1); TEST_ADD(ProtocolTestSuite::test_encode_decode2); TEST_ADD(ProtocolTestSuite::test_encode_decode3); } protected: template static void raw_out(_Elem &buf, unsigned int length){ cout << hex; for(int i(0); length--; i++){ cout << setfill('0') << setw(2) << (unsigned int)((unsigned char)buf[i]) << ' '; } cout << dec << endl; } template static void raw_out(_Elem &buf){ raw_out(buf, buf.size()); } virtual void setup(){ rand_init(0); src.clear(); for(int i(0); i < 0x1000; i++){ src.push_back((char)(rand() & 0xFF)); } raw_out(src, src.length()); } virtual void tear_down(){ } private: void test_encode_decode(XBeeOStream &out, XBeeIStream &in){ string dist; vector data_sizes_orig, data_sizes; for(int i(0); i < src.length(); ){ unsigned int data_size( min(src.length() - i, ((unsigned int)rand() & 0x3F) + 1)); out.set_data_size(data_size); out << src.substr(i, data_size); i += data_size; data_sizes_orig.push_back(data_size); } while(true){ char buf[0x40]; buf[0] = in.get(); if(!in.good()){break;} unsigned int data_size(in.readsome(&buf[1], sizeof(buf) - 1) + 1); dist.append(buf, data_size); data_sizes.push_back(data_size); } raw_out(dist, dist.length()); //raw_out(pipe.str(), pipe.str().length()); for(vector::iterator it1(data_sizes_orig.begin()), it2(data_sizes.begin()); it1 != data_sizes_orig.end(); ++it1, ++it2){ TEST_ASSERT(*it1 == *it2); } TEST_ASSERT(strcmp(src.c_str(), dist.c_str()) == 0); } void test_encode_decode0(){ stringstream pipe; XBeeOStream out(pipe, false); XBeeIStream in(pipe, false); test_encode_decode(out, in); } void test_encode_decode1(){ stringstream pipe; XBeeOStream out(pipe, true); XBeeIStream in(pipe, true); test_encode_decode(out, in); } void test_encode_decode2(){ stringstream pipe; XBeeOStream out(pipe, true); XBeeIStream in(pipe, false); test_encode_decode(out, in); } void test_encode_decode3(){ stringstream pipe; XBeeOStream out(pipe, false); XBeeIStream in(pipe, true); test_encode_decode(out, in); } }; bool run_tests(){ ProtocolTestSuite test_suits; Test::TextOutput output(Test::TextOutput::Verbose); return test_suits.run(output, false); // Note the 'false' parameter } int main(){run_tests();return 0;}