Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Godot regression test project

This repository contains project which is used to find regressions in Godot.

It aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.

Basic Informations

This project contains a few different scenes and Start.tscn(default one) which opens every other scene.

List of this scenes are available in Autoload.gd file.

B

It is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - godot 40.

At first all_in_one scenes opens, execute _ready function and exit.

The available time(default 25s) is divided equally between each scene in alone_steps.

Then, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the alone_steps takes its place.

This project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(scons use_asan=yes use_ubsan=yes) so without these options it won't always be possible to detect the bug or get so detailed backtrace.

Searching for a malfunctioning scene

Logs

When searching through the logs for the error you may come across something like this

Changed scene to res://Rendering/Lights2D/Lights2D.tscn
Test is running now 35 seconds
Test is running now 40 seconds
Changed scene to res://Rendering/Lights3D/Lights3D.tscn
##### CRASH #####
Godot crashed with signal ...

This log indicates 2 potentially broken scenes

  • Lights3D.tscn - crash occured because scene started work
  • Lights2D.tscn - crash occured because scene was removed

Autoload

You can freely comment out selected lines in alone_steps or all_in_one to choose which scenes will run Start.tscn.
You can also use time_to_show variable to set time how long the project will run.

Autoloads

File System

The last way is to manually run each scene from the file system to find the one malfunctioning.

File

"Safe" fuzzer

A scene that will probably give people a hard time quite often is FunctionExecutor.tscn.
This is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).
When the engine crashes, in logs usually will be something like this:

#################### LineEdit ####################
LineEdit._text_changed --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._text_changed()
LineEdit._toggle_draw_caret --- executing with 0 parameters []
GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()
LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)
ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.
scene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

There are some interesting things to discuss here.
This line shows what class we are testing now

#################### LineEdit ####################

which method

LineEdit.set_align

and which parameters

--- executing with 1 parameters [100]

Next you can see GDScript command which is executed and you can copy it and test manually in Godot

GDSCRIPT CODE: LineEdit.new()._toggle_draw_caret()

Then you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.

ERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).
At: scene/gui/line_edit.cpp:592.

At the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:

scene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'
handle_crash: Program crashed with signal 11
Dumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues
[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)

In most situations, the latest executed function/created object is responsible for crash

LineEdit.set_align --- executing with 1 parameters [100]
GDSCRIPT CODE: LineEdit.new().set_align(100)

So we can just take GDScript code from above, copy it into Godot and test project, which should crash engine

LineEdit.new().set_align(100)

Nodes

Scene simply adds and removes at once all available nodes.
It is used to catch early very obvious and easy to reproduce bugs.

ReparentingDeleting

This is more advanced variation of Nodes scene.
In random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.

CreatingAllThings

This scene creates, prints and removes object.
Can be used to quicly check if classes don't crash when executing simple commands on them.

Others

Scenes like Physics2D.tscn or Lights3D.tscn are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.

Physics

Epilepsy Warning

Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.

Problems with project

The project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. TYPE_INT or changes in GDScript(e.g. changing instance to instantiate) can mess it up.

About

Godot engine regression test project

Resources

Code of conduct

Security policy

Stars

24 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages