Merge pull request #8440 from opentx/raphaelcoeffic/gtests-asan

2.4: gtests asan + re-addded LCD tests
This commit is contained in:
Bertrand Songis
2021-04-16 09:47:14 +02:00
committed by GitHub
18 changed files with 1968 additions and 186 deletions
+1 -1
View File
@@ -47,7 +47,7 @@ before_install:
- sudo ln -sf /usr/bin/python3 /usr/bin/python
- python3 -m pip install pip==20.3.3
- sudo apt-get install python3-setuptools
- python3 -m pip install pillow clang
- python3 -m pip install pillow==7.2.0 clang
script:
- ./tools/commit-tests.sh
+23
View File
@@ -0,0 +1,23 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#pragma once
void loadFonts();
+2 -2
View File
@@ -9,8 +9,8 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND)
set(TESTS_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR})
configure_file(${RADIO_SRC_DIR}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_DEBUG} -O0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_DEBUG} -O0 -fsanitize=address")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS} -fsanitize=address")
use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1
if(PCB STREQUAL X12S OR PCB STREQUAL X10)
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

+252
View File
@@ -0,0 +1,252 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <math.h>
#include <gtest/gtest.h>
#define SWAP_DEFINED
#include "opentx.h"
#include "location.h"
#if defined(COLORLCD)
#include "gui/colorlcd/fonts.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
void convert_RGB565_to_RGB888(uint8_t * dst, const uint16_t * src, unsigned pixels)
{
while(pixels--) {
RGB_SPLIT(*src, r, g, b); src++;
*(dst++) = (uint8_t)(r << 3);
*(dst++) = (uint8_t)(g << 2);
*(dst++) = (uint8_t)(b << 3);
}
}
void dumpImage(const std::string& filename, const BitmapBuffer* dc)
{
std::string fullpath = TESTS_PATH "/failed_" + filename;
TRACE("dumping image '%s'", fullpath.c_str());
// allocate enough for 3 channels
auto pixels = dc->width() * dc->height();
auto stride = dc->width() * 3;
uint8_t * img = (uint8_t *)malloc(pixels * 3);
convert_RGB565_to_RGB888(img, dc->getPixelPtr(0,0), pixels);
stbi_write_png(fullpath.c_str(), dc->width(), dc->height(), 3, img, stride);
free(img);
}
bool checkScreenshot_colorlcd(const BitmapBuffer* dc, const char* test)
{
if (dc->width() != LCD_W || dc->height() != LCD_H) {
return false;
}
std::string filename = std::string(test);
filename += '_' + std::to_string(LCD_W);
filename += 'x' + std::to_string(LCD_H);
filename += ".png";
std::string fullpath = TESTS_PATH "/" + filename;
std::unique_ptr<BitmapBuffer> testPict(BitmapBuffer::loadBitmap(fullpath.c_str()));
if (!testPict || testPict->width() != LCD_W || testPict->height() != LCD_H) {
dumpImage(filename, dc);
return false;
}
auto testPtr = testPict->getPixelPtr(0,0);
auto dcPtr = dc->getPixelPtr(0,0);
for (int i=0; i<LCD_W*LCD_H; i++) {
if (testPtr[i] != dcPtr[i]) {
dumpImage(filename, dc);
return false;
}
}
return true;
}
TEST(Lcd_colorlcd, vline)
{
loadFonts();
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
dc.clear(DEFAULT_BGCOLOR);
for (int x=0; x<100; x+=2) {
dc.drawSolidVerticalLine(x, x/2, 12, DEFAULT_COLOR);
}
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "vline"));
}
TEST(Lcd_colorlcd, primitives)
{
loadFonts();
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
dc.clear(DEFAULT_BGCOLOR);
dc.drawText(8, 8, "The quick brown fox jumps over the lazy dog", DISABLE_COLOR);
dc.drawText(5, 5, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR);
dc.drawFilledRect(10, 30, 30, 30, SOLID, TITLE_BGCOLOR);
dc.drawFilledRect(50, 30, 30, 30, DOTTED, DEFAULT_COLOR);
dc.drawRect(90, 30, 30, 30, 1, SOLID, TITLE_BGCOLOR);
dc.drawRect(130, 30, 30, 30, 2, SOLID, TITLE_BGCOLOR);
dc.drawRect(170, 30, 30, 30, 5, SOLID, TITLE_BGCOLOR);
dc.drawVerticalLine(10, 70, 100, SOLID, TITLE_BGCOLOR);
dc.drawVerticalLine(15, 70, 90, SOLID, TITLE_BGCOLOR);
dc.drawVerticalLine(20, 70, 80, SOLID, TITLE_BGCOLOR);
dc.drawVerticalLine(25, 70, 70, SOLID, TITLE_BGCOLOR);
dc.drawHorizontalLine(30, 70, 100, SOLID, DEFAULT_COLOR);
dc.drawHorizontalLine(30, 75, 90, SOLID, DEFAULT_COLOR);
dc.drawHorizontalLine(30, 80, 80, SOLID, DEFAULT_COLOR);
dc.drawHorizontalLine(30, 85, 70, SOLID, DEFAULT_COLOR);
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "primitives_" TRANSLATIONS));
}
TEST(Lcd_colorlcd, transparency)
{
loadFonts();
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
dc.clear(DEFAULT_BGCOLOR);
dc.drawText(8, 8, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(4));
dc.drawText(5, 5, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(12));
dc.drawFilledRect(10, 30, 30, 30, SOLID, TITLE_BGCOLOR|OPACITY(8));
dc.drawFilledRect(50, 30, 30, 30, DOTTED, DEFAULT_COLOR|OPACITY(10));
dc.drawRect(90, 30, 30, 30, 1, SOLID, TITLE_BGCOLOR|OPACITY(8));
dc.drawRect(130, 30, 30, 30, 2, SOLID, TITLE_BGCOLOR|OPACITY(8));
dc.drawRect(170, 30, 30, 30, 5, SOLID, TITLE_BGCOLOR|OPACITY(8));
dc.drawVerticalLine(10, 70, 100, SOLID, TITLE_BGCOLOR|OPACITY(2));
dc.drawVerticalLine(15, 70, 90, SOLID, TITLE_BGCOLOR|OPACITY(6));
dc.drawVerticalLine(20, 70, 80, SOLID, TITLE_BGCOLOR|OPACITY(10));
dc.drawVerticalLine(25, 70, 70, SOLID, TITLE_BGCOLOR|OPACITY(OPACITY_MAX));
dc.drawHorizontalLine(30, 70, 100, SOLID, DEFAULT_COLOR|OPACITY(2));
dc.drawHorizontalLine(30, 75, 90, SOLID, DEFAULT_COLOR|OPACITY(6));
dc.drawHorizontalLine(30, 80, 80, SOLID, DEFAULT_COLOR|OPACITY(10));
dc.drawHorizontalLine(30, 85, 70, SOLID, DEFAULT_COLOR|OPACITY(OPACITY_MAX));
for(int n=0; n<10; n++) {
int x = 120 + n * 20;
int y = 80 + n * 10;
int color = COLOR(n/2 + 5);
int size = 100;
dc.drawFilledRect(x, y, size, size, SOLID, color|OPACITY(8));
}
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "transparency_" TRANSLATIONS));
}
//
// Fonts test are disabled, as they cause
// too much trouble (font are generated and never
// really the same based on which software / radio
// combination.
//
#if 0
TEST(Lcd_colorlcd, fonts)
{
loadFonts();
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
dc.clear(DEFAULT_BGCOLOR);
dc.drawText(8, 8, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(4));
dc.drawText(5, 5, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(12));
dc.drawText(10, 200, "The quick", DEFAULT_COLOR|VERTICAL);
dc.drawText(30, 200, "The quick brown fox", DEFAULT_COLOR|VERTICAL);
dc.drawText(50, 25, "The quick", DEFAULT_COLOR | FONT(XXS));
dc.drawText(50, 40, "The quick", DEFAULT_COLOR | FONT(XS));
dc.drawText(50, 55, "The quick", DEFAULT_COLOR | FONT(L));
dc.drawText(50, 80, "The quick", DEFAULT_COLOR | FONT(XL));
dc.drawText(50, 120, "The quick", DEFAULT_COLOR | FONT(XXL));
dc.drawText(8, 208, "The quick brown fox jumps over the lazy dog", TITLE_BGCOLOR|OPACITY(4));
dc.drawText(5, 205, "The quick brown fox jumps over the lazy dog", TITLE_BGCOLOR|OPACITY(12));
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "fonts_" TRANSLATIONS));
}
#endif
TEST(Lcd_colorlcd, clipping)
{
loadFonts();
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
dc.clear(DEFAULT_BGCOLOR);
dc.drawSolidVerticalLine(100, 0, LCD_H, DEFAULT_COLOR);
dc.drawSolidVerticalLine(400, 0, LCD_H, DEFAULT_COLOR);
dc.drawSolidHorizontalLine(0, 50, LCD_W, DEFAULT_COLOR);
dc.drawSolidHorizontalLine(0, 200, LCD_W, DEFAULT_COLOR);
dc.setClippingRect(100, 400, 50, 200);
dc.drawSolidHorizontalLine(0, 80, LCD_W, TITLE_BGCOLOR);
dc.drawHorizontalLine( 0, 81, LCD_W, SOLID, TITLE_BGCOLOR);
dc.drawSolidVerticalLine(150, 0, LCD_H, TITLE_BGCOLOR);
dc.drawVerticalLine( 151, 0, LCD_H, SOLID, TITLE_BGCOLOR);
dc.drawSolidRect(70, 20, 50, 50, 2, TITLE_BGCOLOR);
dc.drawRect( 380, 20, 50, 50, 2, SOLID, TITLE_BGCOLOR);
dc.clearClippingRect();
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "clipping"));
}
TEST(Lcd_colorlcd, bitmap)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
dc.clear(DEFAULT_BGCOLOR);
dc.setClippingRect(100, 400, 50, 200);
std::unique_ptr<BitmapBuffer> bmp(BitmapBuffer::loadBitmap(TESTS_PATH "/opentx.png"));
dc.drawBitmap( 0, 0, bmp.get());
dc.drawBitmap(320, 0, bmp.get());
dc.drawBitmap( 0, 150, bmp.get());
dc.clearClippingRect();
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "bitmap"));
}
#endif
-183
View File
@@ -1,183 +0,0 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <QtCore/QDir>
#include <QtCore/QDebug>
#include <QApplication>
#include <QPainter>
#include <math.h>
#include <gtest/gtest.h>
#define SWAP_DEFINED
#include "opentx.h"
#include "location.h"
#include "targets/simu/simulcd.h"
#if defined(COLORLCD)
void doPaint_colorlcd(QPainter & p)
{
QRgb rgb = qRgb(0, 0, 0);
p.setBackground(QBrush(rgb));
p.eraseRect(0, 0, LCD_W, LCD_H);
uint16_t previousColor = 0xFF;
for (int y=0; y<LCD_H; y++) {
for (int x=0; x<LCD_W; x++) {
#if defined(LCD_VERTICAL_INVERT)
uint16_t color = simuLcdBuf[(LCD_W-1-x)+LCD_W*(LCD_H-1-y)]; // color in RGB565
#else
uint16_t color = simuLcdBuf[x+LCD_W*y]; // color in RGB565
#endif
if (color) {
if (color != previousColor) {
previousColor = color;
RGB_SPLIT(color, r, g, b);
rgb = qRgb(r<<3, g<<2, b<<3);
p.setPen(rgb);
p.setBrush(QBrush(rgb));
}
p.drawPoint(x, y);
}
}
}
}
bool checkScreenshot_colorlcd(const QString & test)
{
lcdRefresh();
QImage buffer(LCD_W, LCD_H, QImage::Format_RGB32);
QPainter p(&buffer);
doPaint_colorlcd(p);
QString filename(QString("%1_%2x%3.png").arg(test).arg(LCD_W).arg(LCD_H));
QImage reference(TESTS_PATH "/" + filename);
if (buffer == reference) {
return true;
}
else {
QString filename(QString("%1_%2x%3.png").arg(test).arg(LCD_W).arg(LCD_H));
buffer.save("/tmp/" + filename);
return false;
}
}
TEST(Lcd_colorlcd, vline)
{
loadFonts();
lcd->clear(DEFAULT_BGCOLOR);
for (int x=0; x<100; x+=2) {
lcdDrawSolidVerticalLine(x, x/2, 12, DEFAULT_COLOR);
}
EXPECT_TRUE(checkScreenshot_colorlcd("vline"));
}
TEST(Lcd_colorlcd, primitives)
{
loadFonts();
lcd->clear(DEFAULT_BGCOLOR);
lcdDrawText(8, 8, "The quick brown fox jumps over the lazy dog", DISABLE_COLOR);
lcdDrawText(5, 5, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR);
lcdDrawFilledRect(10, 30, 30, 30, SOLID, TITLE_BGCOLOR);
lcdDrawFilledRect(50, 30, 30, 30, DOTTED, DEFAULT_COLOR);
lcdDrawFilledRect(90, 30, 30, 30, SOLID, ROUND|TITLE_BGCOLOR);
lcdDrawRect(130, 30, 30, 30, 1, SOLID, TITLE_BGCOLOR);
lcdDrawRect(170, 30, 30, 30, 2, SOLID, TITLE_BGCOLOR);
lcdDrawRect(210, 30, 30, 30, 5, SOLID, TITLE_BGCOLOR);
lcdDrawVerticalLine(10, 70, 100, SOLID, TITLE_BGCOLOR);
lcdDrawVerticalLine(15, 70, 90, SOLID, TITLE_BGCOLOR);
lcdDrawVerticalLine(20, 70, 80, SOLID, TITLE_BGCOLOR);
lcdDrawVerticalLine(25, 70, 70, SOLID, TITLE_BGCOLOR);
lcdDrawHorizontalLine(30, 70, 100, SOLID, DEFAULT_COLOR);
lcdDrawHorizontalLine(30, 75, 90, SOLID, DEFAULT_COLOR);
lcdDrawHorizontalLine(30, 80, 80, SOLID, DEFAULT_COLOR);
lcdDrawHorizontalLine(30, 85, 70, SOLID, DEFAULT_COLOR);
EXPECT_TRUE(checkScreenshot_colorlcd("primitives"));
}
TEST(Lcd_colorlcd, transparency)
{
loadFonts();
lcd->clear(DEFAULT_BGCOLOR);
lcdDrawText(8, 8, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(4));
lcdDrawText(5, 5, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(12));
lcdDrawFilledRect(10, 30, 30, 30, SOLID, TITLE_BGCOLOR|OPACITY(8));
lcdDrawFilledRect(50, 30, 30, 30, DOTTED, DEFAULT_COLOR|OPACITY(10));
lcdDrawFilledRect(90, 30, 30, 30, SOLID, ROUND|TITLE_BGCOLOR|OPACITY(12));
lcdDrawRect(130, 30, 30, 30, 1, SOLID, TITLE_BGCOLOR|OPACITY(8));
lcdDrawRect(170, 30, 30, 30, 2, SOLID, TITLE_BGCOLOR|OPACITY(8));
lcdDrawRect(210, 30, 30, 30, 5, SOLID, TITLE_BGCOLOR|OPACITY(8));
lcdDrawVerticalLine(10, 70, 100, SOLID, TITLE_BGCOLOR|OPACITY(2));
lcdDrawVerticalLine(15, 70, 90, SOLID, TITLE_BGCOLOR|OPACITY(6));
lcdDrawVerticalLine(20, 70, 80, SOLID, TITLE_BGCOLOR|OPACITY(10));
lcdDrawVerticalLine(25, 70, 70, SOLID, TITLE_BGCOLOR|OPACITY(OPACITY_MAX));
lcdDrawHorizontalLine(30, 70, 100, SOLID, DEFAULT_COLOR|OPACITY(2));
lcdDrawHorizontalLine(30, 75, 90, SOLID, DEFAULT_COLOR|OPACITY(6));
lcdDrawHorizontalLine(30, 80, 80, SOLID, DEFAULT_COLOR|OPACITY(10));
lcdDrawHorizontalLine(30, 85, 70, SOLID, DEFAULT_COLOR|OPACITY(OPACITY_MAX));
for(int n=0; n<10; n++) {
int x = 120 + n * 20;
int y = 80 + n * 10;
int color = COLOR(n/2 + 5);
int size = 100;
lcdDrawFilledRect(x, y, size, size, SOLID, color|OPACITY(8));
}
EXPECT_TRUE(checkScreenshot_colorlcd("transparency"));
}
TEST(Lcd_colorlcd, fonts)
{
loadFonts();
lcd->clear(DEFAULT_BGCOLOR);
lcdDrawText(8, 8, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(4));
lcdDrawText(5, 5, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|OPACITY(12));
lcdDrawText(10, 200, "The quick", DEFAULT_COLOR|VERTICAL);
lcdDrawText(30, 200, "The quick brown fox", DEFAULT_COLOR|VERTICAL);
// lcdDrawText(50, 200, "The quick brown fox jumps over the lazy dog", DEFAULT_COLOR|VERTICAL);
lcdDrawText(50, 25, "The quick", TEXT_COLOR|TINSIZE);
lcdDrawText(50, 40, "The quick", TEXT_COLOR|SMLSIZE);
lcdDrawText(50, 55, "The quick", TEXT_COLOR|MIDSIZE);
lcdDrawText(50, 80, "The quick", TEXT_COLOR|DBLSIZE);
lcdDrawText(50, 120, "The quick", TEXT_COLOR|XXLSIZE);
lcdDrawText(8, 208, "The quick brown fox jumps over the lazy dog", TITLE_BGCOLOR|OPACITY(4));
lcdDrawText(5, 205, "The quick brown fox jumps over the lazy dog", TITLE_BGCOLOR|OPACITY(12));
EXPECT_TRUE(checkScreenshot_colorlcd("fonts"));
}
#endif
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB