diff --git a/.editorconfig b/.editorconfig index c14889663d5e..85ebb7a55bcf 100644 --- a/.editorconfig +++ b/.editorconfig @@ -47,7 +47,7 @@ indent_size = 2 [*.{ts,tsx}] indent_size = 2 -[*.{js,jsx}] +[*.{mjs,js,jsx}] indent_size = 2 [*.css] diff --git a/.github/actions/behavior_test_binding_nodejs/action.yaml b/.github/actions/behavior_test_binding_nodejs/action.yaml index cc2c64b0e0ba..b5ac84cbf78d 100644 --- a/.github/actions/behavior_test_binding_nodejs/action.yaml +++ b/.github/actions/behavior_test_binding_nodejs/action.yaml @@ -28,25 +28,25 @@ inputs: runs: using: "composite" steps: - - name: Setup - shell: bash - run: | - mkdir -p ./dynamic_test_binding_nodejs && - cat <./dynamic_test_binding_nodejs/action.yml - runs: - using: composite - steps: - - name: Setup Test - uses: ./.github/services/${{ inputs.service }}/${{ inputs.setup }} - - name: Run Test Binding NodeJS - shell: bash - working-directory: bindings/nodejs - run: | - yarn build:debug - yarn test - env: - NAPI_FEATURES: ${{ inputs.feature }} - OPENDAL_TEST: ${{ inputs.service }} - EOF - - name: Run - uses: ./dynamic_test_binding_nodejs + - name: Setup + shell: bash + run: | + mkdir -p ./dynamic_test_binding_nodejs && + cat <./dynamic_test_binding_nodejs/action.yml + runs: + using: composite + steps: + - name: Setup Test + uses: ./.github/services/${{ inputs.service }}/${{ inputs.setup }} + - name: Run Test Binding NodeJS + shell: bash + working-directory: bindings/nodejs + run: | + yarn build:debug + yarn test + env: + NAPI_FEATURES: ${{ inputs.feature }} + OPENDAL_TEST: ${{ inputs.service }} + EOF + - name: Run + uses: ./dynamic_test_binding_nodejs diff --git a/.github/services/azdls/azdls/action.yml b/.github/services/azdls/azdls/action.yml index 60f3c3ed8398..4ac4ab01ea10 100644 --- a/.github/services/azdls/azdls/action.yml +++ b/.github/services/azdls/azdls/action.yml @@ -26,10 +26,10 @@ runs: with: export-env: true env: - OPENDAL_AZDLS_FILESYSTEM: op://services/azdls/filesystem - OPENDAL_AZDLS_ENDPOINT: op://services/azdls/endpoint - OPENDAL_AZDLS_ACCOUNT_NAME: op://services/azdls/account_name - OPENDAL_AZDLS_ACCOUNT_KEY: op://services/azdls/account_key + OPENDAL_AZDLS_FILESYSTEM: op://services/azdls/filesystem + OPENDAL_AZDLS_ENDPOINT: op://services/azdls/endpoint + OPENDAL_AZDLS_ACCOUNT_NAME: op://services/azdls/account_name + OPENDAL_AZDLS_ACCOUNT_KEY: op://services/azdls/account_key - name: Add extra settings shell: bash run: | diff --git a/.github/workflows/bindings_nodejs.yml b/.github/workflows/bindings_nodejs.yml index d4eb770983c5..942758dc717a 100644 --- a/.github/workflows/bindings_nodejs.yml +++ b/.github/workflows/bindings_nodejs.yml @@ -48,6 +48,8 @@ jobs: - uses: actions/checkout@v4 - name: Setup Rust toolchain uses: ./.github/actions/setup + with: + need-nextest: true - name: Setup node uses: actions/setup-node@v4 with: @@ -63,14 +65,11 @@ jobs: - name: Check format run: yarn run prettier --check . - - name: Build - run: yarn build:debug - - name: Check diff run: git diff --exit-code - - name: Test bindings - run: yarn test + - name: Unit test + run: cargo nextest run --no-fail-fast linux: runs-on: ubuntu-latest @@ -107,8 +106,6 @@ jobs: with: name: bindings-linux path: bindings/nodejs/*.node - - name: Test bindings - run: yarn test windows: runs-on: windows-latest @@ -137,8 +134,6 @@ jobs: with: name: bindings-windows path: bindings/nodejs/*.node - - name: Test bindings - run: yarn test macos: runs-on: macos-latest @@ -190,10 +185,6 @@ jobs: with: name: bindings-macos-${{ matrix.settings.target }} path: bindings/nodejs/*.node - - name: Test bindings - if: ${{ matrix.settings.test }} - run: ${{ matrix.settings.test }} - shell: bash release: name: Release diff --git a/bindings/nodejs/.env.example b/bindings/nodejs/.env.example deleted file mode 100644 index 88f75b60ae0f..000000000000 --- a/bindings/nodejs/.env.example +++ /dev/null @@ -1,5 +0,0 @@ -export AWS_ACCESS_KEY_ID= -export AWS_SECRET_ACCESS_KEY= -export AWS_S3_REGION= -export AWS_S3_ENDPOINT= -export AWS_BUCKET= \ No newline at end of file diff --git a/bindings/nodejs/package.json b/bindings/nodejs/package.json index b99b268e8391..86626db33d9b 100644 --- a/bindings/nodejs/package.json +++ b/bindings/nodejs/package.json @@ -74,12 +74,13 @@ { "files": "./**/*.{js,ts,mjs}", "options": { + "arrowParens": "always", + "parser": "typescript", "printWidth": 120, "semi": false, - "trailingComma": "all", "singleQuote": true, - "arrowParens": "always", - "parser": "typescript" + "tabWidth": 2, + "trailingComma": "all" } } ] diff --git a/bindings/nodejs/tests/service.test.mjs b/bindings/nodejs/tests/service.test.mjs index 2dce9f4ea8a4..bcaed09459e3 100644 --- a/bindings/nodejs/tests/service.test.mjs +++ b/bindings/nodejs/tests/service.test.mjs @@ -17,7 +17,13 @@ * under the License. */ +import path from 'path' + +import dotenv from 'dotenv' + import { runner } from './suites/index.mjs' import { loadTestSchemeFromEnv } from './utils.mjs' +dotenv.config({ path: path.resolve(__dirname, '../../../.env'), debug: true }) + runner('Behavior Test', loadTestSchemeFromEnv()) diff --git a/bindings/nodejs/tests/suites/async.suite.mjs b/bindings/nodejs/tests/suites/async.suite.mjs index cd01f1d22d86..8214c1b172c5 100644 --- a/bindings/nodejs/tests/suites/async.suite.mjs +++ b/bindings/nodejs/tests/suites/async.suite.mjs @@ -22,13 +22,13 @@ import { expect, test } from 'vitest' import { generateBytes } from '../utils.mjs' export function run(operator) { - test('async stat not exist files', async () => { - const filename = `random_file_${randomUUID()}` + test('async stat not exist files', async () => { + const filename = `random_file_${randomUUID()}` - try { - await operator.stat(filename) - } catch (error) { - assert.ok(error.message.includes('NotFound')) - } - }) + try { + await operator.stat(filename) + } catch (error) { + assert.ok(error.message.includes('NotFound')) + } + }) } diff --git a/bindings/nodejs/tests/suites/index.mjs b/bindings/nodejs/tests/suites/index.mjs index 4b535ca4efb1..cd89980098c9 100644 --- a/bindings/nodejs/tests/suites/index.mjs +++ b/bindings/nodejs/tests/suites/index.mjs @@ -19,25 +19,27 @@ import { describe } from 'vitest' import { Operator } from '../../index.js' -import { loadConfigFromEnv } from '../utils.mjs' +import { checkRandomRootEnabled, generateRandomRoot, loadConfigFromEnv } from '../utils.mjs' import { run as AsyncIOTestRun } from './async.suite.mjs' import { run as SyncIOTestRun } from './sync.suite.mjs' export function runner(testName, scheme) { - if (testName === null || testName === undefined) { - throw new Error('The scheme should not be `null` or `undefined`. ') - } + if (!scheme) { + console.warn('The scheme is empty. Test will be skipped.') + return + } - if (testName === '') { - return - } + const config = loadConfigFromEnv(scheme) - const config = loadConfigFromEnv(scheme) - const operator = scheme ? new Operator(scheme, config) : undefined + if (checkRandomRootEnabled()) { + config.root = generateRandomRoot(config.root) + } - describe.skipIf(!operator)(testName, () => { - AsyncIOTestRun(operator) - SyncIOTestRun(operator) - }) + const operator = scheme ? new Operator(scheme, config) : null + + describe.skipIf(!operator)(testName, () => { + AsyncIOTestRun(operator) + SyncIOTestRun(operator) + }) } diff --git a/bindings/nodejs/tests/suites/sync.suite.mjs b/bindings/nodejs/tests/suites/sync.suite.mjs index 3ca859ceee7e..473d121c6e1c 100644 --- a/bindings/nodejs/tests/suites/sync.suite.mjs +++ b/bindings/nodejs/tests/suites/sync.suite.mjs @@ -22,13 +22,13 @@ import { expect, test } from 'vitest' import { generateBytes } from '../utils.mjs' export function run(operator) { - test('sync stat not exist files', () => { - const filename = `random_file_${randomUUID()}` + test('sync stat not exist files', () => { + const filename = `random_file_${randomUUID()}` - try { - operator.statSync(filename) - } catch (error) { - assert.ok(error.message.includes('NotFound')) - } - }) + try { + operator.statSync(filename) + } catch (error) { + assert.ok(error.message.includes('NotFound')) + } + }) } diff --git a/bindings/nodejs/tests/utils.mjs b/bindings/nodejs/tests/utils.mjs index 01a94b42b4c0..6124cff986ed 100644 --- a/bindings/nodejs/tests/utils.mjs +++ b/bindings/nodejs/tests/utils.mjs @@ -17,33 +17,40 @@ * under the License. */ -const path = require('path') +import crypto from 'node:crypto' export function generateBytes() { - const size = Math.floor(Math.random() * 1024) + 1 - const content = [] + const size = Math.floor(Math.random() * 1024) + 1 + const content = [] - for (let i = 0; i < size; i++) { - content.push(Math.floor(Math.random() * 256)) - } + for (let i = 0; i < size; i++) { + content.push(Math.floor(Math.random() * 256)) + } - return Buffer.from(content) + return Buffer.from(content) } export function loadTestSchemeFromEnv() { - require('dotenv').config({ path: path.resolve(__dirname, '../../../.env'), debug: true }) - return process.env.OPENDAL_TEST + return process.env.OPENDAL_TEST +} + +export function checkRandomRootEnabled() { + return process.env.OPENDAL_DISABLE_RANDOM_ROOT !== 'true' +} + +export function generateRandomRoot(baseRoot) { + return `${baseRoot}/opendal_${crypto.randomUUID()}` } export function loadConfigFromEnv(scheme) { - if (!scheme) return {} + if (!scheme) return {} - const prefix = `opendal_${scheme}_` + const prefix = `opendal_${scheme}_` - return Object.fromEntries( - Object.entries(process.env) - .map(([key, value]) => [key.toLowerCase(), value]) - .filter(([key]) => key.startsWith(prefix)) - .map(([key, value]) => [key.replace(prefix, ''), value]), - ) + return Object.fromEntries( + Object.entries(process.env) + .map(([key, value]) => [key.toLowerCase(), value]) + .filter(([key]) => key.startsWith(prefix)) + .map(([key, value]) => [key.replace(prefix, ''), value]), + ) } diff --git a/fixtures/sftp/docker-compose-sftp-with-default-root.yml b/fixtures/sftp/docker-compose-sftp-with-default-root.yml index a02e91ad81e1..e650e73eadd5 100644 --- a/fixtures/sftp/docker-compose-sftp-with-default-root.yml +++ b/fixtures/sftp/docker-compose-sftp-with-default-root.yml @@ -33,13 +33,7 @@ services: hard: 65536 command: foo::::upload healthcheck: - test: - [ - "CMD-SHELL", - "bash", - "-c", - "/health-check.sh" - ] + test: ["CMD-SHELL", "bash", "-c", "/health-check.sh"] interval: 10s timeout: 10s - retries: 5 \ No newline at end of file + retries: 5 diff --git a/fixtures/sftp/docker-compose-sftp.yml b/fixtures/sftp/docker-compose-sftp.yml index d090565ae3d8..b3314985b914 100644 --- a/fixtures/sftp/docker-compose-sftp.yml +++ b/fixtures/sftp/docker-compose-sftp.yml @@ -32,13 +32,7 @@ services: hard: 65536 command: foo::::upload healthcheck: - test: - [ - "CMD-SHELL", - "bash", - "-c", - "/health-check.sh" - ] + test: ["CMD-SHELL", "bash", "-c", "/health-check.sh"] interval: 10s timeout: 10s - retries: 5 \ No newline at end of file + retries: 5