From 38067ae81e2c9d3f2ec1e556e843b59dfcc80dcd Mon Sep 17 00:00:00 2001 From: phongdly Date: Fri, 28 Aug 2015 14:29:03 -0700 Subject: [PATCH 1/3] (MODULES-2453) Create Automated Tests for sqlserver_tsql --- spec/acceptance/sqlserver_config_spec.rb | 9 +- spec/acceptance/sqlserver_tsql_spec.rb | 159 +++++++++++++++++++++++ spec/sql_testing_helpers.rb | 22 +++- 3 files changed, 183 insertions(+), 7 deletions(-) create mode 100644 spec/acceptance/sqlserver_tsql_spec.rb diff --git a/spec/acceptance/sqlserver_config_spec.rb b/spec/acceptance/sqlserver_config_spec.rb index 205e28f5..b481b616 100644 --- a/spec/acceptance/sqlserver_config_spec.rb +++ b/spec/acceptance/sqlserver_config_spec.rb @@ -30,7 +30,7 @@ def ensure_sqlserver_instance(host, ensure_val = 'present') end end - context "can create sqlserver::config" do + context "server_url =>", {:testrail => ['89070', '89071', '89072', '89073']} do before(:all) do # Create new instance @@ -87,10 +87,10 @@ def ensure_sqlserver_instance(host, ensure_val = 'present') it "Validate new login and database actualy created" do hostname = host.hostname - query = "USE #{DB_NAME};" + query = "USE #{DB_NAME}; SELECT * from master..sysdatabases WHERE name = '#{DB_NAME}'" - output = run_sql_query(host, {:query => query, :server => hostname, :instance => INST_NAME, :sql_admin_user => @admin_user, :sql_admin_pass => @admin_pass}) - expect(output).to match(/Changed database context to '#{Regexp.new(DB_NAME)}'/) + run_sql_query(host, {:query => query, :server => hostname, :instance => INST_NAME, \ + :sql_admin_user => @admin_user, :sql_admin_pass => @admin_pass, :expected_row_count => 1}) end it "Validate New Config WITHOUT using instance_name in sqlserver::config" do @@ -120,7 +120,6 @@ def ensure_sqlserver_instance(host, ensure_val = 'present') MANIFEST apply_manifest_on(host, pp, {:acceptable_exit_codes => [0,1]}) do |r| expect(r.stderr).to match(/Error: Must pass admin_user to Sqlserver/) - end end diff --git a/spec/acceptance/sqlserver_tsql_spec.rb b/spec/acceptance/sqlserver_tsql_spec.rb new file mode 100644 index 00000000..89e60e62 --- /dev/null +++ b/spec/acceptance/sqlserver_tsql_spec.rb @@ -0,0 +1,159 @@ +require 'spec_helper_acceptance' +require 'securerandom' +require 'erb' + +host = find_only_one("sql_host") + +# database name +DB_NAME = ("DB" + SecureRandom.hex(4)).upcase + +#database user: +DB_LOGIN_USER = "loginuser" + SecureRandom.hex(2) + +describe "sqlserver_tsql test", :node => host do + + def ensure_sqlserver_database(host, ensure_val = 'present') + pp = <<-MANIFEST + sqlserver::config{'MSSQLSERVER': + admin_user => 'sa', + admin_pass => 'Pupp3t1@', + } + sqlserver::database{'#{DB_NAME}': + instance => 'MSSQLSERVER', + } + MANIFEST + + apply_manifest_on(host, pp) do |r| + expect(r.stderr).not_to match(/Error/i) + end + end + + context "server_url =>", {:testrail => ['89024', '89025', '89026', '89068', '89069']} do + + before(:all) do + # Create new database + @table_name = 'Tables_' + SecureRandom.hex(3) + @query = "USE #{DB_NAME}; SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{@table_name}';" + + ensure_sqlserver_database(host) + end + + after(:all) do + # remove the newly created instance + ensure_sqlserver_database(host, 'absent') + end + + it "Run a simple tsql command via sqlserver_tsql:" do + pp = <<-MANIFEST + sqlserver::config{'MSSQLSERVER': + instance_name => 'MSSQLSERVER', + admin_user => 'sa', + admin_pass => 'Pupp3t1@', + } + sqlserver_tsql{'testsqlserver_tsql': + instance => 'MSSQLSERVER', + database => '#{DB_NAME}', + command => "CREATE TABLE #{@table_name} (id INT, name VARCHAR(20), email VARCHAR(20));", + } + MANIFEST + apply_manifest_on(host, pp) do |r| + expect(r.stderr).not_to match(/Error/i) + end + + puts "validate the result of tsql command and table #{@table_name} should be created:" + run_sql_query(host, {:query => @query, :sql_admin_user => @admin_user, \ + :sql_admin_pass => @admin_pass, :expected_row_count => 1}) + end + + it "Run sqlserver_tsql WITH onlyif is true:" do + #Initilize a new table name: + @table_name = 'Table_' + SecureRandom.hex(3) + @query = "USE #{DB_NAME}; SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{@table_name}';" + pp = <<-MANIFEST + sqlserver::config{'MSSQLSERVER': + instance_name => 'MSSQLSERVER', + admin_user => 'sa', + admin_pass => 'Pupp3t1@', + } + sqlserver_tsql{'testsqlserver_tsql': + instance => 'MSSQLSERVER', + database => '#{DB_NAME}', + command => "CREATE TABLE #{@table_name} (id INT, name VARCHAR(20), email VARCHAR(20));", + onlyif => "IF (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES) < 10000" + } + MANIFEST + + apply_manifest_on(host, pp) do |r| + expect(r.stderr).not_to match(/Error/i) + end + + puts "Validate #{@table_name} is successfully created:" + run_sql_query(host, {:query => @query, :sql_admin_user => @admin_user, \ + :sql_admin_pass => @admin_pass, :expected_row_count => 1}) + end + it "Run sqlserver_tsql WITH onlyif is false:" do + #Initilize a new table name: + @table_name = 'Table_' + SecureRandom.hex(3) + @query = "USE #{DB_NAME}; SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{@table_name}';" + pp = <<-MANIFEST + sqlserver::config{'MSSQLSERVER': + instance_name => 'MSSQLSERVER', + admin_user => 'sa', + admin_pass => 'Pupp3t1@', + } + sqlserver_tsql{'testsqlserver_tsql': + instance => 'MSSQLSERVER', + database => '#{DB_NAME}', + command => "CREATE TABLE #{@table_name} (id INT, name VARCHAR(20), email VARCHAR(20));", + onlyif => "IF (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES) > 10000 + THROW 5300, 'Too many tables', 10" + } + MANIFEST + + apply_manifest_on(host, pp) do |r| + expect(r.stderr).not_to match(/Error/i) + end + + puts "Validate #{@table_name} is NOT created:" + run_sql_query(host, {:query => @query, :sql_admin_user => @admin_user, \ + :sql_admin_pass => @admin_pass, :expected_row_count => 0}) + end + + it "Negative test: Run tsql with invalid command:" do + pp = <<-MANIFEST + sqlserver::config{'MSSQLSERVER': + instance_name => 'MSSQLSERVER', + admin_user => 'sa', + admin_pass => 'Pupp3t1@', + } + sqlserver_tsql{'testsqlserver_tsql': + instance => 'MSSQLSERVER', + database => '#{DB_NAME}', + command => "invalid-tsql-command", + } + MANIFEST + apply_manifest_on(host, pp, {:acceptable_exit_codes => [0,1]}) do |r| + expect(r.stderr).to match(/Error/i) + end + end + + it "Negative test: Run tsql with non-existing database:" do + @table_name = 'Table_' + SecureRandom.hex(3) + pp = <<-MANIFEST + sqlserver::config{'MSSQLSERVER': + instance_name => 'MSSQLSERVER', + admin_user => 'sa', + admin_pass => 'Pupp3t1@', + } + sqlserver_tsql{'testsqlserver_tsql': + instance => 'MSSQLSERVER', + database => 'Non-Existing-Database', + command => "CREATE TABLE #{@table_name} (id INT, name VARCHAR(20), email VARCHAR(20));", + } + MANIFEST + apply_manifest_on(host, pp, {:acceptable_exit_codes => [0,1]}) do |r| + expect(r.stderr).to match(/Error/i) + end + end + end +end diff --git a/spec/sql_testing_helpers.rb b/spec/sql_testing_helpers.rb index f26ac5a4..ec164d0b 100644 --- a/spec/sql_testing_helpers.rb +++ b/spec/sql_testing_helpers.rb @@ -43,7 +43,7 @@ def install_sqlserver(host, opts = {}) apply_manifest_on(host, pp) end -def run_sql_query(host, opts = {}) +def run_sql_query(host, opts = {}, &block) query = opts[:query] server = opts[:server] instance = opts[:instance] @@ -54,10 +54,28 @@ def run_sql_query(host, opts = {}) $Env:Path +=\";C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\110\\Tools\\Binn;C:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\" sqlcmd.exe -S #{server}\\#{instance} -U #{sql_admin_user} -P #{sql_admin_pass} -Q \"#{query}\" EOS + # sqlcmd has problem authenticate to sqlserver if the instance is the default one MSSQLSERVER + # Below is a work-around for it (remove "-S server\instance" from the connection string) + if (instance == nil || instance == "MSSQLSERVER") + powershell.gsub!("-S #{server}\\#{instance}", "") + end + create_remote_file(host,"tmp.ps1", powershell) on(host, "powershell -NonInteractive -NoLogo -File \"C:\\cygwin64\\home\\Administrator\\tmp.ps1\"") do |r| - return r.stdout + match = /(\d*) rows affected/.match(r.stdout) + raise 'Could not match number of rows for SQL query' unless match + rows_observed = match[1] + error_message = "Expected #{opts[:expected_row_count]} rows but observed #{rows_observed}" + raise error_message unless opts[:expected_row_count] == rows_observed.to_i + end + if block_given? + case block.arity + when 0 + yield self + else + yield r + end end end From 78c7c663aac1ebc1b094eaf7691d1128e655ae6f Mon Sep 17 00:00:00 2001 From: phongdly Date: Tue, 8 Sep 2015 09:27:07 -0700 Subject: [PATCH 2/3] (MODULES-2453) removed '\' --- spec/acceptance/sqlserver_tsql_spec.rb | 30 ++++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/spec/acceptance/sqlserver_tsql_spec.rb b/spec/acceptance/sqlserver_tsql_spec.rb index 89e60e62..c3223f18 100644 --- a/spec/acceptance/sqlserver_tsql_spec.rb +++ b/spec/acceptance/sqlserver_tsql_spec.rb @@ -28,7 +28,7 @@ def ensure_sqlserver_database(host, ensure_val = 'present') end end - context "server_url =>", {:testrail => ['89024', '89025', '89026', '89068', '89069']} do + context "Test sqlserver_tsql", {:testrail => ['89024', '89025', '89026', '89068', '89069']} do before(:all) do # Create new database @@ -61,8 +61,13 @@ def ensure_sqlserver_database(host, ensure_val = 'present') end puts "validate the result of tsql command and table #{@table_name} should be created:" - run_sql_query(host, {:query => @query, :sql_admin_user => @admin_user, \ - :sql_admin_pass => @admin_pass, :expected_row_count => 1}) + run_sql_query_opts = { + :query => @query, + :sql_admin_user => @admin_user, + :sql_admin_pass => @admin_pass, + :expected_row_count => 1, + } + run_sql_query(host, run_sql_query_opts) end it "Run sqlserver_tsql WITH onlyif is true:" do @@ -88,9 +93,15 @@ def ensure_sqlserver_database(host, ensure_val = 'present') end puts "Validate #{@table_name} is successfully created:" - run_sql_query(host, {:query => @query, :sql_admin_user => @admin_user, \ - :sql_admin_pass => @admin_pass, :expected_row_count => 1}) + run_sql_query_opts = { + :query => @query, + :sql_admin_user => @admin_user, + :sql_admin_pass => @admin_pass, + :expected_row_count => 1, + } + run_sql_query(host, run_sql_query_opts) end + it "Run sqlserver_tsql WITH onlyif is false:" do #Initilize a new table name: @table_name = 'Table_' + SecureRandom.hex(3) @@ -115,8 +126,13 @@ def ensure_sqlserver_database(host, ensure_val = 'present') end puts "Validate #{@table_name} is NOT created:" - run_sql_query(host, {:query => @query, :sql_admin_user => @admin_user, \ - :sql_admin_pass => @admin_pass, :expected_row_count => 0}) + run_sql_query_opts = { + :query => @query, + :sql_admin_user => @admin_user, + :sql_admin_pass => @admin_pass, + :expected_row_count => 0, + } + run_sql_query(host, run_sql_query_opts) end it "Negative test: Run tsql with invalid command:" do From 0114f01709ed44a22f5f4710055df937cbb143b0 Mon Sep 17 00:00:00 2001 From: phongdly Date: Tue, 8 Sep 2015 13:20:12 -0700 Subject: [PATCH 3/3] (MODULES-2453) replaced server_url by meaningful text --- spec/acceptance/sqlserver_config_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/acceptance/sqlserver_config_spec.rb b/spec/acceptance/sqlserver_config_spec.rb index b481b616..5d2c058d 100644 --- a/spec/acceptance/sqlserver_config_spec.rb +++ b/spec/acceptance/sqlserver_config_spec.rb @@ -30,7 +30,7 @@ def ensure_sqlserver_instance(host, ensure_val = 'present') end end - context "server_url =>", {:testrail => ['89070', '89071', '89072', '89073']} do + context "Testing sqlserver::config", {:testrail => ['89070', '89071', '89072', '89073']} do before(:all) do # Create new instance