- use librtti

- Fix issue to xce_get() api cause client side crash
- add parse resreq section
- add rusage parser
- parse resreq with basic support alternative & compound, still miss select
This commit is contained in:
Rongsong Shen 2026-02-05 17:21:17 +08:00
parent e7dc09c604
commit cd4f3953b2
20 changed files with 1422 additions and 15 deletions

View file

@ -21,10 +21,15 @@ extern void test_group(void);
extern void test_xlist(void);
extern void test_limit(void);
extern void test_xvec(void);
extern void test_resreq(void);
void setUp(void) { return; }
void tearDown(void) { return; }
void tearDown(void)
{
printf("\n-----------------------------------------------------\n");
return;
}
static char doc[] = "xcelib_test";
static char args_doc[] = "";
@ -107,6 +112,7 @@ int main(int argc, char* argv[])
TEST(test_xlist);
TEST(test_limit);
TEST(test_xvec);
TEST(test_resreq);
return UNITY_END();
}

View file

@ -0,0 +1,343 @@
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unity/unity.h>
#include "resreq.h"
#include "utils.h"
void test_parse_section1(void)
{
char* resreq = "type == any";
char* errmsg = NULL;
int rc = 0;
xce_resreq_data_t data;
rc = parse_section(&data, (char*)resreq, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
TEST_ASSERT_TRUE(data.selectString != NULL);
TEST_ASSERT_TRUE((data.rusageString == NULL) && (data.spanString == NULL)
&& (data.sameString == NULL)
&& (data.affinityString == NULL));
TEST_ASSERT_TRUE(errmsg == NULL);
printf("select: %s\n", data.selectString);
FREEUP(data.selectString);
}
void test_parse_section2(void)
{
char* resreq = "select[type == any]";
char* errmsg = NULL;
int rc = 0;
xce_resreq_data_t data;
rc = parse_section(&data, (char*)resreq, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
TEST_ASSERT_TRUE(data.selectString != NULL);
TEST_ASSERT_TRUE((data.rusageString == NULL) && (data.spanString == NULL)
&& (data.sameString == NULL)
&& (data.affinityString == NULL));
TEST_ASSERT_TRUE(errmsg == NULL);
printf("select: %s\n", data.selectString);
FREEUP(data.selectString);
}
void test_parse_section_fail(void)
{
char* resreq = "select[type == any] rusage[mem=20:lic=55] span[ptile=1] "
"same[type] same[abcd] affinity[core(20)]";
char* errmsg = NULL;
int rc = 0;
xce_resreq_data_t data;
rc = parse_section(&data, (char*)resreq, &errmsg);
TEST_ASSERT_TRUE(rc < 0);
TEST_ASSERT_TRUE(data.selectString == NULL);
TEST_ASSERT_TRUE((data.rusageString == NULL) && (data.spanString == NULL)
&& (data.sameString == NULL)
&& (data.affinityString == NULL));
TEST_ASSERT_TRUE(errmsg != NULL);
printf("Parse Error:\n%s\n", errmsg);
FREEUP(errmsg);
}
void test_parse_rusage1(void)
{
char* rusageString
= "mem=20:duration=300:decay=1,lic=55:duration=20m:decay=0";
char* errmsg = NULL;
int rc = 0;
xlist_t rusages;
xlist_init(&rusages, 8);
rc = parse_rusage(&rusages, rusageString, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
if (rc >= 0) {
int i;
for (i = 0; i < rusages.count; i++) {
rusage_value_t* v = (rusage_value_t*)xlist_get(&rusages, i);
TEST_ASSERT_TRUE(v != NULL);
switch (i) {
case 0:
TEST_ASSERT_TRUE(strcmp(v->res, "mem") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 20.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 18000) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 0);
TEST_ASSERT_TRUE(v->decay_flag == 1);
break;
case 1:
TEST_ASSERT_TRUE(strcmp(v->res, "lic") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 55.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 1200) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 0);
TEST_ASSERT_TRUE(v->decay_flag == 0);
break;
default:
break;
}
printf("rusage: %s %f %d %f %d\n", v->res, v->value, v->per_flag,
v->duration, v->decay_flag);
kill_rusage_value(v);
free(v);
}
xlist_fini(&rusages);
}
}
void test_parse_rusage2(void)
{
char* rusageString
= "mem=20/host:duration=300:decay=1,lic=55/job:duration=20m:decay=0";
char* errmsg = NULL;
int rc = 0;
xlist_t rusages;
xlist_init(&rusages, 8);
rc = parse_rusage(&rusages, rusageString, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
if (rc >= 0) {
int i;
for (i = 0; i < rusages.count; i++) {
rusage_value_t* v = (rusage_value_t*)xlist_get(&rusages, i);
TEST_ASSERT_TRUE(v != NULL);
switch (i) {
case 0:
TEST_ASSERT_TRUE(strcmp(v->res, "mem") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 20.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 18000) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 2);
TEST_ASSERT_TRUE(v->decay_flag == 1);
break;
case 1:
TEST_ASSERT_TRUE(strcmp(v->res, "lic") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 55.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 1200) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 1);
TEST_ASSERT_TRUE(v->decay_flag == 0);
break;
default:
break;
}
printf("rusage: %s %f %d %f %d\n", v->res, v->value, v->per_flag,
v->duration, v->decay_flag);
kill_rusage_value(v);
free(v);
}
xlist_fini(&rusages);
}
}
void test_resreq_primary(void)
{
char* resreqString
= "select[type==any] "
"rusage[mem=20:duration=300:decay=1,lic=55:duration=20m:decay=0]";
char* errmsg = NULL;
int rc = 0;
xce_primary_resreq_t resreq;
rc = parse_resreq_primary(&resreq, resreqString, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
if (rc >= 0) {
int i;
xlist_t* rusages = &(resreq.rusages);
for (i = 0; i < rusages->count; i++) {
rusage_value_t* v = (rusage_value_t*)xlist_get(rusages, i);
TEST_ASSERT_TRUE(v != NULL);
switch (i) {
case 0:
TEST_ASSERT_TRUE(strcmp(v->res, "mem") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 20.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 18000) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 0);
TEST_ASSERT_TRUE(v->decay_flag == 1);
break;
case 1:
TEST_ASSERT_TRUE(strcmp(v->res, "lic") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 55.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 1200) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 0);
TEST_ASSERT_TRUE(v->decay_flag == 0);
break;
default:
break;
}
printf("rusage: %s %f %d %f %d\n", v->res, v->value, v->per_flag,
v->duration, v->decay_flag);
kill_rusage_value(v);
free(v);
}
xlist_fini(rusages);
}
}
void test_resreq1(void)
{
char* resreqString
= "select[type==any] "
"rusage[mem=20:duration=300:decay=1,lic=55:duration=20m:decay=0]";
char* errmsg = NULL;
int rc = 0;
xce_resreq_t resreq;
rc = parse_resreq(&resreq, resreqString, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
if (rc >= 0) {
int i;
xlist_t* rusages = NULL;
char* buf = NULL;
TEST_ASSERT_TRUE(resreq.tag == XCE_RESREQ_PRIMARY);
rusages = &(resreq.u.primary->rusages);
for (i = 0; i < rusages->count; i++) {
rusage_value_t* v = (rusage_value_t*)xlist_get(rusages, i);
TEST_ASSERT_TRUE(v != NULL);
switch (i) {
case 0:
TEST_ASSERT_TRUE(strcmp(v->res, "mem") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 20.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 18000) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 0);
TEST_ASSERT_TRUE(v->decay_flag == 1);
break;
case 1:
TEST_ASSERT_TRUE(strcmp(v->res, "lic") == 0);
TEST_ASSERT_TRUE(fabs(v->value - 55.0) < 0.001);
TEST_ASSERT_TRUE(fabs(v->duration - 1200) < 0.001);
TEST_ASSERT_TRUE(v->per_flag == 0);
TEST_ASSERT_TRUE(v->decay_flag == 0);
break;
default:
break;
}
printf("rusage: %s %f %d %f %d\n", v->res, v->value, v->per_flag,
v->duration, v->decay_flag);
}
rc = format_resreq(&buf, &resreq);
if (rc >= 0) {
printf("%s\n", buf);
}
FREEUP(buf);
kill_resreq(&resreq);
}
}
void test_resreq2(void)
{
char* resreqString = "2*{rusage[mem=100:duration=20:decay=1]} + "
"4*{rusage[mem=80:duration=30:decay=1]}";
char* errmsg = NULL;
int rc = 0;
xce_resreq_t resreq;
memset(&resreq, 0x0, sizeof(resreq));
rc = parse_resreq(&resreq, resreqString, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
if (rc >= 0) {
char* buf = NULL;
TEST_ASSERT_TRUE(resreq.tag == XCE_RESREQ_COMPOUND);
rc = format_resreq(&buf, &resreq);
if (rc >= 0) {
printf("%s\n", buf);
}
FREEUP(buf);
kill_resreq(&resreq);
}
}
void test_resreq3(void)
{
char* resreqString = "{2*{rusage[mem=100:duration=20:decay=1]} + "
"4*{rusage[mem=80:duration=30:decay=1]}} || "
"{3*{rusage[mem=150:duration=15:decay=1]} + "
"6*{rusage[mem=120:duration=20:decay=1]}} ";
char* errmsg = NULL;
int rc = 0;
xce_resreq_t resreq;
memset(&resreq, 0x0, sizeof(resreq));
rc = parse_resreq(&resreq, resreqString, &errmsg);
TEST_ASSERT_TRUE(rc >= 0);
if (rc >= 0) {
char* buf = NULL;
TEST_ASSERT_TRUE(resreq.tag == XCE_RESREQ_ALTER);
rc = format_resreq(&buf, &resreq);
if (rc >= 0) {
printf("%s\n", buf);
}
if (buf != NULL) {
free(buf);
}
kill_resreq(&resreq);
}
}
void test_resreq(void)
{
printf("\n>> resreq test\n\n");
RUN_TEST(test_parse_section1);
RUN_TEST(test_parse_section2);
RUN_TEST(test_parse_section_fail);
RUN_TEST(test_parse_rusage1);
RUN_TEST(test_parse_rusage2);
RUN_TEST(test_resreq_primary);
RUN_TEST(test_resreq1);
RUN_TEST(test_resreq2);
RUN_TEST(test_resreq3);
}