UNPKG

blizzard-casc

Version:

Utility for interacting with the CASC CDN servers used to distribute Blizzard Entertainment game content.

68 lines (56 loc) 3.12 kB
const CASC = require('./blizzard-casc'); const assert = require('assert'); const casc = new CASC(); (async () => { // Test product specification. assert.throws(() => { casc.targetProduct; }, Error, 'casc.targetProduct expected to throw error when accessed before before set.'); casc.setTargetProduct(CASC.PRODUCT_WOW); assert.equal(CASC.PRODUCT_WOW, casc.targetProduct, 'casc.targetProduct != CASC.PRODUCT_WOW after being set.'); // Test patch server URL. assert.equal(CASC.PATCH_SERVER_US, casc.patchServer); casc.setPatchServer(CASC.PATCH_SERVER_EU); assert.equal(CASC.PATCH_SERVER_EU, casc.patchServer); // Test and validate CDN list structure. let expectedProps = ['Name', 'Path', 'Hosts', 'ConfigPath']; let cdnList = await casc.downloadCDNList(); assert(Array.isArray(cdnList), 'Array expected from casc.downloadCDNList()'); assert(cdnList.length > 0, 'casc.downloadCDNList() returned an empty array.'); for (let cdn of cdnList) for (let prop of expectedProps) assert(cdn.hasOwnProperty(prop), 'casc.downloadCDNList() entry missing property: ' + prop); // Test and validate version list structure. let versionList = await casc.downloadVersionList(); expectedProps = ['Region', 'BuildConfig', 'CDNConfig', 'KeyRing', 'BuildId', 'VersionsName', 'ProductConfig']; assert(Array.isArray(versionList), 'Array expected from casc.downloadVersionList()'); assert(versionList.length > 0, 'casc.downloadVersionList() returned an empty array.'); for (let version of versionList) for (let prop of expectedProps) assert(version.hasOwnProperty(prop), 'casc.downloadVersionList() entry missing property: ' + prop); let selectedCdn = cdnList[0]; // Naive blind pick, all should work for test. let selectedHost = selectedCdn.Hosts.split(' ')[0]; // Naively pick CDN host too. // Test data server URL. assert.throws(() => { casc.cdnServer }, Error, 'casc.cdnServer expected to throw error when accessed before set.'); assert.throws(() => { casc.cdnPath }, Error, 'casc.cdnPath expected to throw error when accessed before set.'); casc.setCDNServer(selectedHost, selectedCdn.Path); assert(casc.cdnServer.startsWith('http://')); // Find the build for the CDN region we picked. let selectedVersion; for (let version of versionList) { if (version.Region === selectedCdn.Name) { selectedVersion = version; break; } } if (!selectedVersion) throw new Error('Version list did not contain match for CDN region: ' + selectedCdn.Name); let cdnConfig = await casc.downloadConfigFile(selectedVersion.CDNConfig); assert(cdnConfig.hasOwnProperty('archives'), 'Unable to verify cdnConfig, `archives` property missing.'); let buildConfig = await casc.downloadConfigFile(selectedVersion.BuildConfig); assert(buildConfig.hasOwnProperty('root'), 'Unable to verify buildConfig, `root` property missing.'); // Attempt to download at least one archive. let archiveKey = cdnConfig.archives[0]; await casc.parseIndexFile(archiveKey); // Attempt to download/parse encoding table. let encodingKey = buildConfig.encoding[1]; let encoding = await casc.parseEncodingFile(encodingKey); })();