From 2009644ce06d1832e6008493466ddf2e95a84947 Mon Sep 17 00:00:00 2001
From: plainheart <yhen@all-my-life.cn>
Date: Thu, 5 Dec 2024 11:29:58 +0800
Subject: [PATCH] test: can use CN mirror to fetch versions and libs

---
 test/runTest/server.js | 26 +++++++++++++++++++-------
 test/runTest/util.js   | 37 +++++++++++++++++++++----------------
 2 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/test/runTest/server.js b/test/runTest/server.js
index ce701f785a..5361a1b940 100644
--- a/test/runTest/server.js
+++ b/test/runTest/server.js
@@ -25,6 +25,8 @@ process.on('uncaughtException', (err) => {
         console.log();
         console.error(`Please run \`${chalk.yellow('npm install')}\` in \`${chalk.green('test/runTest')}\` folder first!`);
         console.log();
+    } else {
+        console.error('Uncaught err:', err);
     }
     process.exit(1);
 });
@@ -53,6 +55,9 @@ const fse = require('fs-extra');
 const fs = require('fs');
 const open = require('open');
 const genReport = require('./genReport');
+const useCNMirror = process.argv.includes('--useCNMirror') || !!process.env.USE_CN_MIRROR;
+
+console.info(chalk.green('useCNMirror:'), useCNMirror);
 
 const CLI_FIXED_THREADS_COUNT = 1;
 
@@ -231,6 +236,18 @@ async function start() {
         return;
     }
 
+    let stableVersions;
+    let nightlyVersions;
+    try {
+        stableVersions = await fetchVersions(false, useCNMirror);
+        nightlyVersions = (await fetchVersions(true, useCNMirror)).slice(0, 100);
+        stableVersions.unshift('local');
+        nightlyVersions.unshift('local');
+    } catch (e) {
+        console.error('Failed to fetch version list:', e);
+        console.log(`Try again later or try the CN mirror with: ${chalk.yellow('npm run test:visual -- -- --useCNMirror')}`)
+        return;
+    }
 
     let _currentTestHash;
     let _currentRunConfig;
@@ -241,11 +258,6 @@ async function start() {
     // Start a static server for puppeteer open the html test cases.
     let {io} = serve();
 
-    const stableVersions = await fetchVersions(false);
-    const nightlyVersions = (await fetchVersions(true)).slice(0, 100);
-    stableVersions.unshift('local');
-    nightlyVersions.unshift('local');
-
     io.of('/client').on('connect', async socket => {
 
         let isAborted = false;
@@ -328,8 +340,8 @@ async function start() {
 
             let startTime = Date.now();
 
-            await prepareEChartsLib(data.expectedVersion); // Expected version.
-            await prepareEChartsLib(data.actualVersion); // Version to test
+            await prepareEChartsLib(data.expectedVersion, useCNMirror); // Expected version.
+            await prepareEChartsLib(data.actualVersion, useCNMirror); // Version to test
 
             // If aborted in the time downloading lib.
             if (isAborted) {
diff --git a/test/runTest/util.js b/test/runTest/util.js
index 4d892b3443..fd718cd3c4 100644
--- a/test/runTest/util.js
+++ b/test/runTest/util.js
@@ -56,7 +56,7 @@ module.exports.getEChartsTestFileName = function () {
     return `echarts.test-${config.testVersion}.js`;
 };
 
-module.exports.prepareEChartsLib = function (version) {
+module.exports.prepareEChartsLib = function (version, useCNMirror) {
 
     const versionFolder = path.join(__dirname, getVersionDir(version));
     const ecDownloadPath = `${versionFolder}/echarts.js`;
@@ -69,27 +69,31 @@ module.exports.prepareEChartsLib = function (version) {
 
         return Promise.resolve();
     }
-    return new Promise(resolve => {
+    return new Promise((resolve, reject) => {
         const testLibPath = `${versionFolder}/${module.exports.getEChartsTestFileName()}`;
         if (!fs.existsSync(ecDownloadPath)) {
             const file = fs.createWriteStream(ecDownloadPath);
             const isNightly = version.includes('-dev');
             const packageName = isNightly ? 'echarts-nightly' : 'echarts'
 
-            const url = `https://unpkg.com/${packageName}@${version}/dist/echarts.js`;
-            console.log(`Downloading ${packageName}@${version} from ${url}`, );
+            const url = useCNMirror
+                ? `https://registry.npmmirror.com/${packageName}/${version}/files/dist/echarts.js`
+                : `https://unpkg.com/${packageName}@${version}/dist/echarts.js`;
+            console.log(`Downloading ${packageName}@${version} from ${url}`);
             https.get(url, response => {
                 response.pipe(file);
 
                 file.on('finish', () => {
-                    let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
+                    const code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
                     fs.writeFileSync(testLibPath, code, 'utf-8');
                     resolve();
                 });
+            }).on('error', (e) => {
+                reject(`Failed to download ${packageName}@${version} from ${url}: ${e}`);
             });
         }
         else {
-            // Always do code modifaction.
+            // Always do code modification.
             // In case we need to do replacement on old downloads.
             let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
             fs.writeFileSync(testLibPath, code, 'utf-8');
@@ -98,16 +102,16 @@ module.exports.prepareEChartsLib = function (version) {
     });
 };
 
-module.exports.fetchVersions = function (isNighlty) {
+module.exports.fetchVersions = function (isNightly, useCNMirror) {
     return new Promise((resolve, reject) => {
-        https.get(
-            isNighlty
-                ? `https://registry.npmjs.org/echarts-nightly`
-                : `https://registry.npmjs.org/echarts`
-        , res => {
+        const npmRegistry = useCNMirror
+            ? 'https://registry.npmmirror.com'
+            : 'https://registry.npmjs.org';
+        const endpoint = `${npmRegistry}/echarts${isNightly ? '-nightly' : ''}`;
+        https.get(endpoint, res => {
             if (res.statusCode !== 200) {
                 res.destroy();
-                reject('Failed fetch versions from https://registry.npmjs.org/echarts');
+                reject('status code: ' + res.statusCode);
                 return;
             }
             var buffers = [];
@@ -118,10 +122,11 @@ module.exports.fetchVersions = function (isNighlty) {
                     resolve(Object.keys(JSON.parse(data).versions).reverse());
                 }
                 catch (e) {
-                    reject(e.toString());
+                    reject(e);
                 }
             });
-        });
+        })
+        .on('error', reject);
     });
 };
 
@@ -156,4 +161,4 @@ module.exports.waitTime = function (time) {
             resolve();
         }, time);
     });
-};
\ No newline at end of file
+};