Skip to content

Commit b21ca34

Browse files
Berry stack size test - part 1
1 parent dc6ced4 commit b21ca34

File tree

2 files changed

+67
-16
lines changed

2 files changed

+67
-16
lines changed

src/cmnds/cmd_berry.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,13 @@ void Berry_StopScripts(int id) {
463463
t = t->next;
464464
}
465465
}
466+
int Berry_GetStackSize() {
467+
if (g_vm) {
468+
int size = g_vm->stacktop - g_vm->stack; /* with debug enabled, stack increase may be negative */
469+
return size;
470+
}
471+
return 0;
472+
}
466473

467474
void Berry_RunThreads(int deltaMS) {
468475
int c_sleep, c_run;

src/selftest/selftest_berry.c

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,36 @@ void Test_Berry_ChannelSet() {
4646
SELFTEST_ASSERT_CHANNEL(1, 0);
4747
SELFTEST_ASSERT_CHANNEL(2, 0);
4848

49+
int startStackSize = Berry_GetStackSize();
4950
// Run Berry code that sets channels
5051
CMD_ExecuteCommand("berry setChannel(1, 42)", 0);
5152
CMD_ExecuteCommand("berry setChannel(2, 123)", 0);
53+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
5254

5355
// Verify the channels were set correctly
5456
SELFTEST_ASSERT_CHANNEL(1, 42);
5557
SELFTEST_ASSERT_CHANNEL(2, 123);
5658

5759
// Test setting multiple channels in one script
5860
CMD_ExecuteCommand("berry setChannel(1, 99); setChannel(2, 88)", 0);
61+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
5962

6063
// Verify the updated values
6164
SELFTEST_ASSERT_CHANNEL(1, 99);
6265
SELFTEST_ASSERT_CHANNEL(2, 88);
6366

6467
CMD_ExecuteCommand("berry def give() return 7 end; setChannel(1, give() * 3)", 0);
6568
SELFTEST_ASSERT_CHANNEL(1, 21);
69+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
6670

6771
CMD_ExecuteCommand("berry i = 5; def test() i = 10 end; test(); setChannel(1, i)", 0);
6872
SELFTEST_ASSERT_CHANNEL(1, 10); // or 5 depending on scoping rules
73+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
6974

7075

7176
CMD_ExecuteCommand("berry setChannel(5, int(\"213\")); ", 0);
7277
SELFTEST_ASSERT_CHANNEL(5, 213);
78+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
7379
}
7480

7581
void Test_Berry_CancelThread() {
@@ -78,6 +84,7 @@ void Test_Berry_CancelThread() {
7884
// reset whole device
7985
SIM_ClearOBK(0);
8086

87+
int startStackSize = Berry_GetStackSize();
8188
// Make sure channels start at 0
8289
CMD_ExecuteCommand("setChannel 1 0", 0);
8390
CMD_ExecuteCommand("setChannel 2 0", 0);
@@ -88,6 +95,7 @@ void Test_Berry_CancelThread() {
8895
// Run Berry code that creates a delayed thread that would set channels
8996
// and stores the thread ID in a global variable
9097
CMD_ExecuteCommand("berry thread_id = setTimeout(def() setChannel(1, 42); setChannel(2, 123); end, 100); print(thread_id)", 0);
98+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
9199

92100
// Now cancel the thread using the thread_id
93101
CMD_ExecuteCommand("berry cancel(thread_id)", 0);
@@ -103,6 +111,7 @@ void Test_Berry_CancelThread() {
103111

104112
// Now let's test the positive case - create a thread and let it complete
105113
CMD_ExecuteCommand("berry setTimeout(def() setChannel(1, 99); setChannel(2, 88); end, 50)", 0);
114+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
106115

107116
// Run scheduler to let the thread complete
108117
for (i = 0; i < 20; i++) {
@@ -131,6 +140,7 @@ void Test_Berry_CancelThread() {
131140
}
132141
SELFTEST_ASSERT_CHANNEL(1, 102);
133142
SELFTEST_ASSERT_CHANNEL(2, 94);
143+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
134144

135145
}
136146

@@ -382,8 +392,9 @@ void Test_Berry_ThreadCleanup() {
382392
void Test_Berry_AutoloadModule() {
383393
// reset whole device
384394
SIM_ClearOBK(0);
385-
CMD_ExecuteCommand("lfs_format", 0);
395+
CMD_ExecuteCommand("lfs_format", 0);
386396

397+
int startStackSize = Berry_GetStackSize();
387398
// Create a Berry module file
388399
Test_FakeHTTPClientPacket_POST("api/lfs/autoexec.be",
389400
"autoexec = module('autoexec')\n"
@@ -406,6 +417,7 @@ void Test_Berry_AutoloadModule() {
406417

407418
// Simulate a device restart by running the autoexec.txt script
408419
CMD_ExecuteCommand("startScript autoexec.txt", 0);
420+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
409421

410422
// Run scheduler to let any scripts complete
411423
for (int i = 0; i < 5; i++) {
@@ -419,6 +431,7 @@ void Test_Berry_AutoloadModule() {
419431
// Test that we can now use the module functions directly
420432
CMD_ExecuteCommand("berry import autoexec; autoexec.init(); setChannel(6, 99)", 0);
421433
SELFTEST_ASSERT_CHANNEL(6, 99);
434+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
422435
}
423436

424437
void Test_Berry_StartScriptShortcut() {
@@ -476,6 +489,7 @@ void Test_Berry_PassArg() {
476489
SIM_ClearOBK(0);
477490
CMD_ExecuteCommand("lfs_format", 0);
478491

492+
int startStackSize = Berry_GetStackSize();
479493
// Create a Berry module file
480494
Test_FakeHTTPClientPacket_POST("api/lfs/test.be",
481495
"def mySample(x)\n"
@@ -499,6 +513,7 @@ void Test_Berry_PassArg() {
499513

500514
// Verify that the Berry module was loaded and initialized (it should have set channel 5 to 15)
501515
SELFTEST_ASSERT_CHANNEL(5, 15);
516+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
502517
}
503518

504519

@@ -508,6 +523,7 @@ void Test_Berry_PassArgFromCommand() {
508523
SIM_ClearOBK(0);
509524
CMD_ExecuteCommand("lfs_format", 0);
510525

526+
int startStackSize = Berry_GetStackSize();
511527
// Make sure channel starts at 0
512528
CMD_ExecuteCommand("setChannel 5 0", 0);
513529
SELFTEST_ASSERT_CHANNEL(5, 0);
@@ -522,6 +538,7 @@ void Test_Berry_PassArgFromCommand() {
522538
SELFTEST_ASSERT_CHANNEL(5, 32);
523539
CMD_ExecuteCommand("berry mySample(-5)", 0);
524540
SELFTEST_ASSERT_CHANNEL(5, 27);
541+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
525542
}
526543

527544

@@ -558,6 +575,8 @@ void Test_Berry_PassArgFromCommandWithModule() {
558575
SIM_ClearOBK(0);
559576
CMD_ExecuteCommand("lfs_format", 0);
560577

578+
int startStackSize = Berry_GetStackSize();
579+
561580
// Create a Berry module file
562581
Test_FakeHTTPClientPacket_POST("api/lfs/test.be",
563582
"test = module('test')\n"
@@ -582,6 +601,7 @@ void Test_Berry_PassArgFromCommandWithModule() {
582601
SELFTEST_ASSERT_CHANNEL(5, 6);
583602
CMD_ExecuteCommand("berry test.mySample(2)", 0);
584603
SELFTEST_ASSERT_CHANNEL(5, 8);
604+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
585605
}
586606

587607
void Test_Berry_FileSystem() {
@@ -590,6 +610,8 @@ void Test_Berry_FileSystem() {
590610

591611
CMD_ExecuteCommand("lfs_format", 0);
592612

613+
int startStackSize = Berry_GetStackSize();
614+
593615
// Create a Berry module file
594616
Test_FakeHTTPClientPacket_POST("api/lfs/test.be",
595617
"test = module('test')\n"
@@ -625,6 +647,7 @@ void Test_Berry_FileSystem() {
625647
CMD_ExecuteCommand("berry import test2; test2.mySample()", 0);
626648
Test_FakeHTTPClientPacket_GET("api/run/test.txt");
627649
SELFTEST_ASSERT_HTML_REPLY("foo bar hey");
650+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
628651
}
629652

630653
//
@@ -634,6 +657,7 @@ void Test_Berry_AddChangeHandler() {
634657
// reset whole device
635658
SIM_ClearOBK(0);
636659

660+
int startStackSize = Berry_GetStackSize();
637661
// Make sure channels start at 0
638662
CMD_ExecuteCommand("setChannel 1 0", 0);
639663

@@ -698,6 +722,7 @@ void Test_Berry_AddChangeHandler() {
698722
SELFTEST_ASSERT_CHANNEL(2, 1);
699723
CMD_ExecuteCommand("setChannel 5 7", 0);
700724
Berry_RunThreads(1);
725+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
701726
// TODO - it's triggered now, not as I expected....
702727
/*
703728
SELFTEST_ASSERT_CHANNEL(2, 1);
@@ -722,6 +747,7 @@ void Test_Berry_AddChangeHandler() {
722747
Berry_RunThreads(1);
723748
SELFTEST_ASSERT_CHANNEL(2, 2);
724749
*/
750+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
725751
}
726752
void Test_Berry_CommandRunner() {
727753
int i;
@@ -757,7 +783,7 @@ void Test_Berry_TuyaMCU() {
757783
SIM_ClearOBK(0);
758784

759785
SIM_UART_InitReceiveRingBuffer(2048);
760-
786+
int startStackSize = Berry_GetStackSize();
761787
CMD_ExecuteCommand("startDriver TuyaMCU", 0);
762788

763789
// per-dpID handler
@@ -766,9 +792,11 @@ void Test_Berry_TuyaMCU() {
766792
"setChannel(1, value) \n"
767793
"end)", 0);
768794

795+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
769796
SELFTEST_ASSERT_CHANNEL(1, 0);
770797
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 2, 123);
771798
SELFTEST_ASSERT_CHANNEL(1, 123);
799+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
772800
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 2, 564);
773801
SELFTEST_ASSERT_CHANNEL(1, 564);
774802
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 1, 333);
@@ -779,42 +807,56 @@ void Test_Berry_TuyaMCU() {
779807
SELFTEST_ASSERT_CHANNEL(1, 564);
780808
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 2, 123);
781809
SELFTEST_ASSERT_CHANNEL(1, 123);
810+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
782811

783812
// global handler
784813
CMD_ExecuteCommand("setChannel 1 0", 0);
785814
CMD_ExecuteCommand("berry addEventHandler(\"OnDP\", def(id, value)\n"
786815
"setChannel(5, id*10000+value) \n"
787816
"end)", 0);
788817
CMD_ExecuteCommand("setChannel 5 0", 0);
818+
Sim_RunFrames(100, false);
789819
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 2, 123);
820+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
790821
SELFTEST_ASSERT_CHANNEL(5, 2 * 10000 + 123);
791822
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 15, 123);
792823
SELFTEST_ASSERT_CHANNEL(5, 15 * 10000 + 123);
793824
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 15, 555);
794825
SELFTEST_ASSERT_CHANNEL(5, 15 * 10000 + 555);
795826
CMD_Berry_RunEventHandlers_IntInt(CMD_EVENT_ON_DP, 1, 555);
796827
SELFTEST_ASSERT_CHANNEL(5, 1 * 10000 + 555);
797-
828+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
798829

799830

800831
// This packet sets dpID 2 of type Value to 100
801832
CMD_ExecuteCommand("uartFakeHex 55AA0307000802020004000000647D", 0);
802833
Sim_RunFrames(100, false);
803834
SELFTEST_ASSERT_CHANNEL(1, 100);
804835
SELFTEST_ASSERT_CHANNEL(5, 2 * 10000 + 100);
805-
806-
// This packet sets dpID 2 of type Value to 90
807-
CMD_ExecuteCommand("uartFakeHex 55AA03070008020200040000005A73", 0);
808-
Sim_RunFrames(100, false);
809-
SELFTEST_ASSERT_CHANNEL(1, 90);
810-
SELFTEST_ASSERT_CHANNEL(5, 2 * 10000 + 90);
811-
// This packet sets dpID 2 of type Value to 110
812-
CMD_ExecuteCommand("uartFakeHex 55AA03070008020200040000006E87", 0);
813-
Sim_RunFrames(100, false);
814-
SELFTEST_ASSERT_CHANNEL(1, 110);
815-
SELFTEST_ASSERT_CHANNEL(5, 2 * 10000 + 110);
816-
817-
}
836+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
837+
838+
for (int tr = 0; tr < 20; tr++) {
839+
printf("Berry stack size: %i\n",Berry_GetStackSize());
840+
// This packet sets dpID 2 of type Value to 90
841+
CMD_ExecuteCommand("uartFakeHex 55AA03070008020200040000005A73", 0);
842+
Sim_RunFrames(100, false);
843+
SELFTEST_ASSERT_CHANNEL(1, 90);
844+
SELFTEST_ASSERT_CHANNEL(5, 2 * 10000 + 90);
845+
// TODO: ASSERT! - why?
846+
//SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
847+
848+
// This packet sets dpID 2 of type Value to 110
849+
CMD_ExecuteCommand("uartFakeHex 55AA03070008020200040000006E87", 0);
850+
Sim_RunFrames(100, false);
851+
SELFTEST_ASSERT_CHANNEL(1, 110);
852+
SELFTEST_ASSERT_CHANNEL(5, 2 * 10000 + 110);
853+
854+
// TODO: ASSERT! - why?
855+
//SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
856+
}
857+
int delta = Berry_GetStackSize() - startStackSize;
858+
printf("Stack grew %i\n", delta);
859+
}
818860

819861

820862
void Test_Berry_TuyaMCU_Bytes2() {
@@ -973,6 +1015,7 @@ void Test_Berry_HTTP() {
9731015
SIM_ClearOBK(0);
9741016
CMD_ExecuteCommand("lfs_format", 0);
9751017

1018+
int startStackSize = Berry_GetStackSize();
9761019
// inject html to state page
9771020
CMD_ExecuteCommand("berry addEventHandler(\"OnHTTP\", \"state\", def(request)\n"
9781021
" poststr(request,\"MySpecialTestString23432411\") \n"
@@ -990,6 +1033,7 @@ void Test_Berry_HTTP() {
9901033
"end)", 0);
9911034
Test_FakeHTTPClientPacket_GET("mypage123");
9921035
SELFTEST_ASSERT_HTML_REPLY("Anything");
1036+
SELFTEST_ASSERT(Berry_GetStackSize() == startStackSize);
9931037

9941038

9951039

0 commit comments

Comments
 (0)