sql_engine_test.go 8.8 KB

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