aboutsummaryrefslogtreecommitdiff
path: root/library/test/unit/mipi_syst_gtest.h
diff options
context:
space:
mode:
Diffstat (limited to 'library/test/unit/mipi_syst_gtest.h')
-rw-r--r--library/test/unit/mipi_syst_gtest.h249
1 files changed, 249 insertions, 0 deletions
diff --git a/library/test/unit/mipi_syst_gtest.h b/library/test/unit/mipi_syst_gtest.h
new file mode 100644
index 0000000..0268711
--- /dev/null
+++ b/library/test/unit/mipi_syst_gtest.h
@@ -0,0 +1,249 @@
+/*
+Copyright (c) 2018, MIPI Alliance, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Contributors:
+ * Norbert Schulz (Intel Corporation) - Initial API and implementation
+ */
+
+#include <gtest/gtest.h>
+#include <string>
+
+#define MIPI_SYST_UNIT_TEST
+
+#include "mipi_syst.h"
+
+/* hard code compiler dependend standard defines to fixed values for
+* unit test support. Regression tests expect to see these values.
+*/
+#undef MIPI_SYST_FUNCTION_NAME
+#define MIPI_SYST_FUNCTION_NAME "0123456789"
+
+#undef MIPI_SYST_LINE
+#define MIPI_SYST_LINE 0x12345678
+
+#undef MIPI_SYST_FILE
+#define MIPI_SYST_FILE "unittest.c"
+
+
+#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR)
+#define mipi_syst_return_addr() (void*)0x12345678aabbccdd
+#else
+#define mipi_syst_return_addr() (void*)0x12345678
+#endif
+
+
+/* replace output handlers with unit test versions
+*/
+#undef MIPI_SYST_OUTPUT_D32MTS
+#undef MIPI_SYST_OUTPUT_D64MTS
+#undef MIPI_SYST_OUTPUT_D32TS
+#undef MIPI_SYST_OUTPUT_D8
+#undef MIPI_SYST_OUTPUT_D16
+#undef MIPI_SYST_OUTPUT_D32
+#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO)
+#undef MIPI_SYST_OUTPUT_D64
+#endif
+#undef MIPI_SYST_OUTPUT_FLAG
+
+#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA)
+#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) \
+ MipiSysTFixtureOutput::d32mts((syst_handle), (data))
+#define MIPI_SYST_OUTPUT_D64MTS(syst_handle, data) \
+ MipiSysTFixtureOutput::d64mts((syst_handle), (data))
+#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) \
+ MipiSysTFixtureOutput::d32ts((syst_handle), (data))
+#define MIPI_SYST_OUTPUT_D8(syst_handle, data) \
+ MipiSysTFixtureOutput::d8((syst_handle), (data))
+#define MIPI_SYST_OUTPUT_D16(syst_handle, data) \
+ MipiSysTFixtureOutput::d16((syst_handle), (data))
+#define MIPI_SYST_OUTPUT_D32(syst_handle, data) \
+ MipiSysTFixtureOutput::d32((syst_handle), (data))
+#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO)
+#define MIPI_SYST_OUTPUT_D64(syst_handle, data) \
+ MipiSysTFixtureOutput::d64((syst_handle), (data))
+#endif
+#define MIPI_SYST_OUTPUT_FLAG(syst_handle) \
+ MipiSysTFixtureOutput::flag((syst_handle))
+#else
+#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data)
+#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data)
+#define MIPI_SYST_OUTPUT_D8(syst_handle, data)
+#define MIPI_SYST_OUTPUT_D16(syst_handle, data)
+#define MIPI_SYST_OUTPUT_D32(syst_handle, data)
+#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO)
+#define MIPI_SYST_OUTPUT_D64(syst_handle, data)
+#endif
+#define MIPI_SYST_OUTPUT_FLAG(syst_handle)
+#endif // MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA
+
+class MipiSysTFixtureBase : public testing::Test
+{
+public:
+ void SetUp() {
+ MIPI_SYST_INIT(mipi_syst_platform_init, (void*)0);}
+
+ void TearDown(){
+ MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy);
+ }
+
+ static struct mipi_syst_origin origin;
+};
+
+class MipiSysTFixtureOutput : public MipiSysTFixtureBase
+{
+public:
+ void SetUp() {
+ MipiSysTFixtureBase::SetUp();
+
+ ph = MIPI_SYST_INIT_HANDLE(&sh, &origin);
+ MIPI_SYST_SET_HANDLE_MODULE_UNIT(ph, 1,2);
+ MIPI_SYST_ENABLE_HANDLE_LENGTH(ph, 1);
+
+ sstr.str("");
+ }
+
+ void TearDown(){
+ MIPI_SYST_DELETE_HANDLE(ph);
+
+ MipiSysTFixtureBase::TearDown();
+ }
+
+public:
+ struct mipi_syst_handle sh;
+ struct mipi_syst_handle* ph;
+
+ static std::stringstream sstr;
+ std::string x4m;
+
+ /* unit test IO driver function to print the access output into local string */
+ static void d64(struct mipi_syst_handle* systh, mipi_syst_u64 v)
+ { sstr << "<D64>"<< std::hex << std::setfill('0') << std::setw(16) << v; }
+ static void d32(struct mipi_syst_handle* systh, mipi_syst_u32 v)
+ { sstr << "<D32>"<< std::hex << std::setfill('0') << std::setw(8) << v; }
+ static void d16(struct mipi_syst_handle* systh, mipi_syst_u16 v)
+ { sstr << "<D16>"<< std::hex << std::setfill('0') << std::setw(4) << v; }
+ static void d8(struct mipi_syst_handle* systh, mipi_syst_u8 v)
+ { sstr << "<D8>"<< std::hex << std::setfill('0') << std::setw(2) << (mipi_syst_u16)v; }
+ static void d32ts(struct mipi_syst_handle* systh, mipi_syst_u32 v)
+ {
+ sstr << "<D32TS>"<< std::hex << std::setfill('0') << std::setw(8) << v;
+ union {
+ mipi_syst_u32 val;
+ struct mipi_syst_msg_tag tag;
+ }u = { v };
+
+ sstr << "[typ=" << u.tag.et_type << ":" << u.tag.et_subtype
+ << " mu=" << (u.tag.et_modunit >> 4) << ":" << (u.tag.et_modunit & 0xF)
+ << " sev=" << u.tag.et_severity;
+
+ if (u.tag.et_res7) sstr << " res7";
+ if (u.tag.et_location) sstr << " loc";
+ if (u.tag.et_res30) sstr << " res30";
+ if (u.tag.et_length) sstr << " len";
+ if (u.tag.et_chksum) sstr << " chk";
+ sstr << "]";
+ }
+ static void d32mts(struct mipi_syst_handle* systh, mipi_syst_u32 v)
+ { sstr << "<D32MTS>"<< std::hex << std::setfill('0') << std::setw(8) << v; }
+ static void d64mts(struct mipi_syst_handle* systh, mipi_syst_u64 v)
+ { sstr << "<D64MTS>"<< std::hex << std::setfill('0') << std::setw(16) << v; }
+ static void flag(struct mipi_syst_handle* systh)
+ { sstr << "<FLAG>"; }
+
+ /* output string transformation to match platform properties */
+ const char* xform(const char* input)
+ {
+ size_t pos(0);
+ x4m=input;
+#if !defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO)
+ pos = std::string::npos;
+ while((pos=x4m.find("<D64>")) != std::string::npos){
+ std::string val = x4m.substr(pos+5,16);
+ std::string upperVal = val.substr(8,8);
+ std::string lowerVal = val.substr(0,8);
+ std::string replacement = "<D32>";
+ replacement += upperVal;
+ replacement += "<D32>";
+ replacement += lowerVal;
+ x4m.erase(pos,21);
+ x4m.insert(pos,replacement);
+ }
+#endif
+#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR)
+ /* need to adapt 32bit catalog type for 64bit packing settings */
+ pos = x4m.find("[typ=3:1 ");
+ if (pos != std::string::npos) {
+ x4m.replace(pos, 9, std::string("[typ=3:5 "));
+ x4m.replace(0, 9, std::string("<D32TS>05"));
+ }
+
+ /* need to adapt 64bit catalog type for 64bit packing settings */
+ pos = x4m.find("[typ=3:2 ");
+ if (pos != std::string::npos) {
+ x4m.replace(pos, 9, std::string("[typ=3:6 "));
+ x4m.replace(0, 9, std::string("<D32TS>06"));
+ }
+
+ pos = x4m.find("[typ=2:b ");
+ if (pos != std::string::npos) {
+ x4m.replace(pos, 9, std::string("[typ=2:c "));
+ x4m.replace(0, 9, std::string("<D32TS>0c"));
+ }
+#endif
+#if !defined(MIPI_SYST_PCFG_LENGTH_FIELD)
+ /* take out len parts from comparsion string */
+ pos = x4m.find(" len");
+ if (pos != std::string::npos) {
+ x4m.replace(pos, 4, "");
+
+ std::stringstream sstr(x4m.substr(7, 8));
+ mipi_syst_u32 tag;
+ sstr >> std::hex >> tag;
+ tag &= ~(1 << 9);
+ sstr.str(std::string());
+ sstr.clear();
+ sstr << std::hex << std::setfill('0') << std::setw(8)
+ << std::noshowbase << tag;
+ x4m.replace(7, 8, sstr.str());
+
+ pos = x4m.find("<D16>");
+ if (pos != std::string::npos) {
+ x4m.replace(pos, 9, "");
+ }
+ }
+#endif
+
+ return x4m.c_str();
+ }
+};