diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index c39aff4..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,174 +0,0 @@ -version: 2.1 - -executors: - golang: - parameters: - version: - type: string - docker: - - image: circleci/golang:<< parameters.version >> - -commands: - get_deps: - description: "Get go dependencies" - steps: - - run: go get github.com/jstemmer/go-junit-report - - run_test: - description: "Run unit tests for a go module" - parameters: - test_name: - type: string - module: - type: string - coverage: - default: false - type: boolean - allow_fail: - type: boolean - default: false - steps: - - run: - name: "Run tests for <>" - command: | - TEST_DIR="/tmp/test-results/<>" - mkdir -p ${TEST_DIR} - trap "go-junit-report ${TEST_DIR}/go-test-report.xml" EXIT - go test <> -race -v \ - <<# parameters.coverage >>-coverprofile=/tmp/workspace/coverage.txt -covermode=atomic<> \ - | tee /tmp/test-results/go-test.out <<# parameters.allow_fail >>|| true<> - -jobs: - go: - parameters: - version: - type: string - allow_fail: - type: boolean - default: false - executor: - name: golang - version: "<>" - working_directory: /go/src/github.com/pelletier/go-toml - environment: - GO111MODULE: "on" - steps: - - checkout - - run: mkdir -p /tmp/workspace - - run: go fmt ./... <<# parameters.allow_fail >>|| true<> - - get_deps - - run_test: - test_name: "go-toml" - module: "github.com/pelletier/go-toml" - coverage: true - allow_fail: <> - - run_test: - test_name: "tomljson" - module: "github.com/pelletier/go-toml/cmd/tomljson" - allow_fail: <> - - run_test: - test_name: "jsontoml" - module: "github.com/pelletier/go-toml/cmd/jsontoml" - allow_fail: <> - - run_test: - test_name: "tomll" - module: "github.com/pelletier/go-toml/cmd/tomll" - allow_fail: <> - - run_test: - test_name: "query" - module: "github.com/pelletier/go-toml/query" - allow_fail: <> - - store_test_results: - path: /tmp/test-results - codecov: - docker: - - image: "circleci/golang:1.12" - steps: - - attach_workspace: - at: /tmp/workspace - - run: - name: "upload to codecov" - working_directory: /tmp/workspace - command: | - curl https://codecov.io/bash > codecov.sh - bash codecov.sh -v - docker: - docker: - - image: "circleci/golang:1.12" - steps: - - checkout - - setup_remote_docker: - docker_layer_caching: true - - run: docker build -t pelletier/go-toml:$CIRCLE_SHA1 . - - run: - name: "Publish docker image" - command: | - if [ "${CIRCLE_PR_REPONAME}" == "" ]; then - IMAGE_NAME="pelletier/go-toml" - IMAGE_SHA_TAG="${IMAGE_NAME}:$CIRCLE_SHA1" - if [ "${CIRCLE_BRANCH}" = "master" ]; then - docker login -u $DOCKER_USER -p $DOCKER_PASS - docker tag ${IMAGE_SHA_TAG} ${IMAGE_NAME}:latest - docker push ${IMAGE_NAME}:latest - fi - if [ "${CIRCLE_TAG}" != "" ]; then - docker login -u $DOCKER_USER -p $DOCKER_PASS - docker tag ${IMAGE_SHA_TAG} ${IMAGE_NAME}:${CIRCLE_TAG} - docker push ${IMAGE_NAME}:${CIRCLE_TAG} - fi - else - echo "not pushing docker image for forked repo" - fi - -workflows: - version: 2.1 - build: - jobs: - - go: - name: "go1_11" - version: "1.11" - - go: - name: "go1_12" - version: "1.12" - post-steps: - - run: go tool cover -html=/tmp/workspace/coverage.txt -o coverage.html - - store_artifacts: - path: /tmp/workspace/coverage.txt - - store_artifacts: - path: coverage.html - - persist_to_workspace: - root: /tmp/workspace - paths: - - coverage.txt - - go: - name: "gotip" - version: "1.12" # use as base - allow_fail: true - pre-steps: - - restore_cache: - keys: - - go-tip-source - - run: - name: "Compile go tip" - command: | - if [ ! -d "/tmp/go" ]; then - git clone https://go.googlesource.com/go /tmp/go - fi - cd /tmp/go - git checkout master - git pull - cd src - ./make.bash - echo 'export PATH="/tmp/go/bin:$PATH"' >> $BASH_ENV - - run: go version - - save_cache: - key: go-tip-source - paths: - - "/tmp/go" - - codecov: - requires: - - go1_11 - - go1_12 - - docker: - requires: - - codecov diff --git a/.github/workflows/fuzzit.yml b/.github/workflows/fuzzit.yml new file mode 100644 index 0000000..d2e297c --- /dev/null +++ b/.github/workflows/fuzzit.yml @@ -0,0 +1,17 @@ +name: Fuzzit +on: + push: + branches: + - master +jobs: + fuzzing: + name: Run fuzzing + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v1 + with: + go-version: '1.13' + - uses: actions/checkout@v1 + - run: ./fuzzit.sh + env: + TYPE: fuzzing diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..c62a517 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,80 @@ +name: Go +on: [push] +jobs: + test: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + go: ['1.12', '1.13'] + runs-on: ${{ matrix.os }} + name: Test Go ${{ matrix.go }} on ${{ matrix.os }} + steps: + - uses: pelletier/setup-go@v1.0.2-patch + with: + go-version: ${{ matrix.go }} + - uses: actions/checkout@v1 + - run: go test ./... + + coverage: + name: Coverage + runs-on: ubuntu-latest + steps: + - uses: pelletier/setup-go@v1.0.2-patch + with: + go-version: '1.12' + - uses: actions/checkout@v1 + - run: go test -race -coverprofile=coverage.txt -covermode=atomic + - run: bash <(curl -s https://codecov.io/bash) + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + fmt: + name: Go fmt + runs-on: ubuntu-latest + steps: + - uses: pelletier/setup-go@v1.0.2-patch + - uses: actions/checkout@v1 + - run: go fmt ./... + + benchmark: + name: Run benchmark + runs-on: ubuntu-latest + steps: + - uses: pelletier/setup-go@v1.0.2-patch + with: + go-version: '1.13' + - uses: actions/checkout@v1 + - run: ./benchmark.sh master https://github.com/$GITHUB_REPOSITORY.git + + fuzzing: + name: Run fuzzing + runs-on: ubuntu-latest + steps: + - uses: pelletier/setup-go@v1.0.2-patch + with: + go-version: '1.13' + - uses: actions/checkout@v1 + - run: mkdir -p /home/runner/go/src/github.com/pelletier/go-toml + | cp -R . /home/runner/go/src/github.com/pelletier/go-toml + - run: ./fuzzit.sh + env: + TYPE: local-regression + + docker: + name: Build Docker image + runs-on: ubuntu-latest + needs: [test, fuzzing, fmt] + steps: + - uses: actions/setup-go@v1 + with: + go-version: '1.13' + - uses: actions/checkout@v1 + - run: docker build -t toml . + - uses: actions/docker/tag@master + with: + args: toml pelletier/go-toml + - run: docker tag pelletier/go-toml pelletier/go-toml:latest + if: github.ref == 'heads/refs/master' + - name: Docker login + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin + - run: docker push pelletier/go-toml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ae0f7ef..0000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -dist: bionic -language: go -services: - - docker - -matrix: - allow_failures: - - go: tip - fast_finish: true - include: - - go: 1.11.x - - go: 1.12.x - env: WITH_FUZZ=true - - go: tip -env: - - GO111MODULE=on - - secure: "hhoCl77LhP25e+dLzmKphjdj+ep6jRfqON1JoxdvRXYjQqmhtxWSTJFqPyMLz2fNGSN8HUcyZZKTrOG6HkrapiIR5kjrnvm6Fzjp+IfClPoPu8xQUIbKd8E3BrDwvvF1JkkLImozxZbrbJhksJqN+QgG/Lv2vs6wkAfQjvGcRTQ=" -script: - - if [ -n "$(go fmt ./...)" ]; then exit 1; fi - - go test github.com/pelletier/go-toml -race -coverprofile=coverage.txt -covermode=atomic - - go test github.com/pelletier/go-toml/cmd/tomljson - - go test github.com/pelletier/go-toml/cmd/jsontoml - - go test github.com/pelletier/go-toml/cmd/tomll - - go test github.com/pelletier/go-toml/query - - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git - - ./fuzzit.sh - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index d158ba5..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: "{build}" - -# Source Config -clone_folder: c:\gopath\src\github.com\pelletier\go-toml - -# Build host -environment: - GOPATH: c:\gopath - DEPTESTBYPASS501: 1 - GOVERSION: 1.12 - GO111MODULE: on - -init: - - git config --global core.autocrlf input - -# Build -install: - # Install the specific Go version. - - rmdir c:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go%GOVERSION%.windows-amd64.msi - - msiexec /i go%GOVERSION%.windows-amd64.msi /q - - choco install bzr - - set Path=c:\go\bin;c:\gopath\bin;C:\Program Files (x86)\Bazaar\;C:\Program Files\Mercurial\%Path% - - go version - - go env - -build: false -deploy: false - -test_script: - - go test github.com/pelletier/go-toml - - go test github.com/pelletier/go-toml/cmd/tomljson - - go test github.com/pelletier/go-toml/cmd/jsontoml - - go test github.com/pelletier/go-toml/cmd/tomll - - go test github.com/pelletier/go-toml/query diff --git a/benchmark.sh b/benchmark.sh index 8b8bb52..8300bd3 100755 --- a/benchmark.sh +++ b/benchmark.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -e +set -ex reference_ref=${1:-master} reference_git=${2:-.} @@ -29,4 +29,4 @@ go test -bench=. -benchmem | tee ${local_benchmark} echo "" echo "=== diff" -benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} \ No newline at end of file +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} diff --git a/cmd/jsontoml/main.go b/cmd/jsontoml/main.go index 153ad16..0acc61e 100644 --- a/cmd/jsontoml/main.go +++ b/cmd/jsontoml/main.go @@ -37,6 +37,7 @@ func processMain(files []string, defaultInput io.Reader, output io.Writer, error file, err := os.Open(files[0]) if err != nil { printError(err, errorOutput) + return -1 } inputReader = file defer file.Close() @@ -60,9 +61,9 @@ func reader(r io.Reader) (string, error) { if err != nil { return "", err } - error := json.Unmarshal(jsonBytes, &jsonMap) - if error != nil { - return "", error + err = json.Unmarshal(jsonBytes, &jsonMap) + if err != nil { + return "", err } tree, err := toml.TreeFromMap(jsonMap) diff --git a/cmd/jsontoml/main_test.go b/cmd/jsontoml/main_test.go index d5229de..c591c66 100644 --- a/cmd/jsontoml/main_test.go +++ b/cmd/jsontoml/main_test.go @@ -85,7 +85,6 @@ func TestProcessMainReadFromMissingFile(t *testing.T) { ` } else { expectedError = `open /this/file/does/not/exist: no such file or directory -invalid argument ` } diff --git a/fuzzit.sh b/fuzzit.sh index 035ff95..05d141e 100755 --- a/fuzzit.sh +++ b/fuzzit.sh @@ -1,12 +1,6 @@ #!/bin/bash set -xe -# fuzz only in one configuration -# there's no benefit to fuzzing with different go versions -if [ -z ${WITH_FUZZ} ]; then - exit 0 -fi - # go-fuzz doesn't support modules yet, so ensure we do everything # in the old style GOPATH way export GO111MODULE="off" @@ -28,13 +22,5 @@ clang -fsanitize=fuzzer ${TARGET}.a -o ${TARGET} wget -q -O fuzzit https://github.com/fuzzitdev/fuzzit/releases/download/v2.4.23/fuzzit_Linux_x86_64 chmod a+x fuzzit -# upload fuzz target for long fuzz testing on fuzzit.dev server -# or run locally for regression, depending on --type -if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then - TYPE=fuzzing -else - TYPE=local-regression -fi - # TODO: change kkowalczyk to go-toml and create toml-fuzzer target there ./fuzzit create job --type $TYPE go-toml/${TARGET} ${TARGET} diff --git a/marshal_OrderPreserve_Map_test.toml b/marshal_OrderPreserve_Map_test.toml deleted file mode 100644 index a3bd513..0000000 --- a/marshal_OrderPreserve_Map_test.toml +++ /dev/null @@ -1,17 +0,0 @@ -title = "TOML Marshal Testing" - -[basic_map] - one = "one" - two = "two" - -[long_map] - a7 = "1" - b3 = "2" - c8 = "3" - d4 = "4" - e6 = "5" - f5 = "6" - g10 = "7" - h1 = "8" - i2 = "9" - j9 = "10" diff --git a/marshal_test.go b/marshal_test.go index c33e748..107587e 100644 --- a/marshal_test.go +++ b/marshal_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "os" "reflect" "strings" "testing" @@ -55,6 +56,107 @@ Ystrlist = ["Howdy","Hey There"] String2 = "Three" `) +var marshalTestToml = []byte(`title = "TOML Marshal Testing" + +[basic] + bool = true + date = 1979-05-27T07:32:00Z + float = 123.4 + float64 = 123.456782132399 + int = 5000 + string = "Bite me" + uint = 5001 + +[basic_lists] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + floats = [12.3,45.6,78.9] + ints = [8001,8001,8002] + strings = ["One","Two","Three"] + uints = [5002,5003] + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.first] + name = "First" + + [subdoc.second] + name = "Second" + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" + +[[subdocptrs]] + name = "Second" +`) + +var marshalOrderPreserveToml = []byte(`title = "TOML Marshal Testing" + +[basic_lists] + floats = [12.3,45.6,78.9] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + ints = [8001,8001,8002] + uints = [5002,5003] + strings = ["One","Two","Three"] + +[[subdocptrs]] + name = "Second" + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.second] + name = "Second" + + [subdoc.first] + name = "First" + +[basic] + uint = 5001 + bool = true + float = 123.4 + float64 = 123.456782132399 + int = 5000 + string = "Bite me" + date = 1979-05-27T07:32:00Z + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" +`) + +var mashalOrderPreserveMapToml = []byte(`title = "TOML Marshal Testing" + +[basic_map] + one = "one" + two = "two" + +[long_map] + a7 = "1" + b3 = "2" + c8 = "3" + d4 = "4" + e6 = "5" + f5 = "6" + g10 = "7" + h1 = "8" + i2 = "9" + j9 = "10" +`) + func TestBasicMarshal(t *testing.T) { result, err := Marshal(basicTestData) if err != nil { @@ -233,9 +335,8 @@ func TestDocMarshal(t *testing.T) { if err != nil { t.Fatal(err) } - expected, _ := ioutil.ReadFile("marshal_test.toml") - if !bytes.Equal(result, expected) { - t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result) + if !bytes.Equal(result, marshalTestToml) { + t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", marshalTestToml, result) } } @@ -245,9 +346,8 @@ func TestDocMarshalOrdered(t *testing.T) { if err != nil { t.Fatal(err) } - expected, _ := ioutil.ReadFile("marshal_OrderPreserve_test.toml") - if !bytes.Equal(result.Bytes(), expected) { - t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result.Bytes()) + if !bytes.Equal(result.Bytes(), marshalOrderPreserveToml) { + t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", marshalOrderPreserveToml, result.Bytes()) } } @@ -256,9 +356,8 @@ func TestDocMarshalMaps(t *testing.T) { if err != nil { t.Fatal(err) } - expected, _ := ioutil.ReadFile("marshal_OrderPreserve_Map_test.toml") - if !bytes.Equal(result, expected) { - t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result) + if !bytes.Equal(result, mashalOrderPreserveMapToml) { + t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", mashalOrderPreserveMapToml, result) } } @@ -268,9 +367,8 @@ func TestDocMarshalOrderedMaps(t *testing.T) { if err != nil { t.Fatal(err) } - expected, _ := ioutil.ReadFile("marshal_OrderPreserve_Map_test.toml") - if !bytes.Equal(result.Bytes(), expected) { - t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result.Bytes()) + if !bytes.Equal(result.Bytes(), mashalOrderPreserveMapToml) { + t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", mashalOrderPreserveMapToml, result.Bytes()) } } @@ -279,16 +377,15 @@ func TestDocMarshalPointer(t *testing.T) { if err != nil { t.Fatal(err) } - expected, _ := ioutil.ReadFile("marshal_test.toml") - if !bytes.Equal(result, expected) { - t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result) + + if !bytes.Equal(result, marshalTestToml) { + t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", marshalTestToml, result) } } func TestDocUnmarshal(t *testing.T) { result := testDoc{} - tomlData, _ := ioutil.ReadFile("marshal_test.toml") - err := Unmarshal(tomlData, &result) + err := Unmarshal(marshalTestToml, &result) expected := docData if err != nil { t.Fatal(err) @@ -301,11 +398,22 @@ func TestDocUnmarshal(t *testing.T) { } func TestDocPartialUnmarshal(t *testing.T) { - result := testDocSubs{} + file, err := ioutil.TempFile("", "test-*.toml") + if err != nil { + t.Fatal(err) + } + defer os.Remove(file.Name()) - tree, _ := LoadFile("marshal_test.toml") + err = ioutil.WriteFile(file.Name(), marshalTestToml, 0) + if err != nil { + t.Fatal(err) + } + + tree, _ := LoadFile(file.Name()) subTree := tree.Get("subdoc").(*Tree) - err := subTree.Unmarshal(&result) + + result := testDocSubs{} + err = subTree.Unmarshal(&result) expected := docData.Subdocs if err != nil { t.Fatal(err)