Skip to content

Commit cbde8c8

Browse files
authored
Merge pull request #2 from KatLab-MiyazakiUniv/ticket-KL25-7
#KL25-7 GoogleTest環境とCI環境の構築
2 parents 596ccef + ad10b49 commit cbde8c8

File tree

11 files changed

+377
-0
lines changed

11 files changed

+377
-0
lines changed

.github/workflows/build-check.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Build Check
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
build:
7+
runs-on: ubuntu-22.04
8+
steps:
9+
- name: Checkout code
10+
uses: actions/checkout@v4
11+
12+
- name: Set up QEMU
13+
uses: docker/setup-qemu-action@v2
14+
15+
- name: Set up Docker Buildx
16+
uses: docker/setup-buildx-action@v2
17+
18+
# イメージのビルドは時間がかかるため,事前にビルドしたものをpullしてくる
19+
# https://hub.docker.com/r/chihayataku/kat_etrobo2025
20+
- name: Pull Docker image
21+
run: |
22+
docker pull chihayataku/kat_etrobo2025:arm64
23+
24+
- name: Run build in container
25+
run: |
26+
docker run --rm -v $(pwd):/RasPike-ART/sdk/workspace/etrobocon2025 chihayataku/kat_etrobo2025:arm64 \
27+
bash -c "cd /RasPike-ART/sdk/workspace/etrobocon2025 && make build"
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: Format Check
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
format-check:
7+
runs-on: ubuntu-22.04
8+
9+
steps:
10+
- name: Checkout code
11+
uses: actions/checkout@v4
12+
13+
- name: Install clang-format
14+
run: sudo apt-get update && sudo apt-get install -y clang-format
15+
16+
- name: Run clang-format check
17+
run: |
18+
find ./ ./tests ./modules -type f \( -name "*.cpp" -o -name "*.h" \) \
19+
| xargs clang-format --dry-run --Werror

.github/workflows/test.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: Run Tests
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
test:
7+
runs-on: ubuntu-22.04
8+
steps:
9+
- name: Checkout code
10+
uses: actions/checkout@v4
11+
12+
# - name: Set up Docker Buildx
13+
# uses: docker/setup-buildx-action@v2
14+
15+
# - name: Build Docker image
16+
# run: docker buildx build --platform linux/arm64 --load -t myimage:arm64 .
17+
18+
# - name: Run tests in container
19+
# run: |
20+
# docker run --rm -v $(pwd):/RasPike-ART/sdk/workspace/etrobocon2025 myimage:arm64 \
21+
# bash -c "cd /RasPike-ART/sdk/workspace/etrobocon2025 && make test"
22+
23+
# 今のところはコンテナを使わずに直接実行する.
24+
# もしコンテナによるテスト実施が可能であれば,
25+
# これをコメントアウトして,以上を有効化する.
26+
- name: Run tests
27+
run: |
28+
make test

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# ディレクトリ
2+
bin

CMakeLists.txt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# GoogleTest用のCMakeLists.txt
2+
cmake_minimum_required(VERSION 3.14)
3+
project(etrobocon2025)
4+
5+
# C++標準とカバレッジ用フラグ
6+
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
8+
set(CMAKE_CXX_EXTENSIONS OFF)
9+
10+
# デバッグビルド用のフラグ
11+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
12+
13+
# カバレッジレポート作成のオプション
14+
option(ENABLE_COVERAGE "Enable test coverage reporting" ON)
15+
if(ENABLE_COVERAGE)
16+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
17+
endif()
18+
19+
# GoogleTest のフェッチとビルド
20+
include(FetchContent)
21+
FetchContent_Declare(
22+
googletest
23+
URL https://github.com/google/googletest/archive/refs/tags/v1.16.0.zip
24+
)
25+
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
26+
FetchContent_MakeAvailable(googletest)
27+
28+
# プロジェクトのソースディレクトリ構造の定義 (適宜登録)
29+
set(PROJECT_MODULE_DIR ${PROJECT_SOURCE_DIR}/modules)
30+
set(PROJECT_TEST_DIR ${PROJECT_SOURCE_DIR}/tests)
31+
32+
# 必要なインクルードディレクトリの設定 (適宜登録)
33+
set(INCLUDE_DIRS
34+
${PROJECT_MODULE_DIR}
35+
${PROJECT_TEST_DIR}/helpers
36+
)
37+
38+
# ソースファイルの登録 (適宜登録)
39+
file(GLOB_RECURSE PROJECT_SOURCES
40+
"${PROJECT_MODULE_DIR}/*.cpp"
41+
"${PROJECT_TEST_DIR}/helpers/*.cpp"
42+
)
43+
44+
# プロジェクトのライブラリターゲットを作成
45+
add_library(${PROJECT_NAME}_impl STATIC ${PROJECT_SOURCES})
46+
target_include_directories(${PROJECT_NAME}_impl PUBLIC ${INCLUDE_DIRS})
47+
48+
# テスト設定
49+
enable_testing()
50+
51+
# tests ディレクトリ内の *Test.cpp をすべてテストソースとして登録
52+
file(GLOB TEST_SOURCES "${PROJECT_TEST_DIR}/*Test.cpp")
53+
54+
# テスト実行可能ファイルの作成
55+
add_executable(${PROJECT_NAME}_test ${TEST_SOURCES})
56+
target_link_libraries(${PROJECT_NAME}_test
57+
PRIVATE
58+
${PROJECT_NAME}_impl
59+
gtest_main
60+
)
61+
62+
# テストの登録
63+
include(GoogleTest)
64+
gtest_discover_tests(${PROJECT_NAME}_test)

