// Flags: --expose-internals
'use strict';

// This test verifies that if the binary is compiled with code cache,
// and the cache is used when built in modules are compiled.
// Otherwise, verifies that no cache is used when compiling builtins.

const { isMainThread } = require('../common');
const assert = require('assert');
const {
  internalBinding
} = require('internal/test/binding');
const {
  getCacheUsage,
  builtinCategories: { canBeRequired }
} = internalBinding('builtins');

for (const key of canBeRequired) {
  require(`node:${key}`);
}

// The computation has to be delayed until we have done loading modules
const {
  compiledWithoutCache,
  compiledWithCache,
  compiledInSnapshot
} = getCacheUsage();

function extractModules(list) {
  return list.filter((m) => m.startsWith('NativeModule'))
  .map((m) => m.replace('NativeModule ', ''));
}

const loadedModules = extractModules(process.moduleLoadList);

// Cross-compiled binaries do not have code cache, verifies that the builtins
// are all compiled without cache and we are doing the bookkeeping right.
if (!process.features.cached_builtins) {
  assert(!process.config.variables.node_use_node_code_cache ||
         process.execArgv.includes('--no-node-snapshot'));

  if (isMainThread) {
    assert.deepStrictEqual(compiledWithCache, new Set());
    for (const key of loadedModules) {
      assert(compiledWithoutCache.has(key),
             `"${key}" should've been compiled without code cache`);
    }
  } else {
    // TODO(joyeecheung): create a list of modules whose cache can be shared
    // from the main thread to the worker thread and check that their
    // cache are hit
    assert.notDeepStrictEqual(compiledWithCache, new Set());
  }
} else {  // Native compiled
  assert(process.config.variables.node_use_node_code_cache);

  const wrong = [];
  for (const key of loadedModules) {
    if (key.startsWith('internal/deps/v8/tools')) {
      continue;
    }
    if (!compiledWithCache.has(key) &&
      compiledInSnapshot.indexOf(key) === -1) {
      wrong.push(`"${key}" should've been compiled **with** code cache`);
    }
  }
  assert.strictEqual(wrong.length, 0, wrong.join('\n'));
}
