160 lines
5.0 KiB
Go
160 lines
5.0 KiB
Go
/*
|
|
Copyright 2018 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package integration
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
"github.com/onsi/gomega/gexec"
|
|
)
|
|
|
|
const (
|
|
testdataDir = "./testdata"
|
|
inputDir = testdataDir + "/listtype" + "," + testdataDir + "/dummytype"
|
|
outputBase = "pkg"
|
|
outputPackage = "generated"
|
|
outputBaseFileName = "openapi_generated"
|
|
generatedSwaggerFileName = "generated.json"
|
|
generatedReportFileName = "generated.report"
|
|
goldenSwaggerFileName = "golden.json"
|
|
goldenReportFileName = "golden.report"
|
|
timeoutSeconds = 5.0
|
|
)
|
|
|
|
func TestGenerators(t *testing.T) {
|
|
RegisterFailHandler(Fail)
|
|
RunSpecs(t, "Integration Test Suite")
|
|
}
|
|
|
|
var _ = Describe("Open API Definitions Generation", func() {
|
|
|
|
var (
|
|
workingDirectory string
|
|
tempDir string
|
|
terr error
|
|
openAPIGenPath string
|
|
)
|
|
|
|
testdataFile := func(filename string) string { return filepath.Join(testdataDir, filename) }
|
|
generatedFile := func(filename string) string { return filepath.Join(tempDir, filename) }
|
|
|
|
BeforeSuite(func() {
|
|
// Explicitly manage working directory
|
|
abs, err := filepath.Abs("")
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
workingDirectory = abs
|
|
|
|
// Create a temporary directory for generated swagger files.
|
|
tempDir, terr = ioutil.TempDir("./", "openapi")
|
|
Expect(terr).ShouldNot(HaveOccurred())
|
|
|
|
// Build the OpenAPI code generator.
|
|
By("building openapi-gen")
|
|
binary_path, berr := gexec.Build("../../cmd/openapi-gen/openapi-gen.go")
|
|
Expect(berr).ShouldNot(HaveOccurred())
|
|
openAPIGenPath = binary_path
|
|
|
|
// Run the OpenAPI code generator, creating OpenAPIDefinition code
|
|
// to be compiled into builder.
|
|
By("processing go idl with openapi-gen")
|
|
gr := generatedFile(generatedReportFileName)
|
|
command := exec.Command(openAPIGenPath,
|
|
"-i", inputDir,
|
|
"-o", outputBase,
|
|
"-p", outputPackage,
|
|
"-O", outputBaseFileName,
|
|
"-r", gr,
|
|
)
|
|
command.Dir = workingDirectory
|
|
session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
Eventually(session, timeoutSeconds).Should(gexec.Exit(0))
|
|
|
|
By("writing swagger")
|
|
// Create the OpenAPI swagger builder.
|
|
binary_path, berr = gexec.Build("./builder/main.go")
|
|
Expect(berr).ShouldNot(HaveOccurred())
|
|
|
|
// Execute the builder, generating an OpenAPI swagger file with definitions.
|
|
gs := generatedFile(generatedSwaggerFileName)
|
|
By("writing swagger to " + gs)
|
|
command = exec.Command(binary_path, gs)
|
|
command.Dir = workingDirectory
|
|
session, err = gexec.Start(command, GinkgoWriter, GinkgoWriter)
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
Eventually(session, timeoutSeconds).Should(gexec.Exit(0))
|
|
})
|
|
|
|
AfterSuite(func() {
|
|
os.RemoveAll(tempDir)
|
|
gexec.CleanupBuildArtifacts()
|
|
})
|
|
|
|
Describe("openapi-gen --verify", func() {
|
|
It("Verifies that the existing files are correct", func() {
|
|
command := exec.Command(openAPIGenPath,
|
|
"-i", inputDir,
|
|
"-o", outputBase,
|
|
"-p", outputPackage,
|
|
"-O", outputBaseFileName,
|
|
"-r", testdataFile(goldenReportFileName),
|
|
"--verify-only",
|
|
)
|
|
command.Dir = workingDirectory
|
|
session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
Eventually(session, timeoutSeconds).Should(gexec.Exit(0))
|
|
})
|
|
})
|
|
|
|
Describe("Validating OpenAPI Definition Generation", func() {
|
|
It("Generated OpenAPI swagger definitions should match golden files", func() {
|
|
// Diff the generated swagger against the golden swagger. Exit code should be zero.
|
|
command := exec.Command(
|
|
"diff",
|
|
testdataFile(goldenSwaggerFileName),
|
|
generatedFile(generatedSwaggerFileName),
|
|
)
|
|
command.Dir = workingDirectory
|
|
session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
Eventually(session, timeoutSeconds).Should(gexec.Exit(0))
|
|
})
|
|
})
|
|
|
|
Describe("Validating API Rule Violation Reporting", func() {
|
|
It("Generated API rule violations should match golden report files", func() {
|
|
// Diff the generated report against the golden report. Exit code should be zero.
|
|
command := exec.Command(
|
|
"diff",
|
|
testdataFile(goldenReportFileName),
|
|
generatedFile(generatedReportFileName),
|
|
)
|
|
command.Dir = workingDirectory
|
|
session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
Eventually(session, timeoutSeconds).Should(gexec.Exit(0))
|
|
})
|
|
})
|
|
})
|