Dockerfile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# 実機と同じ環境( bookworm AArch64)を構築するためのDockerfile
2+
FROM debian:bookworm
3+
4+
# 必要なパッケージをインストール
5+
RUN apt-get update && apt-get install -y \
6+
build-essential \
7+
ruby \
8+
git \
9+
cmake \
10+
sudo \
11+
&& gem install shell \
12+
&& apt-get clean && rm -rf /var/lib/apt/lists/*
13+
14+
# ビルド時に日本語が含まれていたらエラーになるので,C.UTF-8を指定
15+
ENV LANG=C.UTF-8
16+
17+
# RasPike-ART を clone
18+
# libraspike-artは,RasPike-ART内で運営がリンクで紐づけていたため,直接cloneする必要がある
19+
RUN git clone https://github.com/ETrobocon/RasPike-ART.git /RasPike-ART \
20+
&& git clone https://github.com/ETrobocon/libraspike-art.git /RasPike-ART/libraspike-art
21+
22+
# 作業ディレクトリを/RasPike-ART/sdk/workspace/etrobocon2025に設定
23+
WORKDIR /RasPike-ART/sdk/workspace/etrobocon2025

Makefile

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ help:
1212
@echo " $$ make format"
1313
@echo フォーマットチェックをする
1414
@echo " $$ make format-check"
15+
@echo テストをビルドする
16+
@echo " $$ make test-build"
17+
@echo テストを実行する
18+
@echo " $$ make test-exec"
19+
@echo テスト用の'build'ディレクトリを削除する
20+
@echo " $$ make clean"
21+
@echo 環境が変わっている場合のみ build ディレクトリを削除する
22+
@echo " $$ make smart-clean"
23+
@echo 必要があればbuildディレクトリを削除し, テストをビルドして実行する
24+
@echo " $$ make test"
1525

1626
## 実行関連 ##
1727
build:
@@ -21,6 +31,57 @@ build:
2131
start:
2232
cd $(MAKEFILE_PATH)../ && make start
2333

34+
## テスト関連 ##
35+
# テストのビルドディレクトリが存在しない場合は作成する
36+
test-build:
37+
@mkdir -p $(MAKEFILE_PATH)bin/build
38+
cd $(MAKEFILE_PATH)bin/build && cmake ../.. && make
39+
40+
# テストを実行する
41+
test-exec:
42+
@if [ ! -f $(MAKEFILE_PATH)bin/build/etrobocon2025_test ]; then \
43+
echo "テスト実行ファイルが見つかりません。まずビルドを実行してください。"; \
44+
echo " $$ make test-build"; \
45+
exit 1; \
46+
fi
47+
cd $(MAKEFILE_PATH)bin/build && ./etrobocon2025_test
48+
49+
# テストをビルドして実行する
50+
test: smart-clean test-build test-exec
51+
52+
# build ディレクトリを完全に削除する
53+
clean:
54+
@if [ -d $(MAKEFILE_PATH)bin/build ]; then \
55+
rm -rf $(MAKEFILE_PATH)bin/build; \
56+
echo "'build/' ディレクトリを削除しました。"; \
57+
else \
58+
echo "'build/' ディレクトリは既に存在しません。"; \
59+
fi
60+
61+
# 実行環境が変更されている場合にのみ 'build' を削除する
62+
smart-clean:
63+
@if [ -d $(MAKEFILE_PATH)bin/build ]; then \
64+
if [ -f "$(MAKEFILE_PATH)bin/build/Makefile" ]; then \
65+
CMAKE_SOURCE_DIR=`grep -E "^CMAKE_SOURCE_DIR[[:space:]]*=" $(MAKEFILE_PATH)bin/build/Makefile | cut -d= -f2 | xargs`; \
66+
CMAKE_SOURCE_DIR_REAL=`readlink -f "$$CMAKE_SOURCE_DIR"`; \
67+
CURRENT_DIR_REAL=`readlink -f "$$(pwd)"`; \
68+
echo "[DEBUG] CMAKE_SOURCE_DIR: '$$CMAKE_SOURCE_DIR_REAL'"; \
69+
echo "[DEBUG] CURRENT_DIR : '$$CURRENT_DIR_REAL'"; \
70+
if [ "$$CMAKE_SOURCE_DIR_REAL" != "$$CURRENT_DIR_REAL" ]; then \
71+
echo "[LOG] 実行環境の変更が検出されたため 'build' を削除します。"; \
72+
rm -rf $(MAKEFILE_PATH)bin/build; \
73+
else \
74+
echo "[LOG] 実行環境は変更されていません。"; \
75+
fi; \
76+
else \
77+
echo "[LOG] 'build/Makefile' が存在しません。"; \
78+
echo "[LOG] 'buildディレクトリを完全削除します。"; \
79+
make clean; \
80+
fi; \
81+
else \
82+
echo "'build' ディレクトリは既に存在しません。"; \
83+
fi
84+
2485
## 開発関連 ##
2586
# ファイルにclang-formatを適用する
2687
format:

README.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,64 @@
11
# etrobocon2025
22

33
宮崎大学片山徹郎研究室チーム KatLab が作成する[ET ロボコン 2025](https://www.etrobo.jp/)アドバンストクラスの走行システムプログラムです。
4+
5+
## 構成
6+
### ./modules
7+
ソースファイルを格納
8+
### ./tests
9+
テストソースを格納
10+
11+
## プロジェクトのビルド
12+
### 実機の場合
13+
```etrobocon2025```で以下を実行
14+
```shell
15+
make build
16+
```
17+
### 実機以外の場合
18+
etrobo環境でビルドが出来ないため,現状 (20250502) ではこの方法を考えています.
19+
etrobo環境でのビルドが出来ることにきづいた?できるようになった?ので,etrobo環境でのビルドの仕方も追記します( 20250505 ).
20+
#### etrobo環境( 速いため,こちらを推奨 )
21+
```~/etrobo/raspike-athrill-v850e2m/sdk/workspace/etrobocon2025```で以下を実行
22+
```shell
23+
make build
24+
```
25+
26+
27+
#### Docker仮想環境
28+
```etrobocon2025```で以下を順に実行
29+
1. (まだの場合は)bookworm環境のイメージを以下のコマンドで作成
30+
```shell
31+
docker buildx build --platform linux/arm64 -t kat_etrobo2025:arm64 .
32+
```
33+
2. コンテナ作成と起動
34+
```shell
35+
docker run -it --rm -v $(pwd):/RasPike-ART/sdk/workspace/etrobocon2025 kat_etrobo2025:arm64 bash
36+
```
37+
もし,ファイル保存などの権限問題に引っかかったら,以下のコマンドでUIDとGIDを確認し,
38+
```shell
39+
id -u
40+
```
41+
```shell
42+
id -g
43+
```
44+
その番号でそれぞれ,以下のコマンドのUIDとGIDを置き換えて実行してみてください
45+
```shell
46+
docker run -it --rm --user UID:GID -v $(pwd):/RasPike-ART/sdk/workspace/etrobocon2025 kat_etrobo2025:arm64 bash
47+
```
48+
49+
3. プロジェクトのビルド
50+
```shell
51+
make build
52+
```
53+
54+
## テスト
55+
```etrobocon2025```で以下を実行
56+
```shell
57+
make test
58+
```
59+
もしくは,```etrobocon2025```で以下を実行
60+
```shell
61+
make smart-clean
62+
make test-build
63+
make test-exec
64+
```

tests/EtRobocon2025Test.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @file EtRobocon2025Test.cpp
3+
* @brief EtRobocon2025クラスのテスト
4+
* @author takuchi17
5+
*/
6+
7+
#include <gtest/gtest.h>
8+
#include "EtRobocon2025.h"
9+
#include "helpers/OStreamCapture.h"
10+
11+
using namespace std;
12+
13+
namespace etrobocon2025_test {
14+
// start関数が最終的に標準出力に"Hello KATLAB"を出力することを確認するテスト
15+
TEST(EtRobocon2025Test, Start)
16+
{
17+
string expected = "Hello KATLAB\n";
18+
19+
// 標準出力をキャプチャ
20+
OStreamCapture capture(cout);
21+
22+
// start関数を実行
23+
EtRobocon2025::start();
24+
25+
EXPECT_EQ(expected, capture.getOutput());
26+
}
27+
} // namespace etrobocon2025_test

tests/helpers/OStreamCapture.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @file OStreamCapture.cpp
3+
* @brief C++ストリームをキャプチャするためのヘルパークラスの実装
4+
* @author takuchi17
5+
*/
6+
7+
#include "OStreamCapture.h"
8+
9+
OStreamCapture::OStreamCapture(ostream& _targetStream)
10+
: targetStream(_targetStream), originalBuf(_targetStream.rdbuf())
11+
{
12+
targetStream.rdbuf(buffer.rdbuf());
13+
}
14+
15+
OStreamCapture::~OStreamCapture()
16+
{
17+
targetStream.rdbuf(originalBuf);
18+
}
19+
20+
string OStreamCapture::getOutput() const
21+
{
22+
return buffer.str();
23+
}

0 commit comments

Comments
 (0)