Skip to content

Commit

Permalink
toml: update the alexcrichton and BurntSushi repos to their successor…
Browse files Browse the repository at this point in the history
…s toml-rs, and toml-test, record new exceptions (#21152)
  • Loading branch information
spytheman committed Apr 1, 2024
1 parent 5da1fcc commit ef48fb6
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 105 deletions.
16 changes: 16 additions & 0 deletions .github/workflows/download_full_toml_test_suites.sh
@@ -0,0 +1,16 @@
#!/usr/bin/env bash

set -ex

rm -rf vlib/toml/tests/testdata/burntsushi vlib/toml/tests/testdata/iarna vlib/toml/tests/testdata/alexcrichton vlib/toml/tests/testdata/large_toml_file_test.toml

.github/workflows/retry.sh wget https://gist.githubusercontent.com/Larpon/89b0e3d94c6903851ff15559e5df7a05/raw/62a1f87a4e37bf157f2e0bfb32d85d840c98e422/large_toml_file_test.toml -O vlib/toml/tests/testdata/large_toml_file_test.toml

.github/workflows/retry.sh git clone -n https://github.com/iarna/toml-spec-tests.git vlib/toml/tests/testdata/iarna
git -C vlib/toml/tests/testdata/iarna checkout 1880b1a

.github/workflows/retry.sh git clone -n https://github.com/toml-lang/toml-test.git vlib/toml/tests/testdata/burntsushi
git -C vlib/toml/tests/testdata/burntsushi checkout f30c716

.github/workflows/retry.sh git clone -n https://github.com/toml-rs/toml.git vlib/toml/tests/testdata/alexcrichton
git -C vlib/toml/tests/testdata/alexcrichton reset --hard 499e8c4
51 changes: 5 additions & 46 deletions .github/workflows/toml_ci.yml
Expand Up @@ -13,61 +13,20 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'push' || github.event.ref == 'refs/heads/master' || github.event.repository.full_name != 'vlang/v'
timeout-minutes: 30
env:
TOML_BS_TESTS_PATH: vlib/toml/tests/testdata/burntsushi/toml-test
TOML_BS_TESTS_PINNED_COMMIT: 4634fdf
TOML_IARNA_TESTS_PATH: vlib/toml/tests/testdata/iarna/toml-test
TOML_IARNA_TESTS_PINNED_COMMIT: 1880b1a
TOML_AC_TESTS_PATH: vlib/toml/tests/testdata/alexcrichton/toml-test
TOML_AC_TESTS_PINNED_COMMIT: 499e8c4
VTEST_TOML_DO_LARGE_FILES: 1
VTEST_TOML_DO_YAML_CONVERSION: 1
steps:

- uses: actions/checkout@v4
- name: Install dependencies
run: |
.github/workflows/retry.sh sudo apt-get update
.github/workflows/retry.sh sudo apt-get install --quiet -y jq libgc-dev
- name: Build V
run: make -j2 && ./v -cc gcc -o v cmd/v
run: make

- name: Show JQ Version
run: jq --version

- name: Run local TOML tests
run: ./v test vlib/toml

# Tests found at https://github.com/BurntSushi/toml-test
- name: Clone BurntSushi/toml-test
run: |
.github/workflows/retry.sh git clone -n https://github.com/BurntSushi/toml-test.git $TOML_BS_TESTS_PATH
.github/workflows/retry.sh git -C $TOML_BS_TESTS_PATH checkout $TOML_BS_TESTS_PINNED_COMMIT
- name: Run BurntSushi TOML tests
run: ./v vlib/toml/tests/burntsushi_toml_test.v

# Tests found at gist
- name: Get large_toml_file_test.toml
run: .github/workflows/retry.sh wget https://gist.githubusercontent.com/Larpon/89b0e3d94c6903851ff15559e5df7a05/raw/62a1f87a4e37bf157f2e0bfb32d85d840c98e422/large_toml_file_test.toml -O vlib/toml/tests/testdata/large_toml_file_test.toml

- name: Run large TOML file tests
run: ./v vlib/toml/tests/large_toml_file_test.v

# Tests found at https://github.com/iarna/toml-spec-tests
- name: Clone iarna/toml-spec-tests
run: |
.github/workflows/retry.sh git clone -n https://github.com/iarna/toml-spec-tests.git $TOML_IARNA_TESTS_PATH
git -C $TOML_IARNA_TESTS_PATH checkout $TOML_IARNA_TESTS_PINNED_COMMIT
- name: Run iarna TOML tests
run: ./v -gc boehm vlib/toml/tests/iarna_toml_spec_test.v

# Tests found at https://github.com/alexcrichton/toml-rs
- name: Clone alexcrichton/toml-rs
run: |
.github/workflows/retry.sh git clone -n https://github.com/alexcrichton/toml-rs.git $TOML_AC_TESTS_PATH
git -C $TOML_AC_TESTS_PATH checkout $TOML_AC_TESTS_PINNED_COMMIT
- name: Download more TOML testsuits
run: .github/workflows/download_full_toml_test_suites.sh

- name: Run alexcrichton TOML tests
run: ./v vlib/toml/tests/alexcrichton_toml_rs_test.v
- name: Run TOML tests
run: VTEST_TOML_DO_YAML_CONVERSION=1 VTEST_TOML_DO_LARGE_FILES=1 ./v test vlib/toml
16 changes: 8 additions & 8 deletions vlib/toml/tests/alexcrichton_toml_rs_test.v
Expand Up @@ -4,10 +4,12 @@ import toml.ast
import x.json2

const hide_oks = os.getenv('VTEST_HIDE_OK') == '1'
const no_jq = os.getenv('VNO_JQ') == '1'

// Instructions for developers:
// The actual tests and data can be obtained by doing:
// `git clone --depth 1 https://github.com/alexcrichton/toml-rs.git vlib/toml/tests/testdata/alexcrichton/toml-test`
// `git clone -n https://github.com/toml-rs/toml.git vlib/toml/tests/testdata/alexcrichton`
// `git -C vlib/toml/tests/testdata/alexcrichton reset --hard 499e8c4`
// See also the CI toml tests
// Kept for easier handling of future updates to the tests
const valid_exceptions = [
Expand Down Expand Up @@ -62,11 +64,11 @@ fn run(args []string) !string {

// test_alexcrichton_toml_rs run though 'testdata/alexcrichton/toml-test/test-suite/tests/*' if found.
fn test_alexcrichton_toml_rs() {
this_file := @FILE
test_root := os.join_path(os.dir(this_file), 'testdata', 'alexcrichton', 'toml-test')
eprintln('> running ${@LOCATION}')
test_root := '${@VROOT}/vlib/toml/tests/testdata/alexcrichton/test-suite/tests'
if os.is_dir(test_root) {
valid_test_files := os.walk_ext(os.join_path(test_root, 'test-suite', 'tests',
'valid'), '.toml')
valid_test_files := os.walk_ext(os.join_path(test_root, 'valid'), '.toml')
invalid_test_files := os.walk_ext(os.join_path(test_root, 'invalid'), '.toml')
println('Testing ${valid_test_files.len} valid TOML files...')
mut valid := 0
mut e := 0
Expand Down Expand Up @@ -94,7 +96,7 @@ fn test_alexcrichton_toml_rs() {
}

// If the command-line tool `jq` is installed, value tests can be run as well.
if jq != '' {
if jq != '' && !no_jq {
println('Testing value output of ${valid_test_files.len} valid TOML files using "${jq}"...')

if os.exists(compare_work_dir_root) {
Expand Down Expand Up @@ -171,8 +173,6 @@ fn test_alexcrichton_toml_rs() {
}
}

invalid_test_files := os.walk_ext(os.join_path(test_root, 'test-suite', 'tests',
'invalid'), '.toml')
println('Testing ${invalid_test_files.len} invalid TOML files...')
mut invalid := 0
e = 0
Expand Down
133 changes: 99 additions & 34 deletions vlib/toml/tests/burntsushi_toml_test.v
@@ -1,29 +1,83 @@
// vtest flaky: true
// vtest retry: 3

// Instructions for developers:
// The actual tests and data can be obtained by doing:
// `git clone -n https://github.com/toml-lang/toml-test.git vlib/toml/tests/testdata/burntsushi`
// `git -C vlib/toml/tests/testdata/burntsushi reset --hard f30c716
// See also the CI toml tests
import os
import toml
import toml.ast
import x.json2

const hide_oks = os.getenv('VTEST_HIDE_OK') == '1'
const no_jq = os.getenv('VNO_JQ') == '1'

// Instructions for developers:
// The actual tests and data can be obtained by doing:
// `cd vlib/toml/tests/testdata`
// `git clone --depth 1 https://github.com/BurntSushi/toml-test.git burntsushi/toml-test`
// See also the CI toml tests
// Kept for easier handling of future updates to the tests
const valid_exceptions = [
'array/open-parent-table.toml',
'comment/after-literal-no-ws.toml',
'comment/everywhere.toml',
'datetime/no-seconds.toml',
'inline-table/newline.toml',
'key/space.toml',
'key/start.toml',
'key/unicode.toml',
'string/escapes.toml',
'string/escape-esc.toml',
'string/hex-escape.toml',
'string/multiline-escaped-crlf.toml',
'string/multiline-quotes.toml',
'table/array-implicit-and-explicit-after.toml',
'table/array-within-dotted.toml',
]
const jq_not_equal = [
'do_not_remove',
'datetime/milliseconds.toml',
'float/zero.toml',
'inline-table/spaces.toml',
'spec/array-of-tables-1.toml',
'spec/float-0.toml',
'spec/float-2.toml',
]
const invalid_exceptions = [
'array/only-comma-1.toml',
'control/bare-cr.toml',
'datetime/hour-over.toml',
'datetime/mday-under.toml',
'datetime/minute-over.toml',
'datetime/month-under.toml',
'datetime/second-over.toml',
'datetime/feb-29.toml',
'datetime/feb-30.toml',
'inline-table/duplicate-key-2.toml',
'inline-table/duplicate-key-3.toml',
'inline-table/overwrite-2.toml',
'inline-table/overwrite-4.toml',
'inline-table/overwrite-5.toml',
'inline-table/overwrite-8.toml',
'local-date/feb-29.toml',
'local-date/feb-30.toml',
'local-date/mday-under.toml',
'local-date/month-under.toml',
'local-datetime/feb-29.toml',
'local-datetime/feb-30.toml',
'local-datetime/hour-over.toml',
'local-datetime/mday-under.toml',
'local-datetime/minute-over.toml',
'local-datetime/month-under.toml',
'local-datetime/second-over.toml',
'local-time/hour-over.toml',
'local-time/minute-over.toml',
'local-time/second-over.toml',
'string/multiline-escape-space-2.toml',
'table/duplicate-key-dotted-array.toml',
'table/redefine-2.toml',
]
const valid_value_exceptions = [
'do_not_remove',
]
const valid_value_exceptions = []string{}
// BUG with string interpolation of '${i64(-9223372036854775808)}') see below for workaround
//'integer/long.toml', // TODO: https://github.com/vlang/v/issues/9507

Expand Down Expand Up @@ -54,45 +108,49 @@ fn run(args []string) !string {

// test_burnt_sushi_tomltest run though 'testdata/burntsushi/toml-test/*' if found.
fn test_burnt_sushi_tomltest() {
this_file := @FILE
test_root := os.join_path(os.dir(this_file), 'testdata', 'burntsushi', 'toml-test',
'tests')
eprintln('> running ${@LOCATION}')
test_root := '${@VROOT}/vlib/toml/tests/testdata/burntsushi/tests'
if !os.is_dir(test_root) {
println('No test data directory found in "${test_root}"')
assert true
return
}
valid_folder := os.join_path('toml-test', 'tests', 'valid')
invalid_folder := os.join_path('toml-test', 'tests', 'invalid')
valid_test_files := os.walk_ext(os.join_path(test_root, 'valid'), '.toml')
println('Testing ${valid_test_files.len} valid TOML files...')
valid_folder := 'valid'
valid_test_files := os.walk_ext('${test_root}/valid', '.toml').map(it.replace('\\',
'/')).sorted()
invalid_folder := 'invalid'
invalid_test_files := os.walk_ext('${test_root}/invalid', '.toml').map(it.replace('\\',
'/')).sorted()
//
println('\nTesting ${valid_test_files.len} valid TOML files...')
mut valid := 0
mut e := 0
for i, valid_test_file in valid_test_files {
mut relative := valid_test_file.all_after(valid_folder).trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
relative := valid_test_file.all_after(valid_folder).trim_left('/')
if relative in valid_exceptions {
e++
idx := valid_exceptions.index(relative) + 1
println('SKIP [${i + 1}/${valid_test_files.len}] "${valid_test_file}" VALID EXCEPTION [${idx}/${valid_exceptions.len}]...')
continue
}
// eprintln('>>> trying to parse: ${valid_test_file} | relative: $relative')
toml_doc := toml.parse_file(valid_test_file) or {
eprintln('>>> error while parsing: ${valid_test_file}')
panic(err)
}
valid++
if !hide_oks {
println('OK [${i + 1}/${valid_test_files.len}] "${valid_test_file}"...')
}
toml_doc := toml.parse_file(valid_test_file)!
valid++
}
println('${valid}/${valid_test_files.len} TOML files were parsed correctly')
if valid_exceptions.len > 0 {
println('TODO Skipped parsing of ${valid_exceptions.len} valid TOML files...')
}

// If the command-line tool `jq` is installed, value tests can be run as well.
if jq != '' {
println('Testing value output of ${valid_test_files.len} valid TOML files using "${jq}"...')
if jq != '' && !no_jq {
println('\nTesting value output of ${valid_test_files.len} valid TOML files using "${jq}"...')

if os.exists(compare_work_dir_root) {
os.rmdir_all(compare_work_dir_root)!
Expand All @@ -105,10 +163,7 @@ fn test_burnt_sushi_tomltest() {
valid = 0
e = 0
for i, valid_test_file in valid_test_files {
mut relative := valid_test_file.all_after(valid_folder).trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
relative := valid_test_file.all_after(valid_folder).trim_left('/')
// Skip the file if we know it can't be parsed or we know that the value retrieval needs work.
if relative in valid_exceptions {
e++
Expand All @@ -127,6 +182,7 @@ fn test_burnt_sushi_tomltest() {
println('OK [${i + 1}/${valid_test_files.len}] "${valid_test_file}"...')
}
toml_doc := toml.parse_file(valid_test_file)!
// eprintln(' relative: $relative parsed')

v_toml_json_path := os.join_path(compare_work_dir_root,
os.file_name(valid_test_file).all_before_last('.') + '.v.json')
Expand All @@ -148,25 +204,34 @@ fn test_burnt_sushi_tomltest() {
panic(err.msg() + '\n${contents}')
}

assert bs_normalized_json == v_normalized_json
if relative in jq_not_equal {
e++
eprintln('>>> skipped: relative: ${relative} in jq_not_equal, bs_normalized_json != bs_normalized_json')
continue
}

if bs_normalized_json != v_normalized_json {
e++
eprintln('>>> error: relative: ${relative}, bs_normalized_json != bs_normalized_json')
continue
}

assert bs_normalized_json == v_normalized_json
valid++
}
} else {
println('> Skipping json conversion tests, since jq: ${jq} | no_jq: ${no_jq}')
}
println('${valid}/${valid_test_files.len} TOML files were parsed correctly and value checked')
if valid_value_exceptions.len > 0 {
println('TODO Skipped value checks of ${valid_value_exceptions.len} valid TOML files...')
}

invalid_test_files := os.walk_ext(os.join_path(test_root, 'invalid'), '.toml')
println('Testing ${invalid_test_files.len} invalid TOML files...')
println('\nTesting ${invalid_test_files.len} invalid TOML files...')
mut invalid := 0
e = 0
for i, invalid_test_file in invalid_test_files {
mut relative := invalid_test_file.all_after(invalid_folder).trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
relative := invalid_test_file.all_after(invalid_folder).trim_left('/')
if relative in invalid_exceptions {
e++
idx := invalid_exceptions.index(relative) + 1
Expand All @@ -178,7 +243,7 @@ fn test_burnt_sushi_tomltest() {
}
if toml_doc := toml.parse_file(invalid_test_file) {
content_that_should_have_failed := os.read_file(invalid_test_file)!
println(' This TOML should have failed:\n${'-'.repeat(40)}\n${content_that_should_have_failed}\n${'-'.repeat(40)}')
println(' This TOML from relative: ${relative}, invalid_test_file: ${invalid_test_file}, should have failed:\n${'-'.repeat(100)}\n${content_that_should_have_failed}\n${'-'.repeat(100)}')
assert false
} else {
if !hide_oks {
Expand All @@ -188,7 +253,7 @@ fn test_burnt_sushi_tomltest() {
}
invalid++
}
println('${invalid}/${invalid_test_files.len} TOML files were parsed correctly')
println('${invalid}/${invalid_test_files.len} invalid TOML files correctly had parsing errors')
if invalid_exceptions.len > 0 {
println('TODO Skipped parsing of ${invalid_exceptions.len} invalid TOML files...')
}
Expand Down

0 comments on commit ef48fb6

Please sign in to comment.