THM1176InstrumentDriver  1.0
C++ API for Metrolab THM1176
IEEE488InstrumentReadWriteTest.h
Go to the documentation of this file.
1 // Copyright (c) 2020 Metrolab Technology S.A., Geneva, Switzerland (www.metrolab.com)
2 // See the included file LICENSE.txt for the licensing conditions.
3 
7 
8 #pragma once
9 
10 #include <gtest/gtest.h>
11 
12 #include "IEEE488InstrumentTest.h"
13 
14 using namespace testing;
15 
16 class IEEE488InstrumentReadWriteTest : public ::testing::Test
17 {
18 protected:
19  static IEEE4888_TEST_RESOURCE_MANAGER_CLASS * pResourceManager;
20  static IEEE4888_TEST_INSTRUMENT_CLASS * pInstrument;
21 
22  static void SetUpTestCase()
23  {
24  ASSERT_EQ(true, ConnectToIEEE488Instrument(pResourceManager, pInstrument));
25  ASSERT_NE(nullptr, pResourceManager);
26  ASSERT_NE(nullptr, pInstrument);
27  ASSERT_EQ(true, pInstrument->IsOpen());
28  ASSERT_EQ(true, pInstrument->Clear());
29  }
30 
31  static void TearDownTestCase()
32  {
33  delete pInstrument;
34  pInstrument = nullptr;
35  delete pResourceManager;
36  pResourceManager = nullptr;
37  }
38 };
39 
40 IEEE4888_TEST_RESOURCE_MANAGER_CLASS * IEEE488InstrumentReadWriteTest::pResourceManager = nullptr;
41 IEEE4888_TEST_INSTRUMENT_CLASS * IEEE488InstrumentReadWriteTest::pInstrument = nullptr;
42 
44 TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_WriteCString)
45 {
46  ASSERT_EQ(true, pInstrument->Write ("*IDN?"));
47  CSCPIBuffer l_Buffer;
48  ASSERT_EQ(true, pInstrument->Read (l_Buffer));
49  EXPECT_EQ(true, CheckIDNResponse (l_Buffer));
50 
51 }
52 
54 TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_WriteCPPString)
55 {
56  ASSERT_EQ(true, pInstrument->Write (std::string("*IDN?")));
57  CSCPIBuffer l_Buffer;
58  ASSERT_EQ(true, pInstrument->Read (l_Buffer));
59  EXPECT_EQ(true, CheckIDNResponse (l_Buffer));
60 
61 }
62 
64 TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_WriteSCPIBuffer)
65 {
66  const char * l_Command = "*IDN?";
67  CSCPIBuffer l_CmdBuffer(l_Command, std::strlen(l_Command));
68  ASSERT_EQ(true, pInstrument->Write (l_CmdBuffer));
69  CSCPIBuffer l_Buffer;
70  ASSERT_EQ(true, pInstrument->Read (l_Buffer));
71  EXPECT_EQ(true, CheckIDNResponse (l_Buffer));
72 
73 }
74 
76 TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_MultipleBuffers)
77 {
78  CSCPIBuffer l_Buffer(16);
79  ASSERT_EQ(true, pInstrument->Write ("*IDN?"));
80 
81  ASSERT_EQ(true, pInstrument->Read (l_Buffer, false));
82  for (;;)
83  {
84  U16 l_Status;
85  ASSERT_EQ(true, pInstrument->ReadSTB (l_Status));
86  if ((l_Status & 0x0010) == 0) break;
87  ASSERT_EQ(true, pInstrument->Read (l_Buffer, true));
88  }
89 
90  EXPECT_EQ(true, CheckIDNResponse(l_Buffer));
91 
92 }
93 
95 TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_AfterSpuriousRead)
96 {
97  // Perform a spurious read.
98  CSCPIBuffer l_Buffer;
99  ASSERT_EQ(false, pInstrument->Read (l_Buffer));
100  ASSERT_EQ(true, pInstrument->Timeout());
101 
102  // Perform the *IDN? query.
103  ASSERT_EQ(true, pInstrument->Write ("*IDN?"));
104  ASSERT_EQ(false, pInstrument->Timeout());
105  ASSERT_EQ(true, pInstrument->Read (l_Buffer));
106  ASSERT_EQ(false, pInstrument->Timeout());
107  EXPECT_EQ(true, CheckIDNResponse (l_Buffer));
108 
109 }
110 
112 TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_AfterFailedWrite)
113 {
114  // Write a long command with a very short timeout.
115  std::string l_LongCommand;
116  for (int i = 0; i < 1000; i++)
117  l_LongCommand += "nonsense;";
118  U32 l_Timeout = pInstrument->GetTimeout();
119  pInstrument->SetTimeout(1ul);
120  ASSERT_EQ(false, pInstrument->Write (l_LongCommand));
121  ASSERT_EQ(true, pInstrument->Timeout());
122 
123  // Restore the default timeout and perform the *IDN? query.
124  pInstrument->SetTimeout(l_Timeout);
125  ASSERT_EQ(true, pInstrument->Write ("*IDN?"));
126  ASSERT_EQ(false, pInstrument->Timeout());
127  CSCPIBuffer l_Buffer;
128  ASSERT_EQ(true, pInstrument->Read (l_Buffer));
129  ASSERT_EQ(false, pInstrument->Timeout());
130  EXPECT_EQ(true, CheckIDNResponse (l_Buffer));
131 
132 }
133 
IEEE488InstrumentReadWriteTest::TearDownTestCase
static void TearDownTestCase()
Definition: IEEE488InstrumentReadWriteTest.h:31
IEEE488InstrumentReadWriteTest::pResourceManager
static IEEE4888_TEST_RESOURCE_MANAGER_CLASS * pResourceManager
Definition: CIEEE488InstrumentReadWriteTest.h:19
TEST_F
TEST_F(IEEE488InstrumentReadWriteTest, IDN_Query_WriteCString)
Test *IDN? query with C string variant of Write.
Definition: IEEE488InstrumentReadWriteTest.h:44
IEEE488InstrumentReadWriteTest::pInstrument
static IEEE4888_TEST_INSTRUMENT_CLASS * pInstrument
Definition: CIEEE488InstrumentReadWriteTest.h:20
IEEE488InstrumentTest.h
Utility functions used to test IEEE488Instrument API.
IEEE488InstrumentReadWriteTest
Definition: CIEEE488InstrumentReadWriteTest.h:17
CheckIDNResponse
bool CheckIDNResponse(const CSCPIBuffer &rBuffer)
Sanity-check of the response to an *IDN? query.
Definition: IEEE488InstrumentTest.cpp:70
IEEE488InstrumentReadWriteTest::SetUpTestCase
static void SetUpTestCase()
Definition: IEEE488InstrumentReadWriteTest.h:22
U16
unsigned short U16
16-bit unsigned integer.
Definition: OSDefines.h:31
MTL::Instrument::CSCPIBuffer
Instrument Buffer.
Definition: SCPIInstrumentBuffer.h:44
U32
unsigned int U32
32-bit unsigned integer.
Definition: OSDefines.h:32
ConnectToIEEE488Instrument
bool ConnectToIEEE488Instrument(IEEE4888_TEST_RESOURCE_MANAGER_CLASS *&rpResourceManager, IEEE4888_TEST_INSTRUMENT_CLASS *&rpInstrument)
Connect to an IEEE488Instrument.
Definition: IEEE488InstrumentTest.cpp:40