Repository navigation
Expand file tree
/
Copy pathunit-test-coverage-reusable.yml
More file actions
140 lines (122 loc) · 4.96 KB
/
Copy pathunit-test-coverage-reusable.yml
File metadata and controls
140 lines (122 loc) · 4.96 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
name: Unit Test and Coverage Reusable Workflow
on:
workflow_call:
inputs:
# Optional inputs
app-name:
description: Application name, if different from repo name
type: string
required: false
default: ${{ github.event.repository.name }}
max-missed-branches:
description: Maximum number of missed branches
type: number
required: false
default: 0
max-missed-lines:
description: Maximum number of missed lines
type: number
required: false
default: 0
# Currently CFS apps have at most one dependency, so this only handles one for now
dependency:
description: Additional module/library that this app depends on
type: string
required: false
default: ''
# Force bash to apply pipefail option so pipeline failures aren't masked
defaults:
run:
shell: bash
jobs:
unit-test-coverage:
name: Build, run unit tests and enforce coverage
runs-on: ubuntu-latest
container: ghcr.io/core-flight-system/cfsbuildenv-linux:latest
steps:
- name: Set up environment variables
# Apps typically use lowercase targets and uppercase names, this logic is fragile but works
run: |
echo "APP_UPPER=$(echo ${{ inputs.app-name }} | sed 's/[a-z]/\U&/g')" >> $GITHUB_ENV
echo "APP_LOWER=$(echo ${{ inputs.app-name }} | sed 's/[A-Z]/\L&/g')" >> $GITHUB_ENV
APP_DEP="${{ inputs.dependency }}"
echo "APP_DEP_UPPER=$(echo ${APP_DEP##*/} | sed 's/[a-z]/\U&/g')" >> $GITHUB_ENV
echo "APP_DEP_LOWER=$(echo ${APP_DEP##*/} | sed 's/[A-Z]/\L&/g')" >> $GITHUB_ENV
- name: Checkout CFE
uses: actions/checkout@v6
with:
repository: nasa/cFE
path: cfe
ref: dev
- name: Set up Dependencies
uses: ./cfe/.github/actions/setup-cfe
with:
source-dir: .
preferred-ref: ${{ github.head_ref }}
org: nasa
- name: Checkout Repo
uses: actions/checkout@v6
with:
path: apps/${{ env.APP_LOWER }}
- name: Checkout Dependency
if: ${{ inputs.dependency != '' }}
uses: actions/checkout@v6
with:
repository: ${{ inputs.dependency }}
path: apps/${{ inputs.dependency }}
ref: dev
- name: Set up basic targets.cmake config
run: |
cat > ./sample_defs/targets.cmake << EOF
SET(MISSION_NAME GithubActions)
SET(SPACECRAFT_ID 0x42)
SET(MISSION_CPUNAMES cpu1)
SET(cpu1_PROCESSORID 1)
SET(MISSION_GLOBAL_APPLIST $APP_LOWER)
EOF
- name: Add Dependencies to targets
run: |
if [ "x$APP_DEP_LOWER" != "x" ]
then
echo "LIST(APPEND MISSION_GLOBAL_APPLIST ${APP_DEP_LOWER})" >> ./sample_defs/targets.cmake
fi
cat ./sample_defs/targets.cmake
- name: Make Prep
run: make SIMULATION=native ENABLE_UNIT_TESTS=true OMIT_DEPRECATED=false prep
- name: Build app build dependencies
run: make -C build mission-prebuild
- name: Build app target
run: |
make -C build/native/default_cpu1/apps/$APP_LOWER
- name: Capture initial lcov and run test
run: |
lcov --capture --initial --directory build --output-file coverage_base.info
(cd build/native/default_cpu1/apps/$APP_LOWER; ctest --verbose) | tee test_results.txt
- name: Calculate coverage
run: |
lcov --capture --rc lcov_branch_coverage=1 --directory build --output-file coverage_test.info
lcov --rc lcov_branch_coverage=1 --add-tracefile coverage_base.info --add-tracefile coverage_test.info --output-file coverage_total.info
genhtml coverage_total.info --branch-coverage --output-directory lcov | tee lcov_out.txt
- name: Confirm minimum coverage
run: |
branch_nums=$(grep -A 3 "Overall coverage rate" lcov_out.txt | grep branches | grep -oP "[0-9]+[0-9]*")
line_nums=$(grep -A 3 "Overall coverage rate" lcov_out.txt | grep lines | grep -oP "[0-9]+[0-9]*")
branch_diff=$(echo $branch_nums | awk '{ print $4 - $3 }')
line_diff=$(echo $line_nums | awk '{ print $4 - $3 }')
if [ $branch_diff -gt ${{ inputs.max-missed-branches }} ] || [ $line_diff -gt ${{ inputs.max-missed-lines }} ]
then
grep -A 3 "Overall coverage rate" lcov_out.txt
echo "$branch_diff branches missed, ${{ inputs.max-missed-branches }} allowed"
echo "$line_diff lines missed, ${{ inputs.max-missed-lines }} allowed"
exit -1
fi
- name: Archive results
# Upload if success or failure which supports skipping, unlike always()
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: Unit test and coverage results
path: |
test_results.txt
lcov_out.txt
lcov