]> WPIA git - cassiopeia.git/blob - test/src/slipBioTest.cpp
add: Basic BIO implementation for SLIP
[cassiopeia.git] / test / src / slipBioTest.cpp
1 #include <iostream>
2 #include <cstring>
3
4 #include <boost/test/unit_test.hpp>
5
6 #include "bios.h"
7 #include "slipBio.h"
8
9 class OpensslBIOVector : public OpensslBIO {
10 private:
11     std::vector<std::vector<char>>::iterator it, end;
12     std::vector<std::vector<char>> input;
13
14 public:
15     std::vector<std::vector<char>> result = std::vector<std::vector<char>>();
16     OpensslBIOVector( std::vector<std::vector<char>> data ) {
17         input = data;
18         it = input.begin();
19         end = input.end();
20     }
21
22     int write( const char* buf, int num );
23     int read( char* buf, int size );
24     long ctrl( int cmod, long arg1, void* arg2 );
25
26     static const char* getName();
27 };
28
29 int OpensslBIOVector::write( const char* buf, int num ) {
30     result.push_back( std::vector<char>( buf, buf + num ) );
31     return num;
32 }
33
34 int OpensslBIOVector::read( char* buf, int size ) {
35     if( it == end ) {
36         return -1;
37     }
38
39     if( ( unsigned int ) size < it->size() ) {
40         throw "Error, to small buffer";
41     }
42
43     std::copy( it->begin(), it->end(), buf );
44     auto result = it->size();
45     it++;
46     return result;
47 }
48
49 long OpensslBIOVector::ctrl( int cmod, long arg1, void* arg2 ) {
50     ( void ) cmod;
51     ( void ) arg1;
52     ( void ) arg2;
53     return 0;
54 }
55
56 const char* OpensslBIOVector::getName() {
57     return "dummyBIO";
58 }
59
60 BOOST_AUTO_TEST_SUITE( TestSLIPBioWrapper )
61
62 BOOST_AUTO_TEST_CASE( TestMockup ) {
63     std::vector<std::vector<char>> source = {{1, 2}, {1, 2, 3}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}};
64
65     OpensslBIOVector* data = new OpensslBIOVector( source );
66
67     char buf[4096];
68
69     for( auto it = source.begin(); it != source.end(); it++ ) {
70         auto len = data->read( buf, sizeof( buf ) );
71         BOOST_CHECK_EQUAL( len, it->size() );
72         BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + len, it->begin(), it->end() );
73         BOOST_CHECK_EQUAL( data->write( buf, len ), len );
74     }
75
76     BOOST_CHECK_EQUAL( data->read( buf, sizeof( buf ) ), -1 );
77
78     for( unsigned int i = 0; i < source.size(); i++ ) {
79         BOOST_CHECK_EQUAL_COLLECTIONS( data->result[i].begin(), data->result[i].end(), source[i].begin(), source[i].end() );
80     }
81
82     delete data;
83 }
84
85 BOOST_AUTO_TEST_CASE( TestSLIP ) {
86     std::vector<std::vector<char>> source = { {1, 2, 3, 4, 5, ( char ) 0xc0, 1, ( char ) 0xc0}, {1, 2}, {( char ) 0xc0}, {1, ( char ) 0xdb}, {( char ) 0xdc}, {( char ) 0xc0, ( char )0xdb}, {( char ) 0xdd, 2}, {( char ) 0xc0}};
87     std::shared_ptr<OpensslBIOVector> data = std::shared_ptr<OpensslBIOVector>( new OpensslBIOVector( source ) );
88     char buf[4096];
89     SlipBIO* slip = new SlipBIO( data );
90     int res = slip->read( buf, sizeof( buf ) );
91     BOOST_CHECK_EQUAL( res, 5 );
92     res = slip->read( buf, sizeof( buf ) );
93     BOOST_CHECK_EQUAL( res, 1 );
94     res = slip->read( buf, sizeof( buf ) );
95     BOOST_CHECK_EQUAL( res, 2 );
96
97     res = slip->read( buf, sizeof( buf ) );
98     BOOST_CHECK_EQUAL( res, 2 );
99     char res2[] = {1, ( char ) 0xc0};
100     BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + 2, res2, res2 + 2 );
101
102     res = slip->read( buf, sizeof( buf ) );
103     BOOST_CHECK_EQUAL( res, 2 );
104     char res3[] = {( char ) 0xdb, 2};
105     BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + 2, res3, res3 + 2 );
106 }
107
108 BOOST_AUTO_TEST_SUITE_END()