Skip to content

Commit

Permalink
support rdl file without version on parsec 2.1.7 (#75)
Browse files Browse the repository at this point in the history
  • Loading branch information
SparkChuang committed May 30, 2022
1 parent e3bd3cb commit d80bf56
Show file tree
Hide file tree
Showing 10 changed files with 319 additions and 10 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ target/
tests/generated/
*.iml
*.rdl
!testdata/*.rdl
70 changes: 70 additions & 0 deletions cmd/rdl-gen-parsec-java-client/gentemplate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"io/ioutil"
"encoding/json"
"github.com/ardielle/ardielle-go/rdl"
"github.com/stretchr/testify/assert"
"github.com/yahoo/parsec-rdl-gen/utils"
"bufio"
"bytes"
Expand Down Expand Up @@ -113,3 +114,72 @@ func TestUriConstruct(test *testing.T) {
realOut, expectedOut)
}
}

func TestGenerateClientWithoutVersion(t *testing.T) {
testOutputDir := getTempDir(t, ".", "testOutput-")
path := testOutputDir + "/com/yahoo/shopping/parsec_generated/"

//generate output result
schema, err := rdl.ParseRDLFile("../../testdata/sampleWithoutVersion.rdl", false, false, false)
if err != nil {
t.Fatalf("%v", err)
}
GenerateJavaClient("withoutVersion", schema, testOutputDir, string(schema.Namespace), "", false)

//asserts
clientContent := checkAndGetFileContent(t, path, "SampleClient.java")
assert.Contains(t, string(clientContent), "CompletableFuture<User>")
assert.Contains(t, string(clientContent), "postUser(User")

clientImplContent := checkAndGetFileContent(t, path, "SampleClientImpl.java")
assert.Contains(t, string(clientImplContent), "CompletableFuture<User>")
assert.Contains(t, string(clientImplContent), "postUser(User")

//clean up folder
defer os.RemoveAll(testOutputDir)
}

func TestGenerateClientWithVersion(t *testing.T) {
testOutputDir := getTempDir(t, ".", "testOutput-")
path := testOutputDir + "/com/yahoo/shopping/parsec_generated/"

//generate output result
schema, err := rdl.ParseRDLFile("../../testdata/sampleWithVersion.rdl", false, false, false)
if err != nil {
t.Fatalf("%v", err)
}
GenerateJavaClient("withVersion", schema, testOutputDir, string(schema.Namespace), "", false)

//asserts
clientContent := checkAndGetFileContent(t, path, "SampleClient.java")
assert.Contains(t, string(clientContent), "CompletableFuture<UserV2>")
assert.Contains(t, string(clientContent), "postUser(UserV2")

clientImplContent := checkAndGetFileContent(t, path, "SampleClientImpl.java")
assert.Contains(t, string(clientImplContent), "CompletableFuture<UserV2>")
assert.Contains(t, string(clientImplContent), "postUser(UserV2")

// clean up folder
defer os.RemoveAll(testOutputDir)
}

func checkAndGetFileContent(t *testing.T, path string, fileName string) []byte {
//1. check correspanding client file exists
if _, err := os.Stat(path + fileName); err != nil {
t.Fatalf("file not exists: %s", path+fileName)
}
//2. check file content
content, err := os.ReadFile(path + fileName)
if err != nil {
t.Fatalf("can not read file: %s", path+fileName)
}
return content
}

func getTempDir(t *testing.T, dir string, prefix string) string {
dir, err := ioutil.TempDir(dir, prefix)
if err != nil {
t.Fatalf("%v", err)
}
return dir
}
4 changes: 3 additions & 1 deletion cmd/rdl-gen-parsec-java-client/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,5 +465,7 @@ func (gen *javaClientGenerator) clientMethodOverloadContent(r *rdl.Resource) str
}

func (gen *javaClientGenerator) javaType(reg rdl.TypeRegistry, rdlType rdl.TypeRef, optional bool, items rdl.TypeRef, keys rdl.TypeRef) string {
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix, *gen.schema.Version)
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix, ver)
}
10 changes: 7 additions & 3 deletions cmd/rdl-gen-parsec-java-model/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ func generateJavaType(banner string, schema *rdl.Schema, registry rdl.TypeRegist
return nil
}
cName := utils.Capitalize(string(tName))
ver := *schema.Version
ver, err := utils.GetSchemaVersionOrDefault(schema, 1)
checkErr(err)
if ver > 1 {
cName += "V" + strconv.Itoa(int(ver))
}
Expand Down Expand Up @@ -594,7 +595,8 @@ func (gen *javaModelGenerator) generateEnum(t *rdl.Type) {
}
et := t.EnumTypeDef
name := utils.Capitalize(string(et.Name))
ver := *gen.schema.Version
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
if ver > 1 {
name += "V" + strconv.Itoa(int(ver))
}
Expand Down Expand Up @@ -939,7 +941,9 @@ func (gen *javaModelGenerator) getValidationGroupValue(annotationValue string) s
}

func (gen *javaModelGenerator) javaType(reg rdl.TypeRegistry, rdlType rdl.TypeRef, optional bool, items rdl.TypeRef, keys rdl.TypeRef) string {
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix, *gen.schema.Version)
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix, ver)
}

func javaFieldName(n rdl.Identifier) string {
Expand Down
61 changes: 61 additions & 0 deletions cmd/rdl-gen-parsec-java-model/main_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package main

import (
"io/ioutil"
"os"
"strings"
"testing"

Expand Down Expand Up @@ -223,3 +225,62 @@ func TestAppendAnnotation(t *testing.T) {
gen.appendAnnotation("key", "value")
assert.Equal(t, "key(value)", strings.Join(gen.body, ""))
}

func TestGenerateModelWithoutVersion(t *testing.T) {
testOutputDir := getTempDir(t, ".", "testOutput-")
path := testOutputDir + "/com/yahoo/shopping/parsec_generated/"

//generate output result
schema, err := rdl.ParseRDLFile("../../testdata/sampleWithoutVersion.rdl", false, false, false)
if err != nil {
t.Fatalf("%v", err)
}
GenerateJavaModel("withoutVersion", schema, testOutputDir, true, "", false, "upper_first")

//asserts
content := checkAndGetFileContent(t, path, "User.java")
assert.Contains(t, string(content), "class User")

// clean up folder
defer os.RemoveAll(testOutputDir)
}

func TestGenerateModelWithVersion(t *testing.T) {
testOutputDir := getTempDir(t, ".", "testOutput-")
path := testOutputDir + "/com/yahoo/shopping/parsec_generated/"

//generate output result
schema, err := rdl.ParseRDLFile("../../testdata/sampleWithVersion.rdl", false, false, false)
if err != nil {
t.Fatalf("%v", err)
}
GenerateJavaModel("withVersion", schema, testOutputDir, true, "", false, "upper_first")

//asserts
content := checkAndGetFileContent(t, path, "UserV2.java")
assert.Contains(t, string(content), "class UserV2")

// clean up folder
defer os.RemoveAll(testOutputDir)
}

func checkAndGetFileContent(t *testing.T, path string, fileName string) []byte {
//1. check correspanding client file exists
if _, err := os.Stat(path + fileName); err != nil {
t.Fatalf("file not exists: %s", path+fileName)
}
//2. check file content
content, err := os.ReadFile(path + fileName)
if err != nil {
t.Fatalf("can not read file: %s", path+fileName)
}
return content
}

func getTempDir(t *testing.T, dir string, prefix string) string {
dir, err := ioutil.TempDir(dir, prefix)
if err != nil {
t.Fatalf("%v", err)
}
return dir
}
108 changes: 108 additions & 0 deletions cmd/rdl-gen-parsec-java-server/genServerTemplate_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package main

import (
"io/ioutil"
"os"
"testing"

"github.com/ardielle/ardielle-go/rdl"
"github.com/stretchr/testify/assert"
)

func TestGenerateServerWithoutVersion(t *testing.T) {
testOutputDir := getTempDir(t, ".", "testOutput-")
path := testOutputDir + "/com/yahoo/shopping/parsec_generated/"
srcPath := "./src/main/java/com/yahoo/shopping/"

//generate output result
schema, err := rdl.ParseRDLFile("../../testdata/sampleWithoutVersion.rdl", false, false, false)
if err != nil {
t.Fatalf("%v", err)
}
GenerateJavaServer("withoutVersion", schema, testOutputDir, true, true, true, true, string(schema.Namespace), false)

//asserts
resourcesContent := checkAndGetFileContent(t, path, "SampleResources.java")
assert.Contains(t, string(resourcesContent), "class SampleResources")
assert.Contains(t, string(resourcesContent), "@Path(\"/sample\")")
assert.Contains(t, string(resourcesContent), "User user")

handlerContent := checkAndGetFileContent(t, path, "SampleHandler.java")
assert.Contains(t, string(handlerContent), "interface SampleHandler")
assert.Contains(t, string(handlerContent), "public User postUsers(ResourceContext context, User user)")
assert.Contains(t, string(handlerContent), "public User getUsersById(ResourceContext context, Integer id)")

serverContent := checkAndGetFileContent(t, path, "SampleServer.java")
assert.Contains(t, string(serverContent), "class SampleServer")
assert.Contains(t, string(serverContent), "bind(handler).to(SampleHandler.class)")

hImplContent := checkAndGetFileContent(t, srcPath, "SampleHandlerImpl.java")
assert.Contains(t, string(hImplContent), "class SampleHandlerImpl")
assert.Contains(t, string(hImplContent), "implements SampleHandler")
assert.Contains(t, string(hImplContent), "public User postUsers(ResourceContext context, User user)")
assert.Contains(t, string(hImplContent), "public User getUsersById(ResourceContext context, Integer id)")

// clean up folder
defer os.RemoveAll(testOutputDir)
defer os.RemoveAll("./src")
}

func TestGenerateServerWithVersion(t *testing.T) {
testOutputDir := getTempDir(t, ".", "testOutput-")
path := testOutputDir + "/com/yahoo/shopping/parsec_generated/"
srcPath := "./src/main/java/com/yahoo/shopping/"

//generate output result
schema, err := rdl.ParseRDLFile("../../testdata/sampleWithVersion.rdl", false, false, false)
if err != nil {
t.Fatalf("%v", err)
}

GenerateJavaServer("withVersion", schema, testOutputDir, true, true, true, true, string(schema.Namespace), false)

//asserts
resourcesContent := checkAndGetFileContent(t, path, "SampleV2Resources.java")
assert.Contains(t, string(resourcesContent), "class SampleV2Resources")
assert.Contains(t, string(resourcesContent), "@Path(\"/sample/v2\")")
assert.Contains(t, string(resourcesContent), "UserV2 user")

handlerContent := checkAndGetFileContent(t, path, "SampleV2Handler.java")
assert.Contains(t, string(handlerContent), "interface SampleV2Handler")
assert.Contains(t, string(handlerContent), "public UserV2 postUsers(ResourceContext context, UserV2 user)")
assert.Contains(t, string(handlerContent), "public UserV2 getUsersById(ResourceContext context, Integer id)")

serverContent := checkAndGetFileContent(t, path, "SampleV2Server.java")
assert.Contains(t, string(serverContent), "class SampleV2Server")
assert.Contains(t, string(serverContent), "bind(handler).to(SampleV2Handler.class)")

hImplContent := checkAndGetFileContent(t, srcPath, "SampleV2HandlerImpl.java")
assert.Contains(t, string(hImplContent), "class SampleV2HandlerImpl")
assert.Contains(t, string(hImplContent), "implements SampleV2Handler")
assert.Contains(t, string(hImplContent), "public UserV2 postUsers(ResourceContext context, UserV2 user)")
assert.Contains(t, string(hImplContent), "public UserV2 getUsersById(ResourceContext context, Integer id)")

// clean up folder
defer os.RemoveAll(testOutputDir)
defer os.RemoveAll("./src")
}

func checkAndGetFileContent(t *testing.T, path string, fileName string) []byte {
//1. check correspanding client file exists
if _, err := os.Stat(path + fileName); err != nil {
t.Fatalf("file not exists: %s", path+fileName)
}
//2. check file content
content, err := os.ReadFile(path + fileName)
if err != nil {
t.Fatalf("can not read file: %s", path+fileName)
}
return content
}

func getTempDir(t *testing.T, dir string, prefix string) string {
dir, err := ioutil.TempDir(dir, prefix)
if err != nil {
t.Fatalf("%v", err)
}
return dir
}
22 changes: 16 additions & 6 deletions cmd/rdl-gen-parsec-java-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ func GenerateJavaServer(banner string, schema *rdl.Schema, outdir string, genAnn
return err
}
cName := utils.Capitalize(string(schema.Name))
ver := *schema.Version
ver, err := utils.GetSchemaVersionOrDefault(schema, 1)
checkErr(err)
if ver > 1 { // if rdl version > 1, we append V{version} in class name
cName += "V" + strconv.Itoa(int(ver))
}
Expand Down Expand Up @@ -155,7 +156,8 @@ func GenerateJavaServer(banner string, schema *rdl.Schema, outdir string, genAnn
gen = &javaServerGenerator{reg, schema, cName, out, nil, banner, genAnnotations, nil, genUsingPath, namespace, isPcSuffix}
packageName := utils.JavaGenerationPackage(schema, namespace)

ver := *schema.Version
ver, err = utils.GetSchemaVersionOrDefault(schema, 1)
checkErr(err)
// import user defined struct classes
for _, t := range schema.Types {
tName, tType, _ := rdl.TypeInfo(t)
Expand Down Expand Up @@ -803,7 +805,9 @@ func (gen *javaServerGenerator) makeJavaTypeRef(reg rdl.TypeRegistry, t *rdl.Typ
}

func (gen *javaServerGenerator) javaType(reg rdl.TypeRegistry, rdlType rdl.TypeRef, optional bool, items rdl.TypeRef, keys rdl.TypeRef) string {
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix, *gen.schema.Version)
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix, ver)
}

func (gen *javaServerGenerator) processTemplate(templateSource string) error {
Expand Down Expand Up @@ -923,7 +927,9 @@ func (gen *javaServerGenerator) handlerBody(r *rdl.Resource) string {
fargs = append(fargs, bodyName)
}
}
methName, _ := javaMethodName(gen.registry, r, gen.genUsingPath, gen.isPcSuffix, *gen.schema.Version)
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
methName, _ := javaMethodName(gen.registry, r, gen.genUsingPath, gen.isPcSuffix, ver)
sargs := ""
if len(fargs) > 0 {
sargs = ", " + strings.Join(fargs, ", ")
Expand Down Expand Up @@ -1070,7 +1076,9 @@ func (gen *javaServerGenerator) handlerSignature(r *rdl.Resource) string {
spec += " @Consumes(\"application/json;charset=utf-8\")\n"
}
}
methName, _ := javaMethodName(gen.registry, r, gen.genUsingPath, gen.isPcSuffix, *gen.schema.Version)
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
methName, _ := javaMethodName(gen.registry, r, gen.genUsingPath, gen.isPcSuffix, ver)
return spec + " public " + returnType + " " + methName + "(" + strings.Join(params, ", ") + "\n )"
}

Expand Down Expand Up @@ -1239,7 +1247,9 @@ func (gen *javaServerGenerator) serverMethodSignature(r *rdl.Resource) string {
returnType := gen.javaType(reg, r.Type, false, "", "")
//noContent := r.Expected == "NO_CONTENT" && r.Alternatives == nil
//FIX: if nocontent, return nothing, have a void result, and don't "@Produces" anything
methName, params := javaMethodName(reg, r, gen.genUsingPath, gen.isPcSuffix, *gen.schema.Version)
ver, err := utils.GetSchemaVersionOrDefault(gen.schema, 1)
checkErr(err)
methName, params := javaMethodName(reg, r, gen.genUsingPath, gen.isPcSuffix, ver)
sparams := ""
if len(params) > 0 {
sparams = ", " + strings.Join(params, ", ")
Expand Down
22 changes: 22 additions & 0 deletions testdata/sampleWithVersion.rdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace com.yahoo.shopping;
name sample;
version 2;

// define datatype
type User struct {
int32 id;
string name;
}

// define endpoints
// create a new user
resource User POST "/users" {
User user;
expected CREATED;
}

// get a user by id
resource User GET "/users/{id}" {
int32 id;
expected OK;
}
Loading

0 comments on commit d80bf56

Please sign in to comment.