|
|
@@ -0,0 +1,107 @@
|
|
|
+static void reset(void) {
|
|
|
+ prov_active=prov_request=prov_step=prov_len=prov_ready=prov_bad=0;
|
|
|
+ saves=0;
|
|
|
+ wifi_state=WIFI_TRANS;tx_phase=TX_IDLE;wifi_tx_len=0;
|
|
|
+ at_pending=at_retries=wifi_ack_delay=deferred_close=wifi_set_ssid=0;
|
|
|
+ g_wifi_rx_head=g_wifi_rx_last=0;g_wifi_rx_fault=0;
|
|
|
+ ticks=writes=commands=uart_fail=inject_prompt=0;
|
|
|
+ retry_wait=0;
|
|
|
+ wifi_rx_reset();
|
|
|
+}
|
|
|
+static void feed(const char *p) {put(p,(unsigned)strlen(p));WIFI_recv_deal();}
|
|
|
+static unsigned make_frame(uint8_t *b, unsigned size) {
|
|
|
+ unsigned i,sum;
|
|
|
+ b[0]=0xaa;b[1]=0x55;b[2]=1;b[3]=0x12;b[4]=size;b[5]=0;
|
|
|
+ for(i=0;i<size;i++) b[6+i]=(uint8_t)i;
|
|
|
+ if(size>=3) {b[6]='>';b[7]='\r';b[8]='\n';}
|
|
|
+ sum=checkSum(b+2,size+4);b[size+6]=sum;b[size+7]=sum>>8;
|
|
|
+ return size+8;
|
|
|
+}
|
|
|
+int main(void) {
|
|
|
+ uint8_t b[136],payload[10]={0};
|
|
|
+ unsigned n,i,split;
|
|
|
+ char header[40],tiny[3];
|
|
|
+ /* Real production formatting and real DecodeNew are compiled below. */
|
|
|
+ assert(my_sprintf(tiny,sizeof(tiny),"%s","abcd")==4 && !strcmp(tiny,"ab"));
|
|
|
+ reset();g_wifi_rx_head=g_wifi_rx_last=253;
|
|
|
+ assert(WIFI_Send_Data(payload,10,1)==10);
|
|
|
+ assert(!strcmp(last_write,"AT+CIPSEND=0,10\r\n"));
|
|
|
+ assert(WIFI_ReSend()==-2 && writes==1);
|
|
|
+ feed("\r\nOK\r\n> ");
|
|
|
+ assert(writes==2 && last_len==10 && tx_phase==TX_WAIT_RESULT);
|
|
|
+ feed(">");assert(writes==2);
|
|
|
+ ticks=6500;WIFI_send_deal();assert(tx_phase==TX_WAIT_RESULT);
|
|
|
+ feed("\r\nSEND OK\r\n");assert(tx_phase==TX_IDLE && wifi_tx_len==0);
|
|
|
+ reset();WIFI_Send_Data(payload,10,1);ticks=3000;WIFI_send_deal();
|
|
|
+ assert(tx_phase==TX_FAULT && writes==1);
|
|
|
+ ticks=100000;WIFI_send_deal();assert(writes==1);
|
|
|
+ feed("ready\r\n");assert(tx_phase==TX_IDLE && wifi_state==WIFI_POWERON);
|
|
|
+ /* Every split point of a maximum-size protocol frame across IPD segments. */
|
|
|
+ n=make_frame(b,128);
|
|
|
+ for(split=0;split<=n;split++) {
|
|
|
+ reset();my_sprintf(header,sizeof(header),"+IPD,0,%d",split);
|
|
|
+ feed(header);feed(":");put(b,split);WIFI_recv_deal();
|
|
|
+ my_sprintf(header,sizeof(header),"+IPD,0,%d:",n-split);
|
|
|
+ feed(header);put(b+split,n-split);WIFI_recv_deal();
|
|
|
+ assert(commands==1 && tx_phase!=TX_FAULT);
|
|
|
+ }
|
|
|
+ reset();n=make_frame(b,4);WIFI_Send_Data(payload,10,1);
|
|
|
+ /* Prompt before IPD in the same ring snapshot, binary delimiters inside. */
|
|
|
+ put("> +IPD,0,24:",12);put(b,n);put(b,n);WIFI_recv_deal();
|
|
|
+ assert(writes==2 && commands==2);
|
|
|
+ reset();WIFI_Send_Data(payload,10,1);inject_prompt=1;
|
|
|
+ put("+IPD,0,12:",10);put(b,n);WIFI_recv_deal();
|
|
|
+ assert(commands==1 && writes==2); /* Arrival during dispatch is preserved. */
|
|
|
+ reset();feed("+IPD,0,24:");b[n-1]^=1;put(b,n);b[n-1]^=1;put(b,n);
|
|
|
+ WIFI_recv_deal();assert(commands==1);
|
|
|
+ for(i=0;i<1000;i++) {feed("+IPD,0,12:");put(b,n);WIFI_recv_deal();}
|
|
|
+ assert(commands==1001);
|
|
|
+ reset();feed("+IPD,1,12:");put(b,n);WIFI_recv_deal();assert(commands==0);
|
|
|
+ reset();feed("+IPD,0,1200:");
|
|
|
+ for(i=0;i<100;i++) {put(b,n);WIFI_recv_deal();}
|
|
|
+ assert(commands==100 && !rx_ipd_left); /* larger than the hardware ring */
|
|
|
+ reset();g_wifi_rx_fault=1;WIFI_recv_deal();assert(tx_phase==TX_FAULT);
|
|
|
+ reset();uart_fail=1;assert(WIFI_Send_Data(payload,10,1)<0 && tx_phase==TX_FAULT);
|
|
|
+ reset();wifi_enter(WIFI_LISTEN);sysinf.connectTcpFlag=1;
|
|
|
+ strcpy(sysinf.TCP_IP_Addr,"192.168.3.1");strcpy(sysinf.TCP_IP_PORT,"8002");
|
|
|
+ WIFI_send_deal();assert(strstr(last_write,"AT+CIPSTART=0,\"TCP\""));
|
|
|
+ feed("0,CONNECT\r\nOK\r\n");assert(wifi_state==WIFI_TCPOPT);
|
|
|
+ WIFI_send_deal();assert(!strcmp(last_write,"AT+CIPTCPOPT=0,,,6000\r\n"));
|
|
|
+ feed("OK\r\n");assert(wifi_state==WIFI_TRANS);
|
|
|
+ reset();wifi_enter(WIFI_LISTEN);sysinf.connectTcpFlag=0;
|
|
|
+ WIFI_send_deal();feed("OK\r\n");assert(wifi_state==WIFI_TRANS);
|
|
|
+ reset();wifi_enter(WIFI_CWLAP);strcpy(sysinf.wifiname,"lab");WIFI_send_deal();
|
|
|
+ feed("+CWLAP:(3,\"lab\",-45,\"12:34:56:78:90:ab\",1)\r\nOK\r\n");
|
|
|
+ assert(wifi_state==WIFI_DISAUTO && !strcmp(MAC_ADDR,"12:34:56:78:90:ab"));
|
|
|
+ reset();wifi_enter(WIFI_CWLAP);WIFI_send_deal();feed("ERROR\r\n");
|
|
|
+ WIFI_send_deal();assert(writes==1);ticks=1999;WIFI_send_deal();assert(writes==1);
|
|
|
+ ticks=2000;WIFI_send_deal();assert(writes==2);
|
|
|
+ reset();wifi_enter(WIFI_LINK_AP);WIFI_send_deal();
|
|
|
+ feed("WIFI DISCONNECT\r\n");assert(wifi_state==WIFI_LINK_AP && at_pending);
|
|
|
+ feed("WIFI CONNECTED\r\nWIFI GOT IP\r\nOK\r\n");assert(wifi_state==WIFI_GET_IP);
|
|
|
+ reset();feed("WIFI DISCONNECT\r\n");assert(wifi_state==WIFI_POWEROFF);
|
|
|
+ /* Full SoftAP setup and fragmented JSON, including a nonzero link ID. */
|
|
|
+ reset();assert(WIFI_provision_request());WIFI_process();
|
|
|
+ assert(prov_active && !strcmp(last_write,"AT+RST\r\n"));
|
|
|
+ feed("OK\r\nready\r\n");
|
|
|
+ for (i=1;i<=8;i++) {WIFI_process();assert(at_pending);feed("OK\r\n");}
|
|
|
+ WIFI_process();assert(prov_step==10);
|
|
|
+ feed("+IPD,2,16:{\"ssid\":\"lab\",\"p");
|
|
|
+ feed("+IPD,2,13:assword\":\"x\"}");
|
|
|
+ WIFI_process();assert(prov_step==11 && saves==1);
|
|
|
+ assert(strstr(last_write,"AT+CIPSEND=2,"));
|
|
|
+ i=writes;feed("OK\r\n");assert(writes==i);
|
|
|
+ feed(">");assert(writes==i+1 && strstr(last_write,"accepted"));
|
|
|
+ feed("SEND OK\r\n");WIFI_process();assert(!prov_active);
|
|
|
+ /* A queued provisioning request cannot interrupt an active payload. */
|
|
|
+ reset();WIFI_Send_Data(payload,10,1);WIFI_provision_request();WIFI_process();
|
|
|
+ assert(!prov_active && writes==1);
|
|
|
+ ticks=3000;WIFI_process();assert(tx_phase==TX_FAULT && !prov_active && writes==1);
|
|
|
+ reset();feed("+IPD,0,-1:");assert(tx_phase==TX_FAULT);
|
|
|
+ reset();assert(WIFI_SendIlde());WIFI_Send_Data(payload,10,1);assert(!WIFI_SendIlde());
|
|
|
+ /* Search must not match stale bytes beyond the valid ring tail. */
|
|
|
+ reset();memcpy(g_wifi_rx_buf,"xxOK",4);g_wifi_rx_last=3;
|
|
|
+ assert(!find_str_loop(g_wifi_rx_buf,256,&g_wifi_rx_head,3,"OK"));
|
|
|
+ puts("PASS: DecodeNew, splits/wrap, 1000 frames, AT/IPD ordering, timeouts, TCP/UDP, SoftAP, valid-range search");
|
|
|
+ return 0;
|
|
|
+}
|