registry_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // Copyright 2022 EMQ Technologies Co., Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package schema
  15. import (
  16. "github.com/lf-edge/ekuiper/internal/conf"
  17. "github.com/lf-edge/ekuiper/internal/testx"
  18. "io/ioutil"
  19. "net/http"
  20. "net/http/httptest"
  21. "os"
  22. "path/filepath"
  23. "reflect"
  24. "testing"
  25. )
  26. func TestRegistry(t *testing.T) {
  27. testx.InitEnv()
  28. // Move test schema file to etc dir
  29. etcDir, err := conf.GetConfLoc()
  30. if err != nil {
  31. t.Fatal(err)
  32. }
  33. etcDir = filepath.Join(etcDir, "schemas", "protobuf")
  34. err = os.MkdirAll(etcDir, os.ModePerm)
  35. if err != nil {
  36. t.Fatal(err)
  37. }
  38. //Copy init.proto
  39. bytesRead, err := ioutil.ReadFile("test/init.proto")
  40. if err != nil {
  41. t.Fatal(err)
  42. }
  43. err = ioutil.WriteFile(filepath.Join(etcDir, "init.proto"), bytesRead, 0755)
  44. if err != nil {
  45. t.Fatal(err)
  46. }
  47. defer func() {
  48. err = os.RemoveAll(etcDir)
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. }()
  53. err = InitRegistry()
  54. if err != nil {
  55. t.Errorf("InitRegistry error: %v", err)
  56. return
  57. }
  58. s := httptest.NewServer(
  59. http.FileServer(http.Dir("test")),
  60. )
  61. defer s.Close()
  62. endpoint := s.URL
  63. // Create 1 by file
  64. schema1 := &Info{
  65. Name: "test1",
  66. Type: "protobuf",
  67. FilePath: endpoint + "/test1.proto",
  68. }
  69. err = Register(schema1)
  70. if err != nil {
  71. t.Errorf("Register schema1 error: %v", err)
  72. return
  73. }
  74. // Get 1
  75. expectedSchema := &Info{
  76. Type: "protobuf",
  77. Name: "test1",
  78. Content: "syntax = \"proto3\";message Person {string name = 1;int32 id = 2;string email = 3;}",
  79. FilePath: filepath.Join(etcDir, "test1.proto"),
  80. }
  81. gottenSchema, err := GetSchema("protobuf", "test1")
  82. if !reflect.DeepEqual(gottenSchema, expectedSchema) {
  83. t.Errorf("Get test1 unmatch: Expect\n%v\nbut got\n%v", *expectedSchema, *gottenSchema)
  84. return
  85. }
  86. // Create 2 by content
  87. schema2 := &Info{
  88. Name: "test2",
  89. Type: "protobuf",
  90. Content: "message Book{\n required string name = 1;}",
  91. }
  92. err = Register(schema2)
  93. if err != nil {
  94. t.Errorf("Register schema2 error: %v", err)
  95. return
  96. }
  97. // Update 2 by file
  98. updatedSchema2 := &Info{
  99. Name: "test2",
  100. Type: "protobuf",
  101. FilePath: endpoint + "/test2.proto",
  102. }
  103. err = CreateOrUpdateSchema(updatedSchema2)
  104. if err != nil {
  105. t.Errorf("Update Schema2 error: %v", err)
  106. return
  107. }
  108. // List & check file
  109. regSchemas, err := GetAllForType("protobuf")
  110. expectedSchemas := []string{
  111. "init", "test1", "test2",
  112. }
  113. if !reflect.DeepEqual(len(regSchemas), len(expectedSchemas)) {
  114. t.Errorf("Expect\n%v\nbut got\n%v", expectedSchemas, regSchemas)
  115. return
  116. }
  117. checkFile(etcDir, expectedSchemas, t)
  118. // Delete 2
  119. err = DeleteSchema("protobuf", "test2")
  120. if err != nil {
  121. t.Errorf("Delete Schema2 error: %v", err)
  122. return
  123. }
  124. // Update 1 by content
  125. updatedSchema1 := &Info{
  126. Name: "test1",
  127. Type: "protobuf",
  128. Content: "message Person{required string name = 1;required int32 id = 2;optional string email = 3;}",
  129. }
  130. err = CreateOrUpdateSchema(updatedSchema1)
  131. if err != nil {
  132. t.Errorf("Update Schema1 error: %v", err)
  133. return
  134. }
  135. // List & check file
  136. regSchemas, err = GetAllForType("protobuf")
  137. expectedSchemas = []string{
  138. "init", "test1",
  139. }
  140. if !reflect.DeepEqual(len(regSchemas), len(expectedSchemas)) {
  141. t.Errorf("Expect\n%v\nbut got\n%v", expectedSchemas, regSchemas)
  142. return
  143. }
  144. checkFile(etcDir, expectedSchemas, t)
  145. // Delete 1
  146. err = DeleteSchema("protobuf", "test1")
  147. if err != nil {
  148. t.Errorf("Delete Schema1 error: %v", err)
  149. return
  150. }
  151. // List & check file
  152. regSchemas, err = GetAllForType("protobuf")
  153. expectedSchemas = []string{
  154. "init",
  155. }
  156. if !reflect.DeepEqual(regSchemas, expectedSchemas) {
  157. t.Errorf("Expect\n%v\nbut got\n%v", expectedSchemas, regSchemas)
  158. return
  159. }
  160. checkFile(etcDir, expectedSchemas, t)
  161. }
  162. func checkFile(etcDir string, schemas []string, t *testing.T) {
  163. files, err := ioutil.ReadDir(etcDir)
  164. if err != nil {
  165. t.Fatal(err)
  166. }
  167. if len(files) != len(schemas) {
  168. t.Errorf("Expect %d files but got %d", len(schemas), len(files))
  169. return
  170. }
  171. for _, file := range files {
  172. fileName := filepath.Base(file.Name())
  173. found := false
  174. for _, schema := range schemas {
  175. if fileName == schema+".proto" {
  176. found = true
  177. break
  178. }
  179. }
  180. if !found {
  181. t.Errorf("Expect %s but got %s", schemas, fileName)
  182. return
  183. }
  184. }
  185. }