[SystemC][gtest] SystemCでGoogleTestを使う。

Using existing unit test frameworks with SystemC

C++のフレームワークがあるなら、SystemCでもやらねば!!!
ってことで、誰かやったみたいですね。

こちらのブログにも試された記事が載ってます。

べ、別に...先越されたからって...悔しくなんかないんだからね!

さて、本題です。
(1日 3つも書くと疲れる・・・)

Stack Overflow の最初の通りにやると、@ginnyu-tei さんが書かれている通りです。
これは何故かというと、SystemCでは想定されてない動きになるからです。

  • Elaboration フェーズに戻るパスがない。
  • sc_stopから sc_startに戻るパスがない。

などがあります。
IEEE1666-2011 「Figure 1—Transitions between values returned by sc_get_status」を見てみるといいと思います。

では、Stack Overflow内での解決策はというと、
テストごとに実行オブジェクト作って動かせばいいじゃん!
ってことを言ってます。

そこで、使っているのが

CTest


です。

実際にやった結果が次になります。

テストごとにオブジェクトを生成

main.cpp の中身から作ります。
test_1.cppを例にすると、以下のような感じです。
※「.cxx」が嫌だったので、「.cpp」に書き直してます。

  • test_1.cpp
  • // test_1.cpp
    
    #include "systemc.h"
    #include "gtest/gtest.h"
    
    extern bool sc_main_1();
    
    TEST(systemc_test, test1)
    {
            EXPECT_TRUE(sc_main_1());
    };
    
    int sc_main(int argc, char* argv[])
    {
      std::cout << "Running main() from gtest_main.cc\n";
      testing::InitGoogleTest(&argc, argv);
      RUN_ALL_TESTS();
      return 0;
    
    }
    

ビルド環境を整える

CMake の出番ですね!

  • CMakeLists.txt
  • project(sc_unit_test)
    set(SYSTEMC_HOME /home/kocha/library/systemc/systemc-2.3.0)
    set(TARGET_ARCH linux)
    include_directories(${SYSTEMC_HOME}/include)
    find_library(systemc systemc ${SYSTEMC_HOME}/lib-${TARGET_ARCH})
    link_directories(${SYSTEMC_HOME}/lib-${TARGET_ARCH})
    
    set(GTEST_ROOT /home/kocha/tools/gtest/gtest-1.7.0)
    include_directories(${GTEST_ROOT}/include)
    
    # add_executable(sc_test main.cpp main_1.cpp main_2.cpp)
    # target_link_libraries(sc_test systemc
    #     ${GTEST_ROOT}/build/libgtest.a
    #     ${GTEST_ROOT}/build/libgtest_main.a
    # )
    #
    # enable_testing()
    # add_test(sc_test sc_test)
    
    add_executable(test_1 test_1.cpp main_1.cpp)
    target_link_libraries(test_1 systemc
        ${GTEST_ROOT}/build/libgtest.a
        ${GTEST_ROOT}/build/libgtest_main.a
    )
    
    add_executable(test_2 test_2.cpp main_2.cpp)
    target_link_libraries(test_2 systemc
        ${GTEST_ROOT}/build/libgtest.a
        ${GTEST_ROOT}/build/libgtest_main.a
    )
    
    enable_testing()
    add_test(test_1 test_1)
    add_test(test_2 test_2)

実行

$> cmake .
$> make
$> ctest
Test project /home/kocha/work/tools/gtest/systemc/test
    Start 1: test_1
1/2 Test #1: test_1 ...........................   Passed    0.05 sec
    Start 2: test_2
2/2 Test #2: test_2 ...........................   Passed    0.03 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.09 sec

っということでした。
さて、Stack Overflowで書いてたソースだとこんな感じなのですが、
試してないけど、普通に GoogleTestを使えそうな気がするので
今年のやることリストにいれようっと。

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数