3232import org .junit .*;
3333
3434import ghidra .program .database .ProgramBuilder ;
35+ import ghidra .program .model .data .Undefined ;
3536
3637public class AnalysisOptionsDialogTest extends RevEngMockableHeadedIntegrationTest {
3738
3839 public AnalysisOptionsDialogTest () {
3940 super ();
4041 }
4142
43+ /**
44+ * Adds a NOP instruction at the given address so the function isn't filtered
45+ * out by the no-instructions check in FunctionSelectionTableModel.
46+ */
47+ private static void addInstruction (ProgramBuilder builder , String address ) throws Exception {
48+ builder .setBytes (address , "90" );
49+ builder .disassemble (address , 1 );
50+ }
51+
4252 @ Test
4353 public void testBasicOptionsDialog () throws Exception {
4454
4555 var reService = new GhidraRevengService ( new MockApi () {});
4656 var builder = new ProgramBuilder ("mock" , ProgramBuilder ._X64 , this );
4757 // Add some functions to the program so the function selection panel has data
4858 builder .createMemory (".text" , "0x401000" , 0x1000 );
49- builder .createFunction ("0x401000" );
50- builder .createFunction ("0x401100" );
59+ builder .createEmptyFunction ("func1" , "0x401000" , 100 , Undefined .getUndefinedDataType (4 ));
60+ builder .createEmptyFunction ("func2" , "0x401100" , 100 , Undefined .getUndefinedDataType (4 ));
61+ // Add instruction bytes so the functions aren't filtered out by the no-instructions check
62+ addInstruction (builder , "0x401000" );
63+ addInstruction (builder , "0x401100" );
5164
5265 var program = builder .getProgram ();
5366 var tool = env .getTool ();
@@ -83,9 +96,12 @@ public void testDialogHasFunctionSelectionPanel() throws Exception {
8396 var reService = new GhidraRevengService (new MockApi () {});
8497 var builder = new ProgramBuilder ("mock" , ProgramBuilder ._X64 , this );
8598 builder .createMemory (".text" , "0x401000" , 0x1000 );
86- builder .createFunction ("0x401000" );
87- builder .createFunction ("0x401100" );
88- builder .createFunction ("0x401200" );
99+ builder .createEmptyFunction ("func1" , "0x401000" , 100 , Undefined .getUndefinedDataType (4 ));
100+ builder .createEmptyFunction ("func2" , "0x401100" , 100 , Undefined .getUndefinedDataType (4 ));
101+ builder .createEmptyFunction ("func3" , "0x401200" , 100 , Undefined .getUndefinedDataType (4 ));
102+ addInstruction (builder , "0x401000" );
103+ addInstruction (builder , "0x401100" );
104+ addInstruction (builder , "0x401200" );
89105
90106 var program = builder .getProgram ();
91107 var tool = env .getTool ();
@@ -112,8 +128,10 @@ public void testFunctionSelectionDefaultsToNonExternalNonThunk() throws Exceptio
112128 var reService = new GhidraRevengService (new MockApi () {});
113129 var builder = new ProgramBuilder ("mock" , ProgramBuilder ._X64 , this );
114130 builder .createMemory (".text" , "0x401000" , 0x1000 );
115- builder .createFunction ("0x401000" );
116- builder .createFunction ("0x401100" );
131+ builder .createEmptyFunction ("func1" , "0x401000" , 100 , Undefined .getUndefinedDataType (4 ));
132+ builder .createEmptyFunction ("func2" , "0x401100" , 100 , Undefined .getUndefinedDataType (4 ));
133+ addInstruction (builder , "0x401000" );
134+ addInstruction (builder , "0x401100" );
117135 // Create external function (extAddress, libName, functionName)
118136 builder .createExternalFunction (null , "EXTERNAL" , "printf" );
119137
@@ -151,9 +169,12 @@ public void testSelectAllButtonWorksInDialog() throws Exception {
151169 var reService = new GhidraRevengService (new MockApi () {});
152170 var builder = new ProgramBuilder ("mock" , ProgramBuilder ._X64 , this );
153171 builder .createMemory (".text" , "0x401000" , 0x1000 );
154- builder .createFunction ("0x401000" );
155- builder .createFunction ("0x401100" );
156- builder .createFunction ("0x401200" );
172+ builder .createEmptyFunction ("func1" , "0x401000" , 100 , Undefined .getUndefinedDataType (4 ));
173+ builder .createEmptyFunction ("func2" , "0x401100" , 100 , Undefined .getUndefinedDataType (4 ));
174+ builder .createEmptyFunction ("func3" , "0x401200" , 100 , Undefined .getUndefinedDataType (4 ));
175+ addInstruction (builder , "0x401000" );
176+ addInstruction (builder , "0x401100" );
177+ addInstruction (builder , "0x401200" );
157178
158179 var program = builder .getProgram ();
159180 var tool = env .getTool ();
@@ -194,8 +215,10 @@ public void testDeselectAllButtonWorksInDialog() throws Exception {
194215 var reService = new GhidraRevengService (new MockApi () {});
195216 var builder = new ProgramBuilder ("mock" , ProgramBuilder ._X64 , this );
196217 builder .createMemory (".text" , "0x401000" , 0x1000 );
197- builder .createFunction ("0x401000" );
198- builder .createFunction ("0x401100" );
218+ builder .createEmptyFunction ("func1" , "0x401000" , 100 , Undefined .getUndefinedDataType (4 ));
219+ builder .createEmptyFunction ("func2" , "0x401100" , 100 , Undefined .getUndefinedDataType (4 ));
220+ addInstruction (builder , "0x401000" );
221+ addInstruction (builder , "0x401100" );
199222
200223 var program = builder .getProgram ();
201224 var tool = env .getTool ();
@@ -235,9 +258,12 @@ public void testGetOptionsFromUIIncludesSelectedFunctions() throws Exception {
235258 var reService = new GhidraRevengService (new MockApi () {});
236259 var builder = new ProgramBuilder ("mock" , ProgramBuilder ._X64 , this );
237260 builder .createMemory (".text" , "0x401000" , 0x1000 );
238- builder .createFunction ("0x401000" );
239- builder .createFunction ("0x401100" );
240- builder .createFunction ("0x401200" );
261+ builder .createEmptyFunction ("func1" , "0x401000" , 100 , Undefined .getUndefinedDataType (4 ));
262+ builder .createEmptyFunction ("func2" , "0x401100" , 100 , Undefined .getUndefinedDataType (4 ));
263+ builder .createEmptyFunction ("func3" , "0x401200" , 100 , Undefined .getUndefinedDataType (4 ));
264+ addInstruction (builder , "0x401000" );
265+ addInstruction (builder , "0x401100" );
266+ addInstruction (builder , "0x401200" );
241267
242268 var program = builder .getProgram ();
243269 var tool = env .getTool ();
0 commit comments