sql_engine_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package tsdb
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/grafana/grafana/pkg/components/null"
  6. . "github.com/smartystreets/goconvey/convey"
  7. )
  8. func TestSqlEngine(t *testing.T) {
  9. Convey("SqlEngine", t, func() {
  10. dt := time.Date(2018, 3, 14, 21, 20, 6, int(527345*time.Microsecond), time.UTC)
  11. Convey("Given row values with time.Time as time columns", func() {
  12. var nilPointer *time.Time
  13. fixtures := make([]interface{}, 3)
  14. fixtures[0] = dt
  15. fixtures[1] = &dt
  16. fixtures[2] = nilPointer
  17. for i := range fixtures {
  18. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  19. }
  20. Convey("When converting them should return epoch time with millisecond precision ", func() {
  21. expected := float64(dt.UnixNano()) / float64(time.Millisecond)
  22. So(fixtures[0].(float64), ShouldEqual, expected)
  23. So(fixtures[1].(float64), ShouldEqual, expected)
  24. So(fixtures[2], ShouldBeNil)
  25. })
  26. })
  27. Convey("Given row values with int64 as time columns", func() {
  28. tSeconds := dt.Unix()
  29. tMilliseconds := dt.UnixNano() / 1e6
  30. tNanoSeconds := dt.UnixNano()
  31. var nilPointer *int64
  32. fixtures := make([]interface{}, 7)
  33. fixtures[0] = tSeconds
  34. fixtures[1] = &tSeconds
  35. fixtures[2] = tMilliseconds
  36. fixtures[3] = &tMilliseconds
  37. fixtures[4] = tNanoSeconds
  38. fixtures[5] = &tNanoSeconds
  39. fixtures[6] = nilPointer
  40. for i := range fixtures {
  41. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  42. }
  43. Convey("When converting them should return epoch time with millisecond precision ", func() {
  44. So(fixtures[0].(int64), ShouldEqual, tSeconds*1e3)
  45. So(fixtures[1].(int64), ShouldEqual, tSeconds*1e3)
  46. So(fixtures[2].(int64), ShouldEqual, tMilliseconds)
  47. So(fixtures[3].(int64), ShouldEqual, tMilliseconds)
  48. So(fixtures[4].(int64), ShouldEqual, tMilliseconds)
  49. So(fixtures[5].(int64), ShouldEqual, tMilliseconds)
  50. So(fixtures[6], ShouldBeNil)
  51. })
  52. })
  53. Convey("Given row values with uin64 as time columns", func() {
  54. tSeconds := uint64(dt.Unix())
  55. tMilliseconds := uint64(dt.UnixNano() / 1e6)
  56. tNanoSeconds := uint64(dt.UnixNano())
  57. var nilPointer *uint64
  58. fixtures := make([]interface{}, 7)
  59. fixtures[0] = tSeconds
  60. fixtures[1] = &tSeconds
  61. fixtures[2] = tMilliseconds
  62. fixtures[3] = &tMilliseconds
  63. fixtures[4] = tNanoSeconds
  64. fixtures[5] = &tNanoSeconds
  65. fixtures[6] = nilPointer
  66. for i := range fixtures {
  67. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  68. }
  69. Convey("When converting them should return epoch time with millisecond precision ", func() {
  70. So(fixtures[0].(int64), ShouldEqual, tSeconds*1e3)
  71. So(fixtures[1].(int64), ShouldEqual, tSeconds*1e3)
  72. So(fixtures[2].(int64), ShouldEqual, tMilliseconds)
  73. So(fixtures[3].(int64), ShouldEqual, tMilliseconds)
  74. So(fixtures[4].(int64), ShouldEqual, tMilliseconds)
  75. So(fixtures[5].(int64), ShouldEqual, tMilliseconds)
  76. So(fixtures[6], ShouldBeNil)
  77. })
  78. })
  79. Convey("Given row values with int32 as time columns", func() {
  80. tSeconds := int32(dt.Unix())
  81. var nilInt *int32
  82. fixtures := make([]interface{}, 3)
  83. fixtures[0] = tSeconds
  84. fixtures[1] = &tSeconds
  85. fixtures[2] = nilInt
  86. for i := range fixtures {
  87. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  88. }
  89. Convey("When converting them should return epoch time with millisecond precision ", func() {
  90. So(fixtures[0].(int64), ShouldEqual, dt.Unix()*1e3)
  91. So(fixtures[1].(int64), ShouldEqual, dt.Unix()*1e3)
  92. So(fixtures[2], ShouldBeNil)
  93. })
  94. })
  95. Convey("Given row values with uint32 as time columns", func() {
  96. tSeconds := uint32(dt.Unix())
  97. var nilInt *uint32
  98. fixtures := make([]interface{}, 3)
  99. fixtures[0] = tSeconds
  100. fixtures[1] = &tSeconds
  101. fixtures[2] = nilInt
  102. for i := range fixtures {
  103. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  104. }
  105. Convey("When converting them should return epoch time with millisecond precision ", func() {
  106. So(fixtures[0].(int64), ShouldEqual, dt.Unix()*1e3)
  107. So(fixtures[1].(int64), ShouldEqual, dt.Unix()*1e3)
  108. So(fixtures[2], ShouldBeNil)
  109. })
  110. })
  111. Convey("Given row values with float64 as time columns", func() {
  112. tSeconds := float64(dt.UnixNano()) / float64(time.Second)
  113. tMilliseconds := float64(dt.UnixNano()) / float64(time.Millisecond)
  114. tNanoSeconds := float64(dt.UnixNano())
  115. var nilPointer *float64
  116. fixtures := make([]interface{}, 7)
  117. fixtures[0] = tSeconds
  118. fixtures[1] = &tSeconds
  119. fixtures[2] = tMilliseconds
  120. fixtures[3] = &tMilliseconds
  121. fixtures[4] = tNanoSeconds
  122. fixtures[5] = &tNanoSeconds
  123. fixtures[6] = nilPointer
  124. for i := range fixtures {
  125. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  126. }
  127. Convey("When converting them should return epoch time with millisecond precision ", func() {
  128. So(fixtures[0].(float64), ShouldEqual, tMilliseconds)
  129. So(fixtures[1].(float64), ShouldEqual, tMilliseconds)
  130. So(fixtures[2].(float64), ShouldEqual, tMilliseconds)
  131. So(fixtures[3].(float64), ShouldEqual, tMilliseconds)
  132. So(fixtures[4].(float64), ShouldEqual, tMilliseconds)
  133. So(fixtures[5].(float64), ShouldEqual, tMilliseconds)
  134. So(fixtures[6], ShouldBeNil)
  135. })
  136. })
  137. Convey("Given row values with float32 as time columns", func() {
  138. tSeconds := float32(dt.Unix())
  139. var nilInt *float32
  140. fixtures := make([]interface{}, 3)
  141. fixtures[0] = tSeconds
  142. fixtures[1] = &tSeconds
  143. fixtures[2] = nilInt
  144. for i := range fixtures {
  145. ConvertSqlTimeColumnToEpochMs(fixtures, i)
  146. }
  147. Convey("When converting them should return epoch time with millisecond precision ", func() {
  148. So(fixtures[0].(float64), ShouldEqual, float32(dt.Unix()*1e3))
  149. So(fixtures[1].(float64), ShouldEqual, float32(dt.Unix()*1e3))
  150. So(fixtures[2], ShouldBeNil)
  151. })
  152. })
  153. Convey("Given row with value columns", func() {
  154. intValue := 1
  155. int64Value := int64(1)
  156. int32Value := int32(1)
  157. int16Value := int16(1)
  158. int8Value := int8(1)
  159. float64Value := float64(1)
  160. float32Value := float32(1)
  161. uintValue := uint(1)
  162. uint64Value := uint64(1)
  163. uint32Value := uint32(1)
  164. uint16Value := uint16(1)
  165. uint8Value := uint8(1)
  166. fixtures := make([]interface{}, 24)
  167. fixtures[0] = intValue
  168. fixtures[1] = &intValue
  169. fixtures[2] = int64Value
  170. fixtures[3] = &int64Value
  171. fixtures[4] = int32Value
  172. fixtures[5] = &int32Value
  173. fixtures[6] = int16Value
  174. fixtures[7] = &int16Value
  175. fixtures[8] = int8Value
  176. fixtures[9] = &int8Value
  177. fixtures[10] = float64Value
  178. fixtures[11] = &float64Value
  179. fixtures[12] = float32Value
  180. fixtures[13] = &float32Value
  181. fixtures[14] = uintValue
  182. fixtures[15] = &uintValue
  183. fixtures[16] = uint64Value
  184. fixtures[17] = &uint64Value
  185. fixtures[18] = uint32Value
  186. fixtures[19] = &uint32Value
  187. fixtures[20] = uint16Value
  188. fixtures[21] = &uint16Value
  189. fixtures[22] = uint8Value
  190. fixtures[23] = &uint8Value
  191. var intNilPointer *int
  192. var int64NilPointer *int64
  193. var int32NilPointer *int32
  194. var int16NilPointer *int16
  195. var int8NilPointer *int8
  196. var float64NilPointer *float64
  197. var float32NilPointer *float32
  198. var uintNilPointer *uint
  199. var uint64NilPointer *uint64
  200. var uint32NilPointer *uint32
  201. var uint16NilPointer *uint16
  202. var uint8NilPointer *uint8
  203. nilPointerFixtures := make([]interface{}, 12)
  204. nilPointerFixtures[0] = intNilPointer
  205. nilPointerFixtures[1] = int64NilPointer
  206. nilPointerFixtures[2] = int32NilPointer
  207. nilPointerFixtures[3] = int16NilPointer
  208. nilPointerFixtures[4] = int8NilPointer
  209. nilPointerFixtures[5] = float64NilPointer
  210. nilPointerFixtures[6] = float32NilPointer
  211. nilPointerFixtures[7] = uintNilPointer
  212. nilPointerFixtures[8] = uint64NilPointer
  213. nilPointerFixtures[9] = uint32NilPointer
  214. nilPointerFixtures[10] = uint16NilPointer
  215. nilPointerFixtures[11] = uint8NilPointer
  216. Convey("When converting values to float should return expected value", func() {
  217. for _, f := range fixtures {
  218. value, _ := ConvertSqlValueColumnToFloat("col", f)
  219. if !value.Valid {
  220. t.Fatalf("Failed to convert %T value, expected a valid float value", f)
  221. }
  222. if value.Float64 != null.FloatFrom(1).Float64 {
  223. t.Fatalf("Failed to convert %T value, expected a float value of 1.000, but got %v", f, value)
  224. }
  225. }
  226. })
  227. Convey("When converting nil pointer values to float should return expected value", func() {
  228. for _, f := range nilPointerFixtures {
  229. value, err := ConvertSqlValueColumnToFloat("col", f)
  230. if err != nil {
  231. t.Fatalf("Failed to convert %T value, expected a non nil error, but got %v", f, err)
  232. }
  233. if value.Valid {
  234. t.Fatalf("Failed to convert %T value, expected an invalid float value", f)
  235. }
  236. }
  237. })
  238. })
  239. })
  240. }