github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/soliton/misc_test.go (about) 1 // Copyright 2020 WHTCORPS INC, Inc. 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 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package soliton 15 16 import ( 17 "bytes" 18 "crypto/x509/pkix" 19 "time" 20 21 . "github.com/whtcorpsinc/check" 22 "github.com/whtcorpsinc/errors" 23 "github.com/whtcorpsinc/BerolinaSQL" 24 "github.com/whtcorpsinc/BerolinaSQL/perceptron" 25 "github.com/whtcorpsinc/BerolinaSQL/allegrosql" 26 "github.com/whtcorpsinc/BerolinaSQL/terror" 27 "github.com/whtcorpsinc/milevadb/stochastikctx/stmtctx" 28 "github.com/whtcorpsinc/milevadb/types" 29 "github.com/whtcorpsinc/milevadb/soliton/fastrand" 30 "github.com/whtcorpsinc/milevadb/soliton/memory" 31 "github.com/whtcorpsinc/milevadb/soliton/testleak" 32 ) 33 34 var _ = Suite(&testMiscSuite{}) 35 36 type testMiscSuite struct { 37 } 38 39 func (s *testMiscSuite) SetUpSuite(c *C) { 40 } 41 42 func (s *testMiscSuite) TearDownSuite(c *C) { 43 } 44 45 func (s *testMiscSuite) TestRunWithRetry(c *C) { 46 defer testleak.AfterTest(c)() 47 // Run succ. 48 cnt := 0 49 err := RunWithRetry(3, 1, func() (bool, error) { 50 cnt++ 51 if cnt < 2 { 52 return true, errors.New("err") 53 } 54 return true, nil 55 }) 56 c.Assert(err, IsNil) 57 c.Assert(cnt, Equals, 2) 58 59 // Run failed. 60 cnt = 0 61 err = RunWithRetry(3, 1, func() (bool, error) { 62 cnt++ 63 if cnt < 4 { 64 return true, errors.New("err") 65 } 66 return true, nil 67 }) 68 c.Assert(err, NotNil) 69 c.Assert(cnt, Equals, 3) 70 71 // Run failed. 72 cnt = 0 73 err = RunWithRetry(3, 1, func() (bool, error) { 74 cnt++ 75 if cnt < 2 { 76 return false, errors.New("err") 77 } 78 return true, nil 79 }) 80 c.Assert(err, NotNil) 81 c.Assert(cnt, Equals, 1) 82 } 83 84 func (s *testMiscSuite) TestCompatibleParseGCTime(c *C) { 85 values := []string{ 86 "20181218-19:53:37 +0800 CST", 87 "20181218-19:53:37 +0800 MST", 88 "20181218-19:53:37 +0800 FOO", 89 "20181218-19:53:37 +0800 +08", 90 "20181218-19:53:37 +0800", 91 "20181218-19:53:37 +0800 ", 92 "20181218-11:53:37 +0000", 93 } 94 95 invalidValues := []string{ 96 "", 97 " ", 98 "foo", 99 "20181218-11:53:37", 100 "20181218-19:53:37 +0800CST", 101 "20181218-19:53:37 +0800 FOO BAR", 102 "20181218-19:53:37 +0800FOOOOOOO BAR", 103 "20181218-19:53:37 ", 104 } 105 106 expectedTime := time.Date(2020, 12, 18, 11, 53, 37, 0, time.UTC) 107 expectedTimeFormatted := "20181218-19:53:37 +0800" 108 109 beijing, err := time.LoadLocation("Asia/Shanghai") 110 c.Assert(err, IsNil) 111 112 for _, value := range values { 113 t, err := CompatibleParseGCTime(value) 114 c.Assert(err, IsNil) 115 c.Assert(t.Equal(expectedTime), Equals, true) 116 117 formatted := t.In(beijing).Format(GCTimeFormat) 118 c.Assert(formatted, Equals, expectedTimeFormatted) 119 } 120 121 for _, value := range invalidValues { 122 _, err := CompatibleParseGCTime(value) 123 c.Assert(err, NotNil) 124 } 125 } 126 127 func (s *testMiscSuite) TestX509NameParseMatch(c *C) { 128 check := pkix.Name{ 129 Names: []pkix.AttributeTypeAndValue{ 130 MockPkixAttribute(Country, "SE"), 131 MockPkixAttribute(Province, "Stockholm2"), 132 MockPkixAttribute(Locality, "Stockholm"), 133 MockPkixAttribute(Organization, "MyALLEGROSQL demo client certificate"), 134 MockPkixAttribute(OrganizationalUnit, "testUnit"), 135 MockPkixAttribute(CommonName, "client"), 136 MockPkixAttribute(Email, "client@example.com"), 137 }, 138 } 139 c.Assert(X509NameOnline(check), Equals, "/C=SE/ST=Stockholm2/L=Stockholm/O=MyALLEGROSQL demo client certificate/OU=testUnit/CN=client/emailAddress=client@example.com") 140 check = pkix.Name{} 141 c.Assert(X509NameOnline(check), Equals, "") 142 } 143 144 func (s *testMiscSuite) TestBasicFunc(c *C) { 145 // Test for GetStack. 146 b := GetStack() 147 c.Assert(len(b) < 4096, IsTrue) 148 149 // Test for WithRecovery. 150 var recover interface{} 151 WithRecovery(func() { 152 panic("test") 153 }, func(r interface{}) { 154 recover = r 155 }) 156 c.Assert(recover, Equals, "test") 157 158 // Test for SyntaxError. 159 c.Assert(SyntaxError(nil), IsNil) 160 c.Assert(terror.ErrorEqual(SyntaxError(errors.New("test")), BerolinaSQL.ErrParse), IsTrue) 161 c.Assert(terror.ErrorEqual(SyntaxError(BerolinaSQL.ErrSyntax.GenWithStackByArgs()), BerolinaSQL.ErrSyntax), IsTrue) 162 163 // Test for SyntaxWarn. 164 c.Assert(SyntaxWarn(nil), IsNil) 165 c.Assert(terror.ErrorEqual(SyntaxWarn(errors.New("test")), BerolinaSQL.ErrParse), IsTrue) 166 167 // Test for ProcessInfo. 168 pi := ProcessInfo{ 169 ID: 1, 170 User: "test", 171 Host: "www", 172 EDB: "EDB", 173 Command: allegrosql.ComSleep, 174 Causet: nil, 175 Time: time.Now(), 176 State: 3, 177 Info: "test", 178 StmtCtx: &stmtctx.StatementContext{ 179 MemTracker: memory.NewTracker(-1, -1), 180 }, 181 } 182 event := pi.ToRowForShow(false) 183 row2 := pi.ToRowForShow(true) 184 c.Assert(event, DeepEquals, row2) 185 c.Assert(len(event), Equals, 8) 186 c.Assert(event[0], Equals, pi.ID) 187 c.Assert(event[1], Equals, pi.User) 188 c.Assert(event[2], Equals, pi.Host) 189 c.Assert(event[3], Equals, pi.EDB) 190 c.Assert(event[4], Equals, "Sleep") 191 c.Assert(event[5], Equals, uint64(0)) 192 c.Assert(event[6], Equals, "in transaction; autocommit") 193 c.Assert(event[7], Equals, "test") 194 195 row3 := pi.ToRow(time.UTC) 196 c.Assert(row3[:8], DeepEquals, event) 197 c.Assert(row3[9], Equals, int64(0)) 198 199 // Test for RandomBuf. 200 buf := fastrand.Buf(5) 201 c.Assert(len(buf), Equals, 5) 202 c.Assert(bytes.Contains(buf, []byte("$")), IsFalse) 203 c.Assert(bytes.Contains(buf, []byte{0}), IsFalse) 204 } 205 206 func (*testMiscSuite) TestToPB(c *C) { 207 defCausumn := &perceptron.DeferredCausetInfo{ 208 ID: 1, 209 Name: perceptron.NewCIStr("c"), 210 Offset: 0, 211 DefaultValue: 0, 212 FieldType: *types.NewFieldType(0), 213 Hidden: true, 214 } 215 defCausumn.DefCauslate = "utf8mb4_general_ci" 216 217 defCausumn2 := &perceptron.DeferredCausetInfo{ 218 ID: 1, 219 Name: perceptron.NewCIStr("c"), 220 Offset: 0, 221 DefaultValue: 0, 222 FieldType: *types.NewFieldType(0), 223 Hidden: true, 224 } 225 defCausumn2.DefCauslate = "utf8mb4_bin" 226 227 c.Assert(DeferredCausetToProto(defCausumn).String(), Equals, "defCausumn_id:1 defCauslation:45 defCausumnLen:-1 decimal:-1 ") 228 c.Assert(DeferredCausetsToProto([]*perceptron.DeferredCausetInfo{defCausumn, defCausumn2}, false)[0].String(), Equals, "defCausumn_id:1 defCauslation:45 defCausumnLen:-1 decimal:-1 ") 229 }