@@ -29,6 +29,7 @@ import (
2929 "github.com/dolthub/vitess/go/race"
3030 "github.com/dolthub/vitess/go/sqltypes"
3131 "github.com/dolthub/vitess/go/vt/proto/query"
32+ "github.com/sirupsen/logrus"
3233 "github.com/stretchr/testify/assert"
3334 "github.com/stretchr/testify/require"
3435
@@ -1916,3 +1917,156 @@ func TestStatusVariableComUpdate(t *testing.T) {
19161917 checkSessionStatVar (t , sess1 , "Com_update" , uint64 (5 ))
19171918 checkSessionStatVar (t , sess2 , "Com_update" , uint64 (3 ))
19181919}
1920+
1921+ // TestQueryTimeLogField tests that the QueryTimeLogKey constant is properly defined
1922+ func TestQueryTimeLogField (t * testing.T ) {
1923+ // Test that the constant is defined and has the expected value
1924+ require .Equal (t , "queryTime" , sql .QueryTimeLogKey , "QueryTimeLogKey should be 'queryTime'" )
1925+ }
1926+
1927+ // TestLoggerFieldsSetup tests that handler properly sets up logger fields including query time
1928+ func TestLoggerFieldsSetup (t * testing.T ) {
1929+ e , pro := setupMemDB (require .New (t ))
1930+ dbFunc := pro .Database
1931+
1932+ handler := & Handler {
1933+ e : e ,
1934+ sm : NewSessionManager (
1935+ sql .NewContext ,
1936+ testSessionBuilder (pro ),
1937+ sql .NoopTracer ,
1938+ dbFunc ,
1939+ sql .NewMemoryManager (nil ),
1940+ sqle .NewProcessList (),
1941+ "foo" ,
1942+ ),
1943+ readTimeout : time .Second ,
1944+ }
1945+
1946+ conn := newConn (1 )
1947+ handler .NewConnection (conn )
1948+ err := handler .ComInitDB (conn , "test" )
1949+ require .NoError (t , err )
1950+
1951+ // Execute a query and verify basic logging setup
1952+ err = handler .ComQuery (context .Background (), conn , "SELECT 1" , dummyCb )
1953+ require .NoError (t , err )
1954+
1955+ // Verify that the session's logger has the expected fields
1956+ session := handler .sm .session (conn )
1957+ logger := session .GetLogger ()
1958+ require .NotNil (t , logger , "Session should have a logger" )
1959+
1960+ // Verify that the logger has the expected fields
1961+ require .Contains (t , logger .Data , sql .ConnectTimeLogKey , "Logger should contain connect time" )
1962+ require .Contains (t , logger .Data , sql .ConnectionIdLogField , "Logger should contain connection ID" )
1963+
1964+ // Verify the values are of correct types
1965+ connectTime , ok := logger .Data [sql .ConnectTimeLogKey ].(time.Time )
1966+ require .True (t , ok , "Connect time should be a time.Time" )
1967+ require .False (t , connectTime .IsZero (), "Connect time should not be zero" )
1968+
1969+ connID , ok := logger .Data [sql .ConnectionIdLogField ].(uint32 )
1970+ require .True (t , ok , "Connection ID should be a uint32" )
1971+ require .Equal (t , conn .ConnectionID , connID , "Connection ID should match" )
1972+ }
1973+
1974+ // TestQueryTimeConstantDefined tests that the QueryTimeLogKey constant is properly defined and available
1975+ func TestQueryTimeConstantDefined (t * testing.T ) {
1976+ // Verify the constant exists and has the expected value
1977+ require .Equal (t , "queryTime" , sql .QueryTimeLogKey , "QueryTimeLogKey constant should be defined as 'queryTime'" )
1978+
1979+ // Verify it's different from other log keys
1980+ require .NotEqual (t , sql .QueryTimeLogKey , sql .ConnectTimeLogKey , "QueryTimeLogKey should be different from ConnectTimeLogKey" )
1981+ require .NotEqual (t , sql .QueryTimeLogKey , sql .ConnectionIdLogField , "QueryTimeLogKey should be different from ConnectionIdLogField" )
1982+ }
1983+
1984+ // TestHandlerDoQueryIntegration tests the complete doQuery flow to ensure query time handling works
1985+ func TestHandlerDoQueryIntegration (t * testing.T ) {
1986+ e , pro := setupMemDB (require .New (t ))
1987+ dbFunc := pro .Database
1988+
1989+ handler := & Handler {
1990+ e : e ,
1991+ sm : NewSessionManager (
1992+ sql .NewContext ,
1993+ testSessionBuilder (pro ),
1994+ sql .NoopTracer ,
1995+ dbFunc ,
1996+ sql .NewMemoryManager (nil ),
1997+ sqle .NewProcessList (),
1998+ "foo" ,
1999+ ),
2000+ readTimeout : time .Second ,
2001+ }
2002+
2003+ conn := newConn (1 )
2004+ handler .NewConnection (conn )
2005+ err := handler .ComInitDB (conn , "test" )
2006+ require .NoError (t , err )
2007+
2008+ // Execute a query - this will go through our modified doQuery code path
2009+ err = handler .ComQuery (context .Background (), conn , "SELECT 1" , dummyCb )
2010+ require .NoError (t , err )
2011+
2012+ // Verify that the session has a logger with the expected fields
2013+ session := handler .sm .session (conn )
2014+ require .NotNil (t , session , "Session should exist" )
2015+
2016+ logger := session .GetLogger ()
2017+ require .NotNil (t , logger , "Session should have a logger" )
2018+
2019+ // Verify base logging fields are present
2020+ require .Contains (t , logger .Data , sql .ConnectTimeLogKey , "Logger should contain connect time" )
2021+ require .Contains (t , logger .Data , sql .ConnectionIdLogField , "Logger should contain connection ID" )
2022+
2023+ // Verify the connect time is reasonable
2024+ connectTime , ok := logger .Data [sql .ConnectTimeLogKey ].(time.Time )
2025+ require .True (t , ok , "Connect time should be a time.Time" )
2026+ require .False (t , connectTime .IsZero (), "Connect time should not be zero" )
2027+ require .True (t , connectTime .Before (time .Now ()) || connectTime .Equal (time .Now ()),
2028+ "Connect time should be before or equal to current time" )
2029+
2030+ // Verify connection ID matches
2031+ connID , ok := logger .Data [sql .ConnectionIdLogField ].(uint32 )
2032+ require .True (t , ok , "Connection ID should be a uint32" )
2033+ require .Equal (t , conn .ConnectionID , connID , "Connection ID should match the connection" )
2034+
2035+ // The test verifies that our code changes compile and execute without error
2036+ // The actual query time field will be set temporarily during query execution in doQuery
2037+ // but won't persist in the session logger (which is the expected behavior)
2038+ }
2039+
2040+ // TestQueryTimeLoggerBehavior tests that query time is added to logger during query execution
2041+ func TestQueryTimeLoggerBehavior (t * testing.T ) {
2042+ // Test demonstrates that the QueryTimeLogKey constant is available and can be used
2043+ // for setting up logger fields (which happens in the doQuery method)
2044+ require .NotEmpty (t , sql .QueryTimeLogKey , "QueryTimeLogKey should not be empty" )
2045+
2046+ // Create a time value like what would be used in doQuery
2047+ queryTime := time .Now ()
2048+
2049+ // Simulate what happens in doQuery: create a logger with query time field
2050+ baseLogger := & logrus.Entry {
2051+ Data : make (logrus.Fields ),
2052+ }
2053+ baseLogger .Data [sql .ConnectTimeLogKey ] = time .Now ().Add (- 1 * time .Minute ) // connection established 1 minute ago
2054+ baseLogger .Data [sql .ConnectionIdLogField ] = uint32 (123 )
2055+
2056+ // Add query time field (this is what our modified doQuery does)
2057+ loggerWithQueryTime := baseLogger .WithField (sql .QueryTimeLogKey , queryTime )
2058+
2059+ // Verify the query time field was added
2060+ require .Contains (t , loggerWithQueryTime .Data , sql .QueryTimeLogKey , "Logger should contain query time" )
2061+ require .Contains (t , loggerWithQueryTime .Data , sql .ConnectTimeLogKey , "Logger should still contain connect time" )
2062+ require .Contains (t , loggerWithQueryTime .Data , sql .ConnectionIdLogField , "Logger should still contain connection ID" )
2063+
2064+ // Verify the query time value
2065+ actualQueryTime , ok := loggerWithQueryTime .Data [sql .QueryTimeLogKey ].(time.Time )
2066+ require .True (t , ok , "Query time should be a time.Time" )
2067+ require .Equal (t , queryTime , actualQueryTime , "Query time should match the set value" )
2068+
2069+ // Verify that query time and connect time are different (as expected)
2070+ connectTime := loggerWithQueryTime .Data [sql .ConnectTimeLogKey ].(time.Time )
2071+ require .True (t , queryTime .After (connectTime ), "Query time should be after connect time" )
2072+ }
0 commit comments