string SFlattenIterator::SFrame::MakePath() const { if (m_Index == (size_t) -1) { if (m_Path.empty()) return m_Iterator.GetKey(); string path(m_Path + '.'); path += m_Iterator.GetKey(); return path; } else { string index_str(NStr::NumericToString(m_Index)); if (m_Path.empty()) return index_str; string path(m_Path + '.'); path += index_str; return path; } }
int main(int argc, char* argv[]) { int randnum = 0; char* nvram = NULL, *value = NULL; char* delimiter = NULL, *tmp, *del; int position=0, c, i = 0, func = 0, val; char help_msg[2048] = "Usage: xobjconf [-s | -x <nvram variable>] {[-a | -m <values> -p <position>] | [ -n <to get # of digits>] | [-i <position>] | [-v <value>] | [-e <value>] | [ -r <position>] | [ -o <new delimiter>]} [-d delimiter]\n\n"; init_gen( ); strcat(help_msg, "xobjconf command summary\n"); strcat(help_msg, "\txobjconf is a function to insert/delete/modify/view nvram variable by delimiter(s).\n"); strcat(help_msg, "\t<nvram variable>:input a nvram variable.\n"); strcat(help_msg, "\tdelimiter:a delimiter which is a seperator.\n"); strcat(help_msg, "\t-s : to specify a nvram variable.\n"); strcat(help_msg, "\t-x : to get total counts of token by specified delimiter.\n"); strcat(help_msg, "\t-d : to specify a delimiter.\n"); strcat(help_msg, "\t-a:insert a value to the nvram variable by delimiter.\n"); strcat(help_msg, "\t-r : remove a value from a nvram variable by specfied position.\n"); strcat(help_msg, "\t-v : remove a value from a nvram variable by specfied value.\n"); strcat(help_msg, "\t-e : to check a value in a nvram variable is exist or not.\n"); strcat(help_msg, "\t-o : to replace delimiters in a token list by new delimiters.\n"); strcat(help_msg, "\t-n : to get digits in a nvram variable by speficied counts.\n"); strcat(help_msg, "\t-m : to change a value by spcified position from a nvram variable.\n"); strcat(help_msg, "\t-i : to return the value which is at the specified position from a nvram variable by delimiter.\n\n"); if(argc <= 1 || ((isgraph(*argv[1]) || ispunct(*argv[1])) && *argv[1]!='-')){ fprintf(stderr, "%s", help_msg); exit(0); } while ((c = getopt(argc, argv, "a:d:e:i:m:n:o:p:r:v:s:x:h")) != -1){ switch (c) { case 'a': func = 1; value = optarg; break; case 'r': func = 2; position = atoi(optarg); break; case 'm': func = 3; value = optarg; break; case 's': nvram = optarg; break; case 'i': func = 4; position = atoi(optarg); break; case 'v': func = 5; value = optarg; position = 1; break; case 'x': func = 6; nvram = optarg; break; case 'e': func = 7; value = optarg; position = 1; break; case 'n': func = 8; val = atoi(optarg); position = 1; break; case 'o': func = 9; value = optarg; break; case 'p': position = atoi(optarg); break; case 'd': delimiter = optarg; break; case 'h': fprintf(stderr, "%s", help_msg); exit(0); break; default: fprintf(stderr, "%s", help_msg); exit(0); break; } } if(nvram_get(nvram) == NULL && delimiter != NULL && nvram != NULL){ if(func == 1 && value != NULL){ nvram_set(nvram, ""); //printf("Inserting '%s' at position 1 ...\n", value); //tmp = StrDup(nvram_get(nvram)); //value = insert_str(tmp, value, delimiter, 1); //tmp = StrDup(insert_str(nvram_get(nvram), value, delimiter, 1)); //nvram_set(nvram, value); nvram_set(nvram, StrDup(insert_str(nvram_get(nvram), value, delimiter, 1))); printf("%s\n", nvram_get(nvram)); } else{ fprintf(stderr, "%s", help_msg); exit(0); } } else if(delimiter != NULL && position > 0 && nvram != NULL){ if(func == 1 && value != NULL){ //printf("Inserting %s at position %d ...\n", value, position); //tmp = StrDup(nvram_get(nvram)); //value = insert_str(tmp, value, delimiter, 1); //nvram_set(nvram, value); nvram_set(nvram, insert_str(nvram_get(nvram), value, delimiter, position)); printf("%s\n", nvram_get(nvram)); } else if(func == 2){ //printf("Deleting position %d of %s ... \n", position, nvram); //tmp = StrDup(nvram_get(nvram)); //value = delete_str(nvram_get(nvram), delimiter, position); //nvram_set(nvram, value); nvram_set(nvram, delete_str(nvram_get(nvram), delimiter, position)); printf("%s\n", nvram_get(nvram)); } else if(func == 3 && value != NULL){ //printf("Modifying position %d by %s ... \n", position, value); //tmp = StrDup(nvram_get(nvram)); //value = modify_str(nvram_get(nvram), value, delimiter, position); //nvram_set(nvram, value); nvram_set(nvram, StrDup(modify_str(nvram_get(nvram), value, delimiter, position))); printf("%s\n", nvram_get(nvram)); } else if(func == 4){ //printf("\nReading the values from nvram variable %s ... \n", nvram); tmp = StrDup(nvram_get(nvram)); printf("%s\n", index_str(tmp, delimiter, position)); } else if(func == 5){ /*c = matchStrPosAt(delimiter, StrDup(nvram_get(nvram)), -1) + 1; for (i = 1; i <= c ; i++) { tmp = StrDup(nvram_get(nvram)); printf("tmp = %s\n", tmp); del = StrDup(index_str(tmp, delimiter, i)); printf("%s[%d] = %s\n", nvram, i, del); if(!strcmp(del, value)){ printf("value %s is matched in %s\n", value, nvram_get(nvram)); nvram_set(nvram, delete_str(nvram_get(nvram), delimiter, i)); printf("delete '%s' which is spcified at position %d\n", value, i); break; } }*/ nvram_set(nvram, delete_val(nvram_get(nvram), value, delimiter)); printf("%s\n", nvram_get(nvram)); } else if(func == 7){ tmp = StrDup(nvram_get(nvram)); if(val_exist(tmp, value, delimiter)) printf("%s is exist\n", value); else printf("%s is not exist\n", value); } else if(func == 8){ tmp = StrDup(nvram_get(nvram)); printf("%s\n", str2digits(tmp, delimiter, val)); } else{ fprintf(stderr, "%s", help_msg); exit(0); } } else if(func == 6 && delimiter != NULL && nvram != NULL){ position = matchStrPosAt(delimiter, nvram_get(nvram), -1) + 1; printf("%d\n", position); /*printf("Number of token counts is %d\n", position); for(i = 1; i <= position; i++){ tmp = StrDup(nvram_get(nvram)); printf("\t%s\n", index_str(tmp, delimiter, i)); }*/ } else if(func == 9 && delimiter != NULL && nvram != NULL && value != NULL){ /* this code section is fix the old delimiter(s) is a subset of new delimiter(s) issue */ randnum = number_range(6, 16); tmp = StrDup(nvram_get(nvram)); if(strstr(value, delimiter) && strlen(value) > strlen(delimiter)){ char temp_deli[]="olddeliisasubsetofnewdeli"; random_string(temp_deli, randnum); nvram_set(nvram, replaceall(tmp, delimiter, temp_deli, -2, matchStrPosAt(delimiter, tmp, -1))); strcpy(tmp, nvram_get(nvram)); nvram_set(nvram, replaceall(tmp, temp_deli, value, -2, matchStrPosAt(temp_deli, tmp, -1))); } else nvram_set(nvram, replaceall(tmp, delimiter, value, -2, matchStrPosAt(delimiter, tmp, -1))); printf("%s\n", nvram_get(nvram)); } else{ fprintf(stderr, "%s", help_msg); exit(0); } //StrFree(tmp); return 0; }
/** send out response according to different http request. a typical workflow of auto case would be /check_server_status (by com-module) /init_test (by com-module) /set_testcase (by com-module) /check_server (by widget) /init_session_id?session_id=2033 (by widget) /auto_test_task?session_id=2033 (by widget) /check_execution_progress?session_id=2033 (by widget) /ask_next_step?session_id=2033 (by widget) /commit_result (by widget) /auto_test_task?session_id=2033 (by widget) /manual_cases (by widget) /generate_xml (by widget) /check_server_status (by com-module) /get_test_result (by com-module) a typical workflow of manual case would be /check_server_status (by com-module) /init_test (by com-module) /set_testcase (by com-module) /check_server (by widget) /init_session_id?session_id=2033 (by widget) /auto_test_task?session_id=2033 (by widget) /manual_cases (by widget) /check_server_status (by com-module) /commit_manual_result (by widget) ... /check_server_status (by com-module) /commit_manual_result (by widget) /generate_xml (by widget) /get_test_result (by com-module) **/ void HttpServer::processpost(int s, struct HttpRequest *prequest) { prequest->prefix = "application/json"; string json_str = "{\"OK\":1}"; #if defined(__WIN32__) || defined(__WIN64__) cout << "prequest->path is:" << prequest->path << endl; cout << "prequest->content is:" << prequest->content << endl; #else if (g_show_log) { DBG_ONLY("prequest->path is:" << prequest->path); DBG_ONLY("prequest->content is:" << prequest->content); } #endif if (prequest->path.find("/init_test") != string::npos) { // invoke by com-module to init some para for test set_cl_timeout(0); Json::Reader reader; Json::Value value; if (g_show_log) DBG_ONLY("[ init the test suite ]"); bool parsed = reader.parse(prequest->content, value); if (parsed) { g_launcher = value["launcher"].asString(); g_platform = value["platform"].asString(); m_suite_name = value["suite_name"].asString(); if (g_launcher == "wrt-launcher") { g_run_wiget = true; m_suite_id = value["suite_id"].asString(); g_launch_cmd = g_launcher + " -s " + m_suite_id; g_kill_cmd = g_launcher + " -k " + m_suite_id; killAllWidget(); } else if (g_platform == "androidmobile") { // xwalk on android g_run_wiget = false; //am start -n org.xwalk.tct-2dtransforms-css3-tests/.tct-2dtransforms-css3-testsActivity //g_launch_cmd = "am start -n org.xwalk." + m_suite_name + "/." + m_suite_name + "Activity"; //g_kill_cmd = "am force-stop org.xwalk." + m_suite_name; g_launch_cmd = ""; g_kill_cmd = ""; } else if (g_platform == "windowshttp"){ // xwalk on windows g_run_wiget = true; m_suite_id = value["suite_id"].asString(); //g_launch_cmd = "C:\\\"Program Files\"\\"+m_suite_id + "\\" + g_launcher; g_launch_cmd = "notepad C:\\\"Program Files\"\\" + m_suite_id + "\\" + m_suite_id + "\\manifest.json"; g_kill_cmd = ""; sleep(1); }else { #if defined(__WIN32__) || defined(__WIN64__) g_launch_cmd = "start /b " + g_launcher; g_kill_cmd = ""; #else g_launch_cmd = g_launcher + " &"; if (g_launcher.find("XWalkLauncher") != string::npos) //kill xwalk g_kill_cmd = "pkill XWalkLauncher"; //g_kill_cmd = "ps ax | grep xwalk | grep -v testkit-lite | grep -v grep | awk '{print $1F}' | xargs kill -9;"; else g_kill_cmd = ""; // not kill browser #endif m_suite_id = value["suite_id"].asString(); g_run_wiget = true; //wait for the index window.close, otherwise will occur bind aleady error sleep(1); } } else { if (g_show_log) { DBG_ONLY ("error while parse para from com-module, can't start test"); DBG_ONLY(prequest->content); } json_str = "{\"Error\":\"parse error\"}"; } } else if (prequest->path.find("/execute_cmd") != string::npos){ //Only work on Windows! invoke by com-module for executing command on windows platform if (g_show_log){ DBG_ONLY("[ execute command: ]" << endl); DBG_ONLY(prequest->content); } Json::Reader reader; Json::Value value; bool parsed = reader.parse(prequest->content, value); string json_cmd = ""; if (parsed){ json_cmd = value["cmd"].asString(); } std::vector < string > outputs; string cmd = json_cmd; cout << "[ command: ]" << cmd << endl; run_cmd(cmd, "", &outputs); for (unsigned int i = 0; i < outputs.size(); i++){ cout << "[ output: ]" << outputs[i] << endl; } #if defined(__WIN32__) || defined(__WIN64__) } else if (prequest->path.find("/powershell_install") != string::npos){ //Only work with Windows PowerShell. JSON {suite: suitename, host: hostip, file:suitefile_file_path} Json::Reader reader; Json::Value value; bool parsed = reader.parse(prequest->content, value); string json_suite = ""; string json_file = ""; string json_host = ""; if (parsed) { json_suite = value["suite"].asString(); json_file = value["file"].asString(); json_host = value["host"].asString(); } string ps_cmd = "powershell -file c:\\stub\\powershell\\download.ps1 "; ps_cmd = ps_cmd + json_suite + " " + json_file + " " + json_host; cout << "[ command: ]" << ps_cmd << endl; int ret = run_cmd_return_code(ps_cmd); if(ret != 1){ if (ret == -1) json_str = "{\"Error\":\"Fail to install "+ json_suite +"\"}"; else if (ret == -2) json_str = "{\"Error\":\"Fail to download "+ json_file +"\"}"; else if (ret == -5) json_str = "{\"Error\":\"Fail to execute "+ json_file +". Popen return null\"}"; else json_str = "{\"Error\":\"Unknown script errors.\"}"; } } else if (prequest->path.find("/powershell_uninstall") != string::npos){ //Only work with Windows PowerShell. JSON {suite: suitename} Json::Reader reader; Json::Value value; bool parsed = reader.parse(prequest->content, value); string json_suite = ""; if (parsed) { json_suite = value["suite"].asString(); } string ps_cmd = "powershell -file c:\\stub\\powershell\\uninstall.ps1 "; ps_cmd = ps_cmd + json_suite; cout << "[ command: ]" << ps_cmd << endl; int ret = run_cmd_return_code(ps_cmd); if(ret != 1){ json_str = "{\"Error\":\"Fail to uninstall.\"}"; } } else if (prequest->path.find("/powershell_exitcode") != string::npos){ string ps_cmd = "powershell -file c:\\stub\\powershell\\exitcode.ps1 0"; cout << "[ command: ]" << ps_cmd << endl; int ret = run_cmd_return_code(ps_cmd); cout << "[ return: ]" << ret << endl; #endif } else if (prequest->path.find("/execute_async_cmd") != string::npos) { Json::Reader reader; Json::Value value; bool parsed = reader.parse(prequest->content, value); string json_cmd = ""; if (parsed) { json_cmd = value["cmd"].asString(); } string cmd = json_cmd; run_cmd_async(cmd); }else if (prequest->path.find("/set_testcase") != string::npos) { // invoke by com-module to send testcase data m_block_finished = false; m_set_finished = false; m_timeout_count = 0; m_server_checked = false; if (g_show_log) DBG_ONLY("[ set test cases ]"); parse_json_str(prequest->content); set_timer(20); // set timer here incase widget hang. m_check_times = 0; m_block_case_index = 0; if (m_current_block_index == 1) m_total_case_index = 0; } else if (prequest->path == "/check_server") { // invoke by index.html to find server running or not set_cl_timeout(0); m_server_checked = true; m_check_times = 0; cancel_time_check(); if (g_show_log) DBG_ONLY ("[ checking server, and found the server is running ]"); } else if (prequest->path == "/check_server_status") { // invoke by com-module to get server status Json::Value status; status["block_finished"] = m_block_finished ? 1 : 0; status["finished"] = m_set_finished ? 1 : 0; if (m_exeType == "auto" && check_cl_timeout()) { status["error_code"] = 2; status["finished"] = 1; //finish current set if widget is timeout } else if (m_failto_launch > m_max_fail_launch) { status["error_code"] = 2; status["finished"] = 1; // finish current set if can't launch widget } else if (g_error_code > 0) { status["error_code"] = g_error_code; g_error_code = 0; } pthread_mutex_lock(&result_mutex); char count[8]; memset(count, 0, 8); sprintf(count, "%d", m_result.size()); status["count"] = count; status["cases"] = m_result; m_result.clear(); pthread_mutex_unlock(&result_mutex); json_str = status.toStyledString(); if (!m_server_checked) { if (g_show_log) DBG_ONLY ("wait for widget check_server, please check on device." << endl); } if (m_totalBlocks > 0) { if (g_show_log) DBG_ONLY("group: " << m_current_block_index << "/" << m_totalBlocks << ", total case: " << m_total_case_index << "/" << m_totalcaseCount << ", group case: " << m_block_case_index << "/" << m_block_case_count << ", m_timeout_count:" << m_timeout_count); if (m_exeType != "auto") { if (g_show_log) DBG_ONLY ("manual cases. please check on device." << endl); } } } else if (prequest->path == "/shut_down_server") { if (g_run_wiget == true) killAllWidget(); // kill all widget when shutdown server gIsRun = 0; } else if (prequest->path.find("/init_session_id") != string::npos) { // invoke by index.html to record a session id set_cl_timeout(0); int index = prequest->path.find('='); if (index != -1) { m_running_session = prequest->path.substr(index + 1); if (g_show_log) DBG_ONLY("[ sessionID: " << m_running_session << " is gotten from the client ]"); } else { if (g_show_log) DBG_ONLY("[ invalid session id ]"); } } else if (prequest->path.find("/ask_next_step") != string::npos) { // invoke by index.html to check whether there are more cases set_cl_timeout(0); if (m_block_finished || m_set_finished) json_str = "{\"step\":\"stop\"}"; else json_str = "{\"step\":\"continue\"}"; m_timeout_count = 0; // reset the timeout count } else if (prequest->path.find("/auto_test_task") != string::npos) { // invoke by index.html to get current auto case set_cl_timeout(0); if (m_test_cases == NULL) { json_str = "{\"Error\":\"no case\"}"; } else if (m_exeType != "auto") { json_str = "{\"none\":0}"; } else { string error_type = ""; bool find_tc = get_auto_case(prequest->content, &error_type); if (find_tc == false) { json_str = "{\"" + error_type + "\":0}"; } else { json_str = m_test_cases[m_block_case_index].to_json(). toStyledString(); } } } else if (prequest->path.find("/manual_cases") != string::npos) { // invoke by index.html to get all manual cases cancel_time_check(); // should not timeout in manual mode if (!m_test_cases) { json_str = "{\"Error\":\"no case\"}"; } else if (m_exeType == "auto") { json_str = "{\"none\":0}"; } else { Json::Value arrayObj; for (int i = 0; i < m_block_case_count; i++) arrayObj.append(m_test_cases[i].to_json()); json_str = arrayObj.toStyledString(); set_timer(60); // check every 60 seconds to make sure widget alive when run manual cases. } } else if (prequest->path.find("/commit_manual_result") != string::npos) { // invoke by index.html to provide result of a manual case. set_cl_timeout(0); if ((prequest->content.length() == 0) || (!m_test_cases)) { json_str = "{\"Error\":\"no manual result\"}"; } else { find_id(splitContent(prequest->content), false); // will set index in find_id } } else if (prequest->path.find("/check_execution_progress") != string::npos) { //invoke by index.html to get test result of last auto case set_cl_timeout(0); char *total_count = new char[16]; sprintf(total_count, "%d", m_totalcaseCount); char *current_index = new char[16]; sprintf(current_index, "%d", m_total_case_index + 1); string count_str(total_count); string index_str(current_index); json_str = "{\"total\":" + count_str + ",\"current\":" + index_str + ",\"last_test_result\":\"" + m_last_auto_result + "\"}"; delete[]total_count; delete[]current_index; } //generate_xml:from index_html, a maually block finished when click done in widget, or no manual cases anymore(when run auto block) else if (prequest->path == "/generate_xml") { set_cl_timeout(0); if (m_exeType != "auto") { cancel_time_check(); m_block_finished = true; if (m_current_block_index == m_totalBlocks) m_set_finished = true; } } //from com module,when m_set_finished is true else if (prequest->path == "/get_test_result") { cancel_time_check(); if (!m_test_cases) { json_str = "{\"Error\":\"no case\"}"; } else { Json::Value root; root["count"] = "0"; root["cases"] = m_result; // m_result will always be empty here json_str = root.toStyledString(); } } // index.html invoke this with id and result of an auto case, auto case commit result. // we need find correct test case by id, and record test result to it. else if (prequest->path == "/commit_result") { set_cl_timeout(0); if ((prequest->content.length() == 0) || (!m_test_cases)) { json_str = "{\"Error\":\"no result\"}"; m_last_auto_result = "BLOCK"; } else { Json::Value paras = splitContent(prequest->content); if (m_running_session == paras["session_id"].asString()) { find_id(paras, true); } } } else if (prequest->path == "/set_capability") { // by com-module to send capability data Json::Reader reader; reader.parse(prequest->content, m_capability); } else if (prequest->path.find("/capability") != string::npos) { // by test suite. only one query parameter each time json_str = "{\"support\":0}"; Json::Value paras = splitContent(prequest->content); string value = paras["value"].asString(); string name = paras["name"].asString(); for (unsigned int i = 0; i < name.size(); i++) name[i] = tolower(name[i]); if (m_capability[name].isBool()) { // for bool value, omit the value part json_str = "{\"support\":1}"; } else if (m_capability[name].isInt()) { if (m_capability[name].asInt() == atoi(value.c_str())) json_str = "{\"support\":1}"; } else if (m_capability[name].isString()) { if (m_capability[name].asString() == value) json_str = "{\"support\":1}"; } } else { json_str = "{\"Error\":\"unknown request\"}"; } if (json_str != "") sendresponse(s, 200, prequest, json_str); #if defined(__WIN32__) || defined(__WIN64__) cout << "server response is:" << json_str << endl; #else if (g_show_log) DBG_ONLY("server response is:" << json_str); #endif }