| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 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;
- }
|