homework-jianmu/tests/army/cmdline/taosCli.py

428 lines
13 KiB
Python

###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import sys
import time
import random
import frame.eos
import frame.etime
import frame.etool
import frame.etool
import frame.etool
import frame.etool
import taos
import frame.etool
import frame
from frame.log import *
from frame.sql import *
from frame.cases import *
from frame.caseBase import *
from frame.srvCtl import *
from frame import *
class TDTestCase(TBase):
updatecfgDict = {
'slowLogScope':"query"
}
def checkDescribe(self):
tdLog.info(f"check describe show full.")
# insert
json = "cmdline/json/taosCliDesc.json"
db, stb, childCount, insertRows = self.insertBenchJson(json)
# describe
sql = f"describe {db}.{stb};"
tdSql.query(sql)
tdSql.checkRows(2 + 1000)
# desc
sql = f"desc {db}.{stb};"
tdSql.query(sql)
tdSql.checkRows(2 + 1000)
def checkResultWithMode(self, db, stb, arg):
result = "Query OK, 10 row(s)"
mode = arg[0]
# use db
rlist = self.taos(f'{mode} -s "show databases;use {db};show databases;" ')
self.checkListString(rlist, "Database changed")
# hori
cmd = f'{mode} -s "select ts,ic from {db}.{stb} limit 10'
rlist = self.taos(cmd + '"')
results = [
"2022-10-01 00:00:09.000 |",
result
]
self.checkManyString(rlist, results)
# vec
rlist = self.taos(cmd + '\G"')
results = [
"****** 10.row *******",
"ts: 2022-10-01 00:00:09.000",
result
]
self.checkManyString(rlist, results)
# -B have some problem need todo
self.taos(f'{mode} -B -s "select * from {db}.{stb} where ts < 1"')
# get empty result
rlist = self.taos(f'{mode} -r -s "select * from {db}.{stb} where ts < 1"')
self.checkListString(rlist, "Query OK, 0 row(s) in set")
def checkDecimalCommon(self, col, value):
rlist = self.taos(f'-s "select {col} from testdec.test"')
self.checkListString(rlist, value)
outfile = "decimal.csv"
self.taos(f'-s "select {col} from testdec.test>>{outfile}"')
rlist = self.readFileToList(outfile)
self.checkListString(rlist, value)
self.deleteFile(outfile)
def checkDecimal(self):
# prepare data
self.taos(f'-s "drop database if exists testdec"')
self.taos(f'-s "create database if not exists testdec"')
self.taos(f'-s "create table if not exists testdec.test(ts timestamp, dec64 decimal(10,6), dec128 decimal(24,10)) tags (note nchar(20))"')
self.taos(f'-s "create table testdec.d0 using testdec.test(note) tags(\'test\')"')
self.taos(f'-s "insert into testdec.d0 values(now(), \'9876.123456\', \'123456789012.0987654321\')"')
# check decimal64
self.checkDecimalCommon("dec64", "9876.123456")
# check decimal128
self.checkDecimalCommon("dec128", "123456789012.0987654321")
self.taos(f'-s "drop database if exists testdec"')
def checkBasic(self):
tdLog.info(f"check describe show full.")
# insert
json = "cmdline/json/taosCli.json"
db, stb, childCount, insertRows = self.insertBenchJson(json)
# set
self.db = db
self.stb = stb
self.insert_rows = insertRows
self.childtable_count = childCount
# native restful websock test
args = [
["-Z native"],
["-T 40 -E http://localhost:6041"]
]
for arg in args:
self.checkResultWithMode(db, stb, arg)
self.checkDecimal()
def checkDumpInOutMode(self, source, arg, db, insertRows):
mode = arg[0]
self.taos(f'{mode} -s "source {source}" ')
self.taos(f'{mode} -s "select * from {db}.d0>>d0.csv" ')
# use db
rlist = self.taos(f'{mode} -s "show databases;use {db};show databases;" ')
# update sql
rlist = self.taos(f'{mode} -s "alter local \'resetlog\';" ')
self.checkListString(rlist, "Query O")
# only native support csv import
if mode == "":
self.taos(f'{mode} -s "delete from {db}.d0" ')
self.taos(f'{mode} -s "insert into {db}.d0 file d0.csv" ')
sql = f"select count(*) from {db}.d0"
self.taos(f'{mode} -B -s "{sql}" ')
tdSql.checkAgg(sql, insertRows)
sql = f"select first(voltage) from {db}.d0"
tdSql.checkFirstValue(sql, 1)
sql = f"select last(voltage) from {db}.d0"
tdSql.checkFirstValue(sql, 5)
def checkDumpInOut(self):
args = [
["", 18],
["-E http://localhost:6041", 21]
]
source = "cmdline/data/source.sql"
db = "db"
insertRows = 5
for arg in args:
# insert
self.checkDumpInOutMode(source, arg, db, insertRows)
def checkVersion(self):
rlist1 = self.taos("-V")
rlist2 = self.taos("--version")
self.checkSame(rlist1, rlist2)
if len(rlist1) < 4:
tdLog.exit(f"version lines less than 4. {rlist1}")
if len(rlist1[2]) < 42:
tdLog.exit("git commit id length is invalid: " + rlist1[2])
keys = [
"version:",
"git:",
"build:"
]
self.checkManyString(rlist1, keys)
def checkHelp(self):
# help
rlist1 = self.taos("--help")
rlist2 = self.taos("-?")
self.checkSame(rlist1, rlist2)
# check return
strings = [
"--auth=AUTH",
"--database=DATABASE",
"--version",
" --help"
]
for string in strings:
self.checkListString(rlist1, string)
def checkCommand(self):
# check coredump
queryOK = "Query OK"
# support Both
args = [
['-uroot -w 40 -ptaosdata -c /root/taos/ -s"show databases"', queryOK],
['-o "./current/log/files/" -h localhost -uroot -ptaosdata -s"show databases;"', queryOK],
['-s "quit;"', "Welcome to the TDengine Command Line Interface"],
['-h "" -s "show dnodes;"', "Invalid host"],
['-u "" -s "show dnodes;"', "Invalid user"],
['-P "" -s "show dnodes;"', "Invalid port"],
['-u "AA" -s "show dnodes;"', "failed to connect to server"],
['-p"abc" -s "show dnodes;"', "[0x80000357]"],
['-d "abc" -s "show dnodes;"', "[0x80000388]"],
['-N 0 -s "show dnodes;"', "Invalid pktNum"],
['-N 10 -h 127.0.0.1 -s "show dnodes;"', queryOK],
['-w 0 -s "show dnodes;"', "Invalid displayWidth"],
['-w 10 -s "show dnodes;"', queryOK],
['-W 10 -s "show dnodes;"', None],
['-l 0 -s "show dnodes;"', "Invalid pktLen"],
['-l 10 -s "show dnodes;"', queryOK],
['-C', "buildinfo"],
['-B -s "show dnodes;"', queryOK],
['-s "help;"', "Timestamp expression Format"],
['-s ""', "Invalid commands"],
['-t', "2: service ok"],
['-uroot -p < cmdline/data/pwd.txt -s "show dnodes;"', queryOK],
]
modes = ["-Z 0","-Z 1"]
for mode in modes:
for arg in args:
rlist = self.taos(mode + " " + arg[0])
if arg[1] != None:
self.checkListString(rlist, arg[1])
#
# support native only
#
# o logpath
char = 'a'
lname =f'-o "/root/log/{char * 1000}/" -s "quit;"'
args = [
[lname, "failed to create log at"],
['-a ""', "Invalid auth"],
['-a "abc"', "[0x80000357]"],
]
for arg in args:
rlist = self.taos("Z 0 " + arg[0])
if arg[1] != None:
self.checkListString(rlist, arg[1])
# expect cmd > json > evn
def checkPriority(self):
#
# cmd & env
#
# env 6043 - invalid
os.environ['TDENGINE_CLOUD_DSN'] = "http://127.0.0.1:6043"
# cmd 6041 - valid
cmd = f"-X http://127.0.0.1:6041 -s 'select ts from test.meters'"
rlist = self.taos(cmd, checkRun = True)
results = [
"WebSocket Client Version",
"2022-10-01 00:01:39.000",
"Query OK, 200 row(s) in set"
]
self.checkManyString(rlist, results)
#
# env
#
# cloud
os.environ['TDENGINE_CLOUD_DSN'] = "http://127.0.0.1:6041"
cmd = f"-s 'select ts from test.meters'"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
# local
os.environ['TDENGINE_CLOUD_DSN'] = ""
os.environ['TDENGINE_DSN'] = "http://127.0.0.1:6041"
cmd = f"-s 'select ts from test.meters'"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
# local & cloud -> cloud first
os.environ['TDENGINE_CLOUD_DSN'] = "http://127.0.0.1:6041" # valid
os.environ['TDENGINE_DSN'] = "http://127.0.0.1:6042" # invalid
cmd = f"-s 'select ts from test.meters'"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
#
# cmd
#
os.environ['TDENGINE_CLOUD_DSN'] = ""
os.environ['TDENGINE_DSN'] = ""
cmd = f"-X http://127.0.0.1:6041 -s 'select ts from test.meters'"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
def checkExceptCmd(self):
# exe
taos = frame.etool.taosFile()
# option
options = [
"-Z native -X http://127.0.0.1:6041",
"-Z 100",
"-Z abcdefg",
"-X",
"-X ",
"-X 127.0.0.1:6041",
"-X https://gw.cloud.taosdata.com?token617ffdf...",
"-Z 1 -X https://gw.cloud.taosdata.com?token=617ffdf...",
"-X http://127.0.0.1:6042"
]
# do check
for option in options:
self.checkExcept(taos + " -s 'show dnodes;' " + option)
def checkModeVersion(self):
# results
results = [
"WebSocket Client Version",
"2022-10-01 00:01:39.000",
"Query OK, 100 row(s) in set"
]
# default
cmd = f"-s 'select ts from test.d0'"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
# websocket
cmd = f"-Z 1 -s 'select ts from test.d0'"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
# native
cmd = f"-Z 0 -s 'select ts from test.d0'"
results[0] = "Native Client Version"
rlist = self.taos(cmd, checkRun = True)
self.checkManyString(rlist, results)
def checkConnMode(self):
# priority
self.checkPriority()
# except
self.checkExceptCmd()
# mode version
self.checkModeVersion()
# password
def checkPassword(self):
# 255 char max password
user = "test_user"
pwd = ""
pwdFile = "cmdline/data/pwdMax.txt"
with open(pwdFile) as file:
pwd = file.readline()
sql = f"create user {user} pass '{pwd}' "
tdSql.execute(sql)
cmds = [
f"-u{user} -p'{pwd}' -s 'show databases;'", # command pass
f"-u{user} -p < {pwdFile} -s 'show databases;'" # input pass
]
for cmd in cmds:
rlist = self.taos(cmd)
self.checkListString(rlist, "Query OK,")
# run
def run(self):
tdLog.debug(f"start to excute {__file__}")
# check show whole
self.checkDescribe()
# check basic
self.checkBasic()
# version
self.checkVersion()
# help
self.checkHelp()
# check command
self.checkCommand()
# check data in/out
self.checkDumpInOut()
# check conn mode
self.checkConnMode()
# max password
self.checkPassword()
tdLog.success(f"{__file__} successfully executed")
tdCases.addLinux(__file__, TDTestCase())
tdCases.addWindows(__file__, TDTestCase())