GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_gpiochip.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 93.9% 46 0 49
Functions: 87.5% 7 0 8
Branches: 39.3% 66 0 168
Decisions: 100.0% 4 - 4

Line Branch Decision Exec Source
1 /**
2 * @file test_gpiochip.cpp
3 *
4 * @date Mar 12, 2019
5 */
6
7 #include "pch.h"
8
9 #include "gpio/gpio_ext.h"
10
11 using ::testing::_;
12
13 static int io_state = 0;
14
15 static int initcalls = 0;
16 struct GoodChip : public GpioChip {
17 2 int init() override {
18 2 initcalls++;
19 2 return 0;
20 }
21 };
22
23 class TestChip1 : public GoodChip {
24 2 int readPad(size_t pin) override {
25
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 1 time.
✓ Decision 'false' taken 1 time.
2 if (pin & 0x01)
26 1 return 1;
27 1 return 0;
28 }
29 };
30
31 static TestChip1 testchip1;
32
33 class TestChip2 : public GoodChip {
34 2 int writePad(size_t pin, int value) override {
35
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 1 time.
✓ Decision 'false' taken 1 time.
2 if (value)
36 1 io_state |= (1 << value);
37 else
38 1 io_state &= ~(1 << value);
39
40 2 return 0;
41 }
42 };
43
44 static TestChip2 testchip2;
45
46 static int calls_to_failed_chip = 0;
47 // This chip fails to start
48 class TestChip3 : public GpioChip {
49 int writePad(size_t pin, int value) override {
50 calls_to_failed_chip++;
51 return 0;
52 }
53
54 1 int init() override {
55 1 return -1;
56 }
57 };
58
59 static TestChip3 testchip3;
60
61 4 TEST(gpioext, testGpioExt) {
62 1 int ret;
63 int chip1_base, chip2_base, chip3_base;
64
65
1/1
✓ Branch 1 taken 1 time.
1 printf("====================================================================================== testGpioExt\r\n");
66
67 /* should fail to register chip with zero gpios */
68
2/7
✓ Branch 4 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
1 EXPECT_FALSE(gpiochip_register((brain_pin_e)(BRAIN_PIN_ONCHIP_LAST + 1), "invalid", testchip1, 0) > 0);
69
70 /* should fail to register chip with base overlapig on-chip gpios */
71
2/7
✓ Branch 4 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
1 EXPECT_FALSE(gpiochip_register((brain_pin_e)(BRAIN_PIN_ONCHIP_LAST - 1), "invalid", testchip1, 0) > 0);
72
73
1/1
✓ Branch 2 taken 1 time.
1 chip1_base = gpiochip_register((brain_pin_e)(BRAIN_PIN_ONCHIP_LAST + 1), "input only", testchip1, 16);
74
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE(chip1_base > 0);
75
76
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_EQ(16, gpiochips_get_total_pins());
77
78 /* should fail to register chip overlapping other one */
79
2/7
✓ Branch 5 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
1 EXPECT_FALSE(gpiochip_register((brain_pin_e)(BRAIN_PIN_ONCHIP_LAST + 1 + 15), "output only", testchip2, 16) > 0);
80
81
1/1
✓ Branch 3 taken 1 time.
1 chip2_base = gpiochip_register((brain_pin_e)(BRAIN_PIN_ONCHIP_LAST + 1 + 16), "output only", testchip2, 16);
82
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE(chip2_base > 0);
83
84 /* this chip will fail to init, but should be registered without errors */
85
1/1
✓ Branch 4 taken 1 time.
1 chip3_base = gpiochip_register((brain_pin_e)(BRAIN_PIN_ONCHIP_LAST + 1 + 16 + 16), "failed chip", testchip3, 16);
86
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE(chip2_base > 0);
87
88
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_EQ(48, gpiochips_get_total_pins());
89
90 /* init 3 chips, one will fail */
91
1/1
✓ Branch 1 taken 1 time.
1 ret = gpiochips_init();
92
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(32, ret);
93
94 /* two drivers should be inited */
95
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(2, initcalls);
96
97 /* gpio reads */
98
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(gpiochips_readPad((Gpio)(chip1_base + 0)) == 0);
99
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(gpiochips_readPad((Gpio)(chip1_base + 1)) != 0);
100
101 /* gpio write */
102
1/1
✓ Branch 1 taken 1 time.
1 gpiochips_writePad((Gpio)(chip2_base + 0), 0);
103
1/1
✓ Branch 1 taken 1 time.
1 gpiochips_writePad((Gpio)(chip2_base + 1), 1);
104
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(0x02, io_state);
105
106 /* try to access failed chip */
107
6/13
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 33 taken 1 time.
1 EXPECT_ANY_THROW(gpiochips_writePad((Gpio)(chip3_base + 0), 0));
108
6/13
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 33 taken 1 time.
1 EXPECT_ANY_THROW(gpiochips_writePad((Gpio)(chip3_base + 1), 1));
109
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(0, calls_to_failed_chip);
110
111 // todo: make readPad fail in a similar way?
112
113 /* read/write outside range */
114
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(gpiochips_readPad((Gpio)(chip1_base - 1)) < 0);
115
6/13
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 33 taken 1 time.
1 EXPECT_ANY_THROW(gpiochips_writePad((Gpio)(chip1_base - 1), 1));
116
117
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(gpiochips_readPad((Gpio)(chip3_base + 16)) < 0);
118
6/13
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 33 taken 1 time.
1 EXPECT_ANY_THROW(gpiochips_writePad((Gpio)(chip3_base + 16), 1));
119
120 1 }
121