Files

65 lines
3.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* bench/offline_track_all.c — 二期大歌单分页 离线样本重放(不打网络)。
*
* 用与 App 完全相同的 core 解析函数 ncm_api_parse_track_all 解析一段合成的
* /api/playlist/track/all 响应(songs[] 全量对象含 al.picUrl + total)。纯解析,
* 验证:① 数组路径 songs 命中;② id >2^31 不溢出;③ 新字段 al.picUrl 解析。
* 风控纪律:验证期 0 次真实 NCM 请求(离线样本重放)。
* 编译(宿主):$CC_HOST -O2 -DJSMN_HEADER -Icore -I../vendor/jsmn \
* offline_track_all.c ../out/core-host/*.o \
* -L../out/mbedtls/host -lmbedtls -lmbedx509 -lmbedcrypto -lz -lpthread -lm -o offline_track_all
*/
#include "ncm.h"
#include <stdio.h>
#include <string.h>
static int g_fail = 0;
#define CHECK(cond, fmt, ...) do { \
if (cond) printf(" PASS " fmt "\n", ##__VA_ARGS__); \
else { printf(" FAIL " fmt "\n", ##__VA_ARGS__); g_fail = 1; } \
} while (0)
int main(void) {
/* 合成真实形态 track/all 响应:songs[](全 song 对象,含 al.picUrl)+ total。
* id 用 >2^31 数字(2746301825),验 int64 不溢出;al.picUrl 验专辑封面。 */
const char *json =
"{\"code\":200,\"songs\":["
"{\"id\":2746301825,\"name\":\"Chrono Rewind\",\"dt\":253000,\"fee\":1,"
" \"ar\":[{\"name\":\"CVRCH\"}],"
" \"al\":{\"name\":\"Rewrite\",\"picUrl\":\"http://p1.music.126.net/ab/cover1.jpg\"}},"
"{\"id\":2048962657,\"name\":\"Verve\",\"dt\":210000,\"fee\":0,"
" \"ar\":[{\"name\":\"Ryan Taubert\"}],"
" \"al\":{\"name\":\"Rebuild\",\"picUrl\":\"https://p2.music.126.net/cd/cover2.jpg\"}}"
"],\"total\":5191}";
ncm_song_t songs[8];
int n = 0;
int64_t total = 0;
int rc = ncm_api_parse_track_all(json, strlen(json), songs, 8, &n, &total);
CHECK(rc == NCM_OK, "parse_track_all rc=%d", rc);
CHECK(n == 2, "parsed 2 songs (n=%d)", n);
CHECK(total == 5191, "total=%lld", (long long)total);
CHECK(strcmp(songs[0].name, "Chrono Rewind") == 0, "song0 name='%s'", songs[0].name);
CHECK(strcmp(songs[0].art_name, "CVRCH") == 0, "song0 artist='%s'", songs[0].art_name);
CHECK(strcmp(songs[0].album_name, "Rewrite") == 0, "song0 album='%s'", songs[0].album_name);
CHECK(strcmp(songs[0].al_pic, "http://p1.music.126.net/ab/cover1.jpg") == 0,
"song0 al_pic='%s'", songs[0].al_pic);
CHECK(strcmp(songs[1].id, "2048962657") == 0, "song1 id='%s'(numeric->text)", songs[1].id);
CHECK(strcmp(songs[1].al_pic, "https://p2.music.126.net/cd/cover2.jpg") == 0,
"song1 al_pic='%s'", songs[1].al_pic);
CHECK(songs[0].duration_ms == 253000 && songs[0].fee == 1, "song0 dt=%ld fee=%d",
songs[0].duration_ms, songs[0].fee);
/* 数组路径容错:缺 songs 但嵌套 playlist.tracks 也应命中(防御真实端点变体)。 */
const char *json2 =
"{\"code\":200,\"playlist\":{\"trackCount\":3,\"tracks\":["
"{\"id\":1,\"name\":\"A\",\"dt\":1000,\"fee\":0,\"ar\":[{\"name\":\"X\"}],"
"\"al\":{\"name\":\"AL\",\"picUrl\":\"http://x/y.jpg\"}}]}}";
int n2 = 0; int64_t t2 = 0;
rc = ncm_api_parse_track_all(json2, strlen(json2), songs, 8, &n2, &t2);
CHECK(rc == NCM_OK && n2 == 1, "parse variant playlist.tracks rc=%d n=%d", rc, n2);
CHECK(t2 == 3, "variant total(trackCount)=%lld", (long long)t2);
printf("%s\n", g_fail ? "RESULT: FAIL" : "RESULT: PASS");
return g_fail ? 1 : 0;
}