OpcUaCanOpen
CANopen OPC-UA server
CanModuleTest.cpp
Go to the documentation of this file.
1 /* © Copyright Ben Farnham, CERN, 2018. All rights not expressly granted are reserved.
2  * nodemanagerbase.cpp
3  *
4  * Created on: reated on: Apr 11, 2018
5  * Author: Ben Farnham <ben.farnham@cern.ch>
6  *
7  * This file is part of Quasar.
8  *
9  * Quasar is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public Licence as published by
11  * the Free Software Foundation, either version 3 of the Licence.
12  *
13  * Quasar is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public Licence for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with Quasar. If not, see <http://www.gnu.org/licenses/>.
20  */
21 #include "CanModuleTest.h"
22 #include <stdint.h>
23 #include <boost/bind.hpp>
24 #include <LogIt.h>
25 #include <LogLevels.h>
26 #include "CanLibLoader.h"
27 #include "CCanAccess.h"
28 #include "MockCanAccess.h"
29 
30 using namespace CanModule;
31 using std::string;
32 
34 {
36 }
37 
39 {}
40 
42 {}
43 
45 {}
46 
48 {
49  const string dataAsString(std::string(msg.c_data, msg.c_data + (msg.c_dlc*sizeof(unsigned char))));
50  LOG(Log::INF) << __FUNCTION__ << " ID ["<<msg.c_id<<"] len ["<<(unsigned int)msg.c_dlc<<"] message [0x"<<dataAsString<<"] rtr ["<<msg.c_rtr<<"]";
51  boost::shared_ptr<CanMessage> msgClone(new CanMessage());
52 
53  msgClone->c_id = msg.c_id;
54  msgClone->c_ff = msg.c_ff;
55  msgClone->c_dlc = msg.c_dlc;
56  memcpy(msgClone->c_data, msg.c_data, 8);
57  msgClone->c_time.tv_sec = msg.c_time.tv_sec;
58  msgClone->c_time.tv_usec = msg.c_time.tv_usec;
59  msgClone->c_rtr = msg.c_rtr;
60  m_msgsRecvd.push_back(msgClone);
61 }
62 
63 TEST_F(CanModuleTest, loadWrongLib)
64 {
65  try
66  {
67  CanLibLoader::createInstance("LibDoesNotExist");
68  FAIL() << "expected exception to be thrown, lib does not exist";
69  }
70  catch (...){/*OK, expected*/}
71 }
72 
73 TEST_F(CanModuleTest, loadCorrectLib)
74 {
75  try
76  {
77  CanLibLoader::createInstance("MockUpCanImplementation");
78  }
79  catch (int e)
80  {
81  FAIL() << "unexpected exception thrown, lib should exist (did you remember to set *LD_LIBRARY_PATH* to locate the mock can implementation library? )";
82  }
83 }
84 
85 TEST_F(CanModuleTest, openCanBus)
86 {
87  CanLibLoader* libLoaderInstance = CanLibLoader::createInstance("MockUpCanImplementation");
88 
89  string parameters = "Unspecified";
90  const char* name = "FakeName";
91  CCanAccess* canBusAccessInstance = libLoaderInstance->openCanBus(name, parameters);
92  EXPECT_FALSE(canBusAccessInstance == 0);
93 }
94 
95 TEST_F(CanModuleTest, sendMessage)
96 {
97  CanLibLoader* libLoaderInstance = CanLibLoader::createInstance("MockUpCanImplementation");
98 
99  const char* parameters = "Unspecified";
100  const char* name = "FakeName9";
101  CCanAccess* canBusAccessInstance = libLoaderInstance->openCanBus(name, parameters);
102  EXPECT_TRUE(canBusAccessInstance->sendMessage(1, 8, (unsigned char*)("12345678"), false));
103  EXPECT_TRUE(canBusAccessInstance->sendMessage(2, 8, (unsigned char*)("22345678"), false));
104  EXPECT_TRUE(canBusAccessInstance->sendMessage(3, 8, (unsigned char*)("32345678"), false));
105 
106  CanStatistics stats;
107  canBusAccessInstance->getStatistics(stats);
108  EXPECT_EQ(3, stats.totalTransmitted()) << "test transmits 3 packages";
109 }
110 
111 TEST_F(CanModuleTest, sendRecvEchoMessage)
112 {
113  CanLibLoader* libLoaderInstance = CanLibLoader::createInstance("MockUpCanImplementation");
114  CCanAccess* canBusAccessInstance = libLoaderInstance->openCanBus("", "");
115 
117  canBusAccessInstance->canMessageCame.connect(boost::ref(handler));
118 
119  canBusAccessInstance->sendMessage(1, 8, CAN_ECHO_MSG, false); // send special echo test message
120  EXPECT_EQ(1, handler.m_msgsRecvd.size());
121  EXPECT_EQ(0, memcmp(CAN_ECHO_MSG, handler.m_msgsRecvd[0]->c_data, 8)) << "expected msg [0x"<<std::hex<<CAN_ECHO_MSG<<std::dec<<"] received [0x"<<std::hex<<handler.m_msgsRecvd[0]->c_data<<std::dec<<"]";
122 }