summaryrefslogtreecommitdiff
path: root/ext/pdo_odbc/tests
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-03-14 05:42:27 +0000
committer <>2013-04-03 16:25:08 +0000
commitc4dd7a1a684490673e25aaf4fabec5df138854c4 (patch)
tree4d57c44caae4480efff02b90b9be86f44bf25409 /ext/pdo_odbc/tests
downloadphp2-master.tar.gz
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/pdo_odbc/tests')
-rw-r--r--ext/pdo_odbc/tests/common.phpt77
-rw-r--r--ext/pdo_odbc/tests/long_columns.phpt140
2 files changed, 217 insertions, 0 deletions
diff --git a/ext/pdo_odbc/tests/common.phpt b/ext/pdo_odbc/tests/common.phpt
new file mode 100644
index 0000000..276f2b7
--- /dev/null
+++ b/ext/pdo_odbc/tests/common.phpt
@@ -0,0 +1,77 @@
+--TEST--
+ODBC
+--SKIPIF--
+<?php # vim:ft=php
+if (!extension_loaded('pdo_odbc')) print 'skip';
+if (substr(PHP_OS, 0, 3) == 'WIN' &&
+ false === getenv('PDOTEST_DSN') &&
+ false === getenv('PDO_ODBC_TEST_DSN') &&
+ !extension_loaded('com_dotnet')) {
+ die('skip - either PDOTEST_DSN or com_dotnet extension is needed to setup the connection');
+}
+--REDIRECTTEST--
+# magic auto-configuration
+
+$config = array(
+ 'TESTS' => 'ext/pdo/tests',
+ 'ENV' => array()
+);
+
+// try loading PDO driver using ENV vars and if none given, and on Windows, try using MS Access
+// and if not, skip the test
+//
+// try to use common PDO env vars, instead of PDO_ODBC specific
+if (false !== getenv('PDOTEST_DSN')) {
+ // user should have to set PDOTEST_DSN so that:
+ // 1. test is skipped if user doesn't want to test it, even if they have MS Access installed
+ // 2. it detects if ODBC driver is not installed - to avoid test bug
+ // 3. it detects if ODBC driver is installed - so test will be run
+ // 4. so a specific ODBC driver can be tested - if system has multiple ODBC drivers
+
+ $config['ENV']['PDOTEST_DSN'] = getenv('PDOTEST_DSN');
+ $config['ENV']['PDOTEST_USER'] = getenv('PDOTEST_USER');
+ $config['ENV']['PDOTEST_PASS'] = getenv('PDOTEST_PASS');
+ if (false !== getenv('PDOTEST_ATTR')) {
+ $config['ENV']['PDOTEST_ATTR'] = getenv('PDOTEST_ATTR');
+ }
+} else if (false !== getenv('PDO_ODBC_TEST_DSN')) {
+ // user set these from their shell instead
+ $config['ENV']['PDOTEST_DSN'] = getenv('PDO_ODBC_TEST_DSN');
+ $config['ENV']['PDOTEST_USER'] = getenv('PDO_ODBC_TEST_USER');
+ $config['ENV']['PDOTEST_PASS'] = getenv('PDO_ODBC_TEST_PASS');
+ if (false !== getenv('PDO_ODBC_TEST_ATTR')) {
+ $config['ENV']['PDOTEST_ATTR'] = getenv('PDO_ODBC_TEST_ATTR');
+ }
+} elseif (preg_match('/^WIN/i', PHP_OS)) {
+ // on Windows and user didn't set PDOTEST_DSN, try this as a fallback:
+ // check if MS Access DB is installed, and if yes, try using it. create a temporary MS access database.
+ //
+ $path = realpath(dirname(__FILE__)) . '\pdo_odbc.mdb';
+ if (!file_exists($path)) {
+ try {
+ // try to create database
+ $adox = new COM('ADOX.Catalog');
+ $adox->Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' . $path);
+ $adox = null;
+
+ } catch (Exception $e) {
+ }
+ }
+ if (file_exists($path)) {
+ // database was created and written to file system
+ $config['ENV']['PDOTEST_DSN'] = "odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$path;Uid=Admin";
+ } // else: $config['ENV']['PDOTEST_DSN'] not set
+} // else: $config['ENV']['PDOTEST_DSN'] not set
+// test will be skipped. see SKIPIF section of long_columns.phpt
+
+# other magic autodetection here, eg: for DB2 by inspecting env
+/*
+$USER = 'db2inst1';
+$PASSWD = 'ibmdb2';
+$DBNAME = 'SAMPLE';
+
+$CONNECTION = "odbc:DSN=$DBNAME;UID=$USER;PWD=$PASSWD;";
+*/
+
+
+return $config;
diff --git a/ext/pdo_odbc/tests/long_columns.phpt b/ext/pdo_odbc/tests/long_columns.phpt
new file mode 100644
index 0000000..e3430de
--- /dev/null
+++ b/ext/pdo_odbc/tests/long_columns.phpt
@@ -0,0 +1,140 @@
+--TEST--
+PDO ODBC "long" columns
+--SKIPIF--
+<?php # vim:ft=php
+if (!extension_loaded('pdo_odbc')) print 'skip not loaded';
+// make sure there is an ODBC driver and a DSN, or the test will fail
+include 'ext/pdo/tests/pdo_test.inc';
+$config = PDOTest::get_config('ext/pdo_odbc/tests/common.phpt');
+if (!isset($config['ENV']['PDOTEST_DSN']) || $config['ENV']['PDOTEST_DSN']===false) print 'skip';
+?>
+--FILE--
+<?php
+// setup: set PDOTEST_DSN environment variable
+// for MyODBC (MySQL) and MS SQL Server, you need to also set PDOTEST_USER and PDOTEST_PASS
+//
+// can use MS SQL Server on Linux - using unixODBC
+// -RHEL6.2
+// -download & instructions: http://www.microsoft.com/en-us/download/details.aspx?id=28160
+// -Linux6\sqlncli-11.0.1790.0.tar.gz (it calls RHEL6.x 'Linux6' for some reason)
+// -follow instructions on web page and install script
+// -may have to specify connection info in connection string without using a DSN (DSN-less connection)
+// -for example:
+// set PDOTEST_DSN='odbc:Driver=SQL Server Native Client 11.0;Server=10.200.51.179;Database=testdb'
+// set PDOTEST_USER=sa
+// set PDOTEST_PASS=Password01
+//
+// on Windows, the easy way to do this:
+// 1. install MS Access (part of MS Office) and include ODBC (Development tools feature)
+// install the x86 build of the Drivers. You might not be able to load the x64 drivers.
+// 2. in Control Panel, search for ODBC and open "Setup data sources (ODBC)"
+// 3. click on System DSN tab
+// 4. click Add and choose "Microsoft Access Driver (*.mdb, *.accdb)" driver
+// 5. enter a DSN, ex: accdb12
+// 6. click 'Create' and select a file to save the database as
+// -otherwise, you'll have to open MS Access, create a database, then load that file in this Window to map it to a DSN
+// 7. set the environment variable PDOTEST_DSN="odbc:<system dsn from step 5>" ex: SET PDOTEST_DSN=odbc:accdb12
+// -note: on Windows, " is included in environment variable
+//
+// easy way to compile:
+// configure --disable-all --enable-cli --enable-zts --enable-pdo --with-pdo-odbc --enable-debug
+// configure --disable-all --eanble-cli --enable-pdo --with-pdo-odbc=unixODBC,/usr,/usr --with-unixODBC=/usr --enable-debug
+//
+
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_odbc/tests/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+
+if (false === $db->exec('CREATE TABLE TEST (id INT NOT NULL PRIMARY KEY, data CLOB)')) {
+ if (false === $db->exec('CREATE TABLE TEST (id INT NOT NULL PRIMARY KEY, data longtext)')) {
+ if (false === $db->exec('CREATE TABLE TEST (id INT NOT NULL PRIMARY KEY, data varchar(4000))')) {
+ die("BORK: don't know how to create a long column here:\n" . implode(", ", $db->errorInfo()));
+ }
+ }
+}
+
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+// the driver reads columns in blocks of 255 bytes and then reassembles those blocks into a single buffer.
+// test sizes around 255 to make sure that the reassembly works (and that the column is split into 255 byte blocks by the database)
+// also, test sizes below 255 to make sure that they work - and are not treated as a long column (should be read in a single read)
+$sizes = array(32, 53, 64, 79, 128, 253, 254, 255, 256, 257, 258, 1022, 1023, 1024, 1025, 1026, 510, 511, 512, 513, 514, 1278, 1279, 1280, 1281, 1282, 2046, 2047, 2048, 2049, 2050, 1534, 1535, 1536, 1537, 1538, 3070, 3071, 3072, 3073, 3074, 3998, 3999, 4000);
+
+function alpha_repeat($len) {
+ // use the alphabet instead of 'i' characters to make sure the blocks don't overlap when they are reassembled
+ $out = "";
+ while (strlen($out) < $len) {
+ $out .= "abcdefghijklmnopqrstuvwxyz";
+ }
+ return substr($out, 0, $len);
+}
+
+// don't use Prepared Statements. that fails on MS SQL server (works with Access, MyODBC), which is a separate failure, feature/code-path from what
+// this test does - nice to be able to test using MS SQL server
+foreach ($sizes as $num) {
+ $text = alpha_repeat($num);
+ $db->exec("INSERT INTO TEST VALUES($num, '$text')");
+}
+
+// verify data
+foreach ($db->query('SELECT id, data from TEST') as $row) {
+ $expect = alpha_repeat($row[0]);
+ if (strcmp($expect, $row[1])) {
+ echo "Failed on size $row[id]:\n";
+ printf("Expected %d bytes, got %d\n", strlen($expect), strlen($row['data']));
+ echo ($expect) . "\n";
+ echo ($row['data']) . "\n";
+ } else {
+ echo "Passed on size $row[id]\n";
+ }
+}
+
+echo "Finished\n";
+
+--EXPECT--
+Passed on size 32
+Passed on size 53
+Passed on size 64
+Passed on size 79
+Passed on size 128
+Passed on size 253
+Passed on size 254
+Passed on size 255
+Passed on size 256
+Passed on size 257
+Passed on size 258
+Passed on size 1022
+Passed on size 1023
+Passed on size 1024
+Passed on size 1025
+Passed on size 1026
+Passed on size 510
+Passed on size 511
+Passed on size 512
+Passed on size 513
+Passed on size 514
+Passed on size 1278
+Passed on size 1279
+Passed on size 1280
+Passed on size 1281
+Passed on size 1282
+Passed on size 2046
+Passed on size 2047
+Passed on size 2048
+Passed on size 2049
+Passed on size 2050
+Passed on size 1534
+Passed on size 1535
+Passed on size 1536
+Passed on size 1537
+Passed on size 1538
+Passed on size 3070
+Passed on size 3071
+Passed on size 3072
+Passed on size 3073
+Passed on size 3074
+Passed on size 3998
+Passed on size 3999
+Passed on size 4000
+Finished
+