Merge pull request #36 from corley/feature/refactor-tests

Test suite completely rewritten
This commit is contained in:
Walter Dal Mut
2015-06-23 19:34:26 +02:00
14 changed files with 763 additions and 560 deletions
+2 -1
View File
@@ -38,7 +38,8 @@
},
"autoload-dev": {
"psr-4": {
"InfluxDB\\": ["./tests/"]
"InfluxDB\\": ["./tests/unit"],
"InfluxDB\\Integration\\": ["./tests/integration"]
}
},
"suggest": {
Generated
+43 -49
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "61a6988d1b757bb9d3a074d156d73f9d",
"hash": "4a2caee24e54a12ad907d21ddda10e87",
"packages": [
{
"name": "guzzlehttp/guzzle",
@@ -429,16 +429,16 @@
},
{
"name": "doctrine/instantiator",
"version": "1.0.4",
"version": "1.0.5",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "f976e5de371104877ebc89bd8fecb0019ed9c119"
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119",
"reference": "f976e5de371104877ebc89bd8fecb0019ed9c119",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
"shasum": ""
},
"require": {
@@ -449,7 +449,7 @@
"ext-pdo": "*",
"ext-phar": "*",
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "2.0.*@ALPHA"
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"extra": {
@@ -458,8 +458,8 @@
}
},
"autoload": {
"psr-0": {
"Doctrine\\Instantiator\\": "src"
"psr-4": {
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -479,7 +479,7 @@
"constructor",
"instantiate"
],
"time": "2014-10-13 12:58:55"
"time": "2015-06-14 21:17:01"
},
{
"name": "kevinlebrun/colors.php",
@@ -685,16 +685,16 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "2.1.5",
"version": "2.1.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e"
"reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be2286cb8c7e1773eded49d9719219e6f74f9e3e",
"reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
"reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
"shasum": ""
},
"require": {
@@ -743,7 +743,7 @@
"testing",
"xunit"
],
"time": "2015-06-09 13:05:42"
"time": "2015-06-19 07:11:55"
},
{
"name": "phpunit/php-file-iterator",
@@ -794,16 +794,16 @@
},
{
"name": "phpunit/php-text-template",
"version": "1.2.0",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
"reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
"shasum": ""
},
"require": {
@@ -812,20 +812,17 @@
"type": "library",
"autoload": {
"classmap": [
"Text/"
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sb@sebastian-bergmann.de",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -834,20 +831,20 @@
"keywords": [
"template"
],
"time": "2014-01-30 17:20:04"
"time": "2015-06-21 13:50:34"
},
{
"name": "phpunit/php-timer",
"version": "1.0.5",
"version": "1.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c"
"reference": "83fe1bdc5d47658b727595c14da140da92b3d66d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
"reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d",
"reference": "83fe1bdc5d47658b727595c14da140da92b3d66d",
"shasum": ""
},
"require": {
@@ -856,13 +853,10 @@
"type": "library",
"autoload": {
"classmap": [
"PHP/"
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
@@ -878,20 +872,20 @@
"keywords": [
"timer"
],
"time": "2013-08-02 07:42:54"
"time": "2015-06-13 07:35:30"
},
{
"name": "phpunit/php-token-stream",
"version": "1.4.1",
"version": "1.4.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
"reference": "eab81d02569310739373308137284e0158424330"
"reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330",
"reference": "eab81d02569310739373308137284e0158424330",
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
"reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
"shasum": ""
},
"require": {
@@ -927,20 +921,20 @@
"keywords": [
"tokenizer"
],
"time": "2015-04-08 04:46:07"
"time": "2015-06-19 03:43:16"
},
{
"name": "phpunit/phpunit",
"version": "4.7.3",
"version": "4.7.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "41fea1e84ed84d373f5ac099a1276c4358c90708"
"reference": "f6701ef3faea759acd1910a7751d8d102a7fd5bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/41fea1e84ed84d373f5ac099a1276c4358c90708",
"reference": "41fea1e84ed84d373f5ac099a1276c4358c90708",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f6701ef3faea759acd1910a7751d8d102a7fd5bc",
"reference": "f6701ef3faea759acd1910a7751d8d102a7fd5bc",
"shasum": ""
},
"require": {
@@ -954,7 +948,7 @@
"phpunit/php-code-coverage": "~2.1",
"phpunit/php-file-iterator": "~1.4",
"phpunit/php-text-template": "~1.2",
"phpunit/php-timer": "~1.0",
"phpunit/php-timer": ">=1.0.6",
"phpunit/phpunit-mock-objects": "~2.3",
"sebastian/comparator": "~1.1",
"sebastian/diff": "~1.2",
@@ -999,7 +993,7 @@
"testing",
"xunit"
],
"time": "2015-06-11 16:20:25"
"time": "2015-06-21 07:23:36"
},
{
"name": "phpunit/phpunit-mock-objects",
@@ -1440,16 +1434,16 @@
},
{
"name": "sebastian/version",
"version": "1.0.5",
"version": "1.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
"reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4"
"reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
"reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
"reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
"shasum": ""
},
"type": "library",
@@ -1471,7 +1465,7 @@
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"time": "2015-02-24 06:35:25"
"time": "2015-06-21 13:59:46"
},
{
"name": "symfony/yaml",
+5 -14
View File
@@ -5,24 +5,15 @@
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
verbose="false">
verbose="true">
<testsuites>
<testsuite name="InfluxDB SDK Integration Tests">
<directory>tests</directory>
<directory>tests/integration</directory>
</testsuite>
<testsuite name="InfluxDB SDK Unit Tests">
<directory>tests/unit</directory>
</testsuite>
</testsuites>
<php>
<env name="UDP_PORT" value="4444"/>
<env name="UDP_DB" value="udp.test"/>
<env name="TCP_PORT" value="8086"/>
<env name="TCP_DB" value="tcp.test"/>
<env name="TCP_PROTOCOL" value="http"/>
<env name="HOST" value="localhost"/>
<env name="USERNAME" value="root"/>
<env name="PASSWORD" value="root"/>
</php>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
+8 -3
View File
@@ -3,7 +3,7 @@ namespace InfluxDB\Adapter;
use DateTime;
final class UdpAdapter extends AdapterAbstract
class UdpAdapter extends AdapterAbstract
{
public function send(array $message)
{
@@ -37,7 +37,7 @@ final class UdpAdapter extends AdapterAbstract
$tags = array_replace_recursive($tags, $message["tags"]);
}
$unixepoch = (int)(microtime(true) * 1e9);
$unixepoch = $this->generateTimeInNanoSeconds();
if (array_key_exists("time", $message)) {
$dt = new DateTime($message["time"]);
$unixepoch = (int)($dt->format("U") * 1e9);
@@ -68,7 +68,12 @@ final class UdpAdapter extends AdapterAbstract
return implode("\n", $lines);
}
private function toKeyValue(array $elems, $escape=false)
protected function generateTimeInNanoSeconds()
{
return (int)(microtime(true) * 1e9);
}
protected function toKeyValue(array $elems, $escape=false)
{
$list = [];
foreach ($elems as $key => $value) {
-475
View File
@@ -1,475 +0,0 @@
<?php
namespace InfluxDB;
use DateTime;
use DateTimeZone;
use InfluxDB\Adapter\GuzzleAdapter as InfluxHttpAdapter;
use InfluxDB\Options;
use InfluxDB\Adapter\UdpAdapter;
use GuzzleHttp\Client as GuzzleHttpClient;
class ClientTest extends \PHPUnit_Framework_TestCase
{
private $rawOptions;
private $object;
private $options;
private $anotherClient;
public function setUp()
{
$options = include __DIR__ . '/bootstrap.php';
$this->rawOptions = $options;
$tcpOptions = $options["tcp"];
$options = new Options();
$options->setHost($tcpOptions["host"]);
$options->setPort($tcpOptions["port"]);
$options->setUsername($tcpOptions["username"]);
$options->setPassword($tcpOptions["password"]);
$options->setDatabase($tcpOptions["database"]);
$this->options = $options;
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$influx = new Client($adapter);
$this->object = $influx;
$databases = $this->object->getDatabases();
if (array_key_exists("values", $databases["results"][0]["series"][0])) {
foreach ($databases["results"][0]["series"][0]["values"] as $database) {
$this->object->deleteDatabase($database[0]);
}
}
$this->object->createDatabase($this->rawOptions["udp"]["database"]);
$this->object->createDatabase($this->rawOptions["tcp"]["database"]);
}
/**
* @group tcp
*/
public function testGuzzleHttpApiWorksCorrectly()
{
$this->object->mark("tcp.test", ["mark" => "element"]);
sleep(1);
$body = $this->object->query("select * from \"tcp.test\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("mark", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals("element", $body["results"][0]["series"][0]["values"][0][1]);
}
/**
* @group tcp
* @group proxy
*/
public function testGuzzleHttpApiWorksCorrectlyWithProxies()
{
$this->options->setHost("localhost");
$this->options->setPort(9000);
$this->options->setPrefix("/influxdb");
$this->object->mark("tcp.test", ["mark" => "element"]);
sleep(2);
$body = $this->object->query("select * from \"tcp.test\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("mark", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals("element", $body["results"][0]["series"][0]["values"][0][1]);
}
/**
* @group tcp
*/
public function testGuzzleHttpQueryApiWorksCorrectly()
{
$this->object->mark("tcp.test", ["mark" => "element"]);
sleep(1);
$body = $this->object->query("select * from \"tcp.test\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("mark", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals("element", $body["results"][0]["series"][0]["values"][0][1]);
}
/**
* @group tcp
*/
public function testGuzzleHttpQueryApiWithMultipleData()
{
$this->object->mark("tcp.test", ["mark" => "element"]);
$this->object->mark("tcp.test", ["mark" => "element2"]);
$this->object->mark("tcp.test", ["mark" => "element3"]);
sleep(1);
$body = $this->object->query("select mark from \"tcp.test\"", "s");
$this->assertCount(3, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("mark", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals("element", $body["results"][0]["series"][0]["values"][0][1]);
}
/**
* @group tcp
*/
public function testWriteDirectMessages()
{
$this->object->mark([
"tags" => [
"dc" => "eu-west-1",
],
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
sleep(1);
$body = $this->object->query("select * from \"vm-serie\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("cpu", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals(18.12, $body["results"][0]["series"][0]["values"][0][1]);
}
/**
* @group tcp
*/
public function testOverrideDatabaseNameViaMessage()
{
$this->options->setDatabase("a-wrong-database");
$this->object->mark([
"database" => "tcp.test",
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
sleep(1);
$this->options->setDatabase("tcp.test");
$body = $this->object->query("select * from \"vm-serie\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("cpu", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals(18.12, $body["results"][0]["series"][0]["values"][0][1]);
$this->assertEquals(712423, $body["results"][0]["series"][0]["values"][0][2]);
}
/**
* @group udp
*/
public function testUdpIpWriteData()
{
$object = $this->createClientWithUdpAdapter();
$object->mark("udp.test", ["mark" => "element"]);
$object->mark("udp.test", ["mark" => "element1"]);
$object->mark("udp.test", ["mark" => "element2"]);
$object->mark("udp.test", ["mark" => "element3"]);
// Wait UDP/IP message arrives
sleep(2);
$this->options->setDatabase("udp.test");
$body = $this->object->query("select * from \"udp.test\"");
$this->assertCount(4, $body["results"][0]["series"][0]["values"]);
}
/**
* @group udp
*/
public function testSendMultipleMeasurementWithUdpIp()
{
$object = $this->createClientWithUdpAdapter();
$object->mark([
"points" => [
[
"measurement" => "mem",
"fields" => [
"free" => 712423,
],
],
[
"measurement" => "cpu",
"fields" => [
"cpu" => 18.12,
],
],
]
]);
sleep(2);
$this->options->setDatabase("udp.test");
$body = $this->object->query("select * from \"cpu\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("cpu", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals(18.12, $body["results"][0]["series"][0]["values"][0][1]);
$body = $this->object->query("select * from \"mem\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("free", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals(712423, $body["results"][0]["series"][0]["values"][0][1]);
}
/**
* @group udp
*/
public function testWriteDirectMessageWithUdpIp()
{
$object = $this->createClientWithUdpAdapter();
$object->mark([
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
sleep(2);
$this->options->setDatabase("udp.test");
$body = $this->object->query("select * from \"vm-serie\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("cpu", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals(18.12, $body["results"][0]["series"][0]["values"][0][1]);
$this->assertEquals(712423, $body["results"][0]["series"][0]["values"][0][2]);
}
/**
* @group udp
* @group date
*/
public function testWriteDirectMessageWillPreserveActualTime()
{
$object = $this->createClientWithUdpAdapter();
$object->mark([
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
sleep(2);
$this->options->setDatabase("udp.test");
$body = $this->object->query("select * from \"vm-serie\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("time", $body["results"][0]["series"][0]["columns"][0]);
$saved = $body["results"][0]["series"][0]["values"][0][0];
$this->assertRegExp("/".date("Y-m-d")."/i", $saved);
}
/**
* @group udp
* @group date
*/
public function testWriteDirectMessageWillPreserveDatetime()
{
$object = $this->createClientWithUdpAdapter();
$object->mark([
"time" => "2009-11-10T23:00:00Z",
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
sleep(2);
$this->options->setDatabase("udp.test");
$body = $this->object->query("select * from \"vm-serie\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("time", $body["results"][0]["series"][0]["columns"][0]);
$this->assertEquals("2009-11-10T23:00:00Z", $body["results"][0]["series"][0]["values"][0][0]);
}
/**
* @group udp
* @group tags
*/
public function testTagsAreWrittenCorrectly()
{
$object = $this->createClientWithUdpAdapter();
$object->mark([
"tags" => [
"region" => "eu",
],
"points" => [
[
"measurement" => "vm-serie",
"tags" => [
"dc" => "eu-west-1",
"one" => "two",
],
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
[
"measurement" => "vm-serie",
"tags" => [
"dc" => "us-east-1",
],
"fields" => [
"cpu" => 28.12,
"free" => 412923,
],
],
]
]);
sleep(2);
$this->options->setDatabase("udp.test");
$body = $this->object->query("select * from \"vm-serie\" where dc='eu-west-1'");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
$this->assertEquals("cpu", $body["results"][0]["series"][0]["columns"][1]);
$this->assertEquals(18.12, $body["results"][0]["series"][0]["values"][0][1]);
$this->assertEquals(712423, $body["results"][0]["series"][0]["values"][0][2]);
}
/**
* Test that we handle socket problems correctly in the UDP
* adapter, and that they don't inturrupt the user's application.
*
* @group udp
*/
public function testReplicateIssue27()
{
$options = new \InfluxDB\Options();
// Configure options
$options->setHost('172.16.1.182');
$options->setPort(4444);
$options->setDatabase('...');
$options->setUsername('root');
$options->setPassword('root');
$httpAdapter = new \InfluxDB\Adapter\UdpAdapter($options);
$client = new \InfluxDB\Client($httpAdapter);
$client->mark("udp.test", ["mark" => "element"]);
}
public function testListActiveDatabses()
{
$databases = $this->object->getDatabases();
$this->assertCount(2, $databases["results"][0]["series"][0]["values"]);
}
public function testCreateANewDatabase()
{
$this->object->createDatabase("walter");
sleep(1);
$databases = $this->object->getDatabases();
$this->assertCount(3, $databases["results"][0]["series"][0]["values"]);
$this->object->deleteDatabase("walter");
}
private function createClientWithUdpAdapter()
{
$rawOptions = $this->rawOptions;
$options = new Options();
$options->setHost($rawOptions["udp"]["host"]);
$options->setUsername($rawOptions["udp"]["username"]);
$options->setPassword($rawOptions["udp"]["password"]);
$options->setPort($rawOptions["udp"]["port"]);
$options->setDatabase($rawOptions["udp"]["database"]);
$adapter = new UdpAdapter($options);
$object = new Client($adapter);
return $object;
}
/**
* @group udp
*/
public function testWriteUDPPackagesToNoOne()
{
$rawOptions = $this->rawOptions;
$options = new Options();
$options->setHost("127.0.0.1");
$options->setUsername("nothing");
$options->setPassword("nothing");
$options->setPort(64071); //This is a wrong port
$adapter = new UdpAdapter($options);
$object = new Client($adapter);
$object->mark("udp.test", ["mark" => "element"]);
}
/**
* @group udp
*/
public function testWriteUDPPackagesToInvalidHostname()
{
$rawOptions = $this->rawOptions;
$options = new Options();
$options->setHost("www.test-invalid.this-is-not-a-tld");
$options->setUsername("nothing");
$options->setPassword("nothing");
$options->setPort(15984);
$adapter = new UdpAdapter($options);
$object = new Client($adapter);
$object->mark("udp.test", ["mark" => "element"]);
}
}
-18
View File
@@ -1,18 +0,0 @@
<?php
return [
"tcp" => [
"host" => getenv('HOST'),
"port" => getenv('TCP_PORT'),
"protocol" => getenv('TCP_PROTOCOL'),
"database" => getenv('TCP_DB'),
"username" => getenv('USERNAME'),
"password" => getenv('PASSWORD'),
],
"udp" => [
"host" => getenv('HOST'),
"port" => getenv('UDP_PORT'),
"database" => getenv('UDP_DB'),
"username" => getenv('USERNAME'),
"password" => getenv('PASSWORD'),
],
];
@@ -0,0 +1,72 @@
<?php
namespace InfluxDB\Integration\Adapter;
use DateTime;
use DateTimeZone;
use InfluxDB\Options;
use InfluxDB\Client;
use InfluxDB\Adapter\GuzzleAdapter;
use GuzzleHttp\Client as GuzzleHttpClient;
use InfluxDB\Integration\Framework\TestCase as InfluxDBTestCase;
class GuzzleAdapterTest extends InfluxDBTestCase
{
public function testAdapterWriteDataCorrectly()
{
$this->getClient()->createDatabase("tcp.test");
$options = new Options();
$options->setPort(8086);
$options->setDatabase("tcp.test");
$http = new GuzzleHttpClient();
$adapter = new GuzzleAdapter($http, $options);
$adapter->send([
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
$this->assertSerieExists("tcp.test", "vm-serie");
$this->assertSerieCount("tcp.test", "vm-serie", 1);
$this->assertValueExistsInSerie("tcp.test", "vm-serie", "cpu", 18.12);
$this->assertValueExistsInSerie("tcp.test", "vm-serie", "free", 712423);
}
public function testWorksWithProxies()
{
$this->getClient()->createDatabase("proxy.test");
$options = new Options();
$options->setPort(9000);
$options->setDatabase("proxy.test");
$options->setPrefix("/influxdb");
$http = new GuzzleHttpClient();
$adapter = new GuzzleAdapter($http, $options);
$adapter->send([
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
$this->assertSerieExists("proxy.test", "vm-serie");
$this->assertSerieCount("proxy.test", "vm-serie", 1);
$this->assertValueExistsInSerie("proxy.test", "vm-serie", "cpu", 18.12);
$this->assertValueExistsInSerie("proxy.test", "vm-serie", "free", 712423);
}
}
@@ -0,0 +1,53 @@
<?php
namespace InfluxDB\Integration\Adapter;
use InfluxDB\Integration\Framework\TestCase as InfluxDBTestCase;
use InfluxDB\Adapter\UdpAdapter;
use InfluxDB\Options;
class UdpAdapterTest extends InfluxDBTestCase
{
public function testWriteSimplePointsUsingDirectWrite()
{
$options = (new Options())
->setPort(4444);
$adapter = new UdpAdapter($options);
$this->getClient()->createDatabase("udp.test");
$adapter->write("cpu value=12.33 " . (int)(microtime(true)*1e9));
sleep(2);
$this->assertSerieExists("udp.test", "cpu");
$this->assertSerieCount("udp.test", "cpu", 1);
$this->assertValueExistsInSerie("udp.test", "cpu", "value", 12.33);
}
public function testWriteSimplePointsUsingSendMethod()
{
$options = (new Options())
->setPort(4444);
$adapter = new UdpAdapter($options);
$this->getClient()->createDatabase("udp.test");
$adapter->send([
"retentionPolicy" => "default",
"points" => [
[
"measurement" => "mem",
"fields" => [
"value" => 1233,
],
],
],
]);
sleep(2);
$this->assertSerieExists("udp.test", "mem");
$this->assertSerieCount("udp.test", "mem", 1);
$this->assertValueExistsInSerie("udp.test", "mem", "value", 1233);
}
}
+166
View File
@@ -0,0 +1,166 @@
<?php
namespace InfluxDB\Integration;
use DateTime;
use DateTimeZone;
use InfluxDB\Options;
use InfluxDB\Adapter\UdpAdapter;
use InfluxDB\Adapter\GuzzleAdapter as InfluxHttpAdapter;
use GuzzleHttp\Client as GuzzleHttpClient;
use InfluxDB\Client;
use InfluxDB\Integration\Framework\TestCase;
class ClientTest extends TestCase
{
public function setUp()
{
parent::setUp();
$this->getClient()->createDatabase("tcp.test");
$this->getClient()->createDatabase("udp.test");
}
public function testSimpleMarkPublicSignature()
{
$options = new Options();
$options->setDatabase("tcp.test");
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$client = new Client($adapter);
$client->mark("vm", ["mark" => "element"]);
$this->assertSerieExists("tcp.test", "vm");
$this->assertSerieCount("tcp.test", "vm", 1);
$this->assertValueExistsInSerie("tcp.test", "vm", "mark", "element");
}
public function testDirectMessagesMarkPublicSignature()
{
$options = new Options();
$options->setDatabase("tcp.test");
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$client = new Client($adapter);
$client->mark([
"database" => "tcp.test",
"retentionPolicy" => "default",
"points" => [
[
"measurement" => "tt",
"fields" => [
"cpu" => 1,
"mem" => 2,
],
]
],
]);
$this->assertSerieExists("tcp.test", "tt");
$this->assertSerieCount("tcp.test", "tt", 1);
$this->assertValueExistsInSerie("tcp.test", "tt", "cpu", 1);
$this->assertValueExistsInSerie("tcp.test", "tt", "mem", 2);
}
public function testListActiveDatabases()
{
$options = new Options();
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$client = new Client($adapter);
$databases = $client->getDatabases();
$this->assertCount(2, $databases["results"][0]["series"][0]["values"]);
}
public function testCreateANewDatabase()
{
$options = new Options();
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$client = new Client($adapter);
$client->createDatabase("walter");
$databases = $client->getDatabases();
$this->assertCount(3, $databases["results"][0]["series"][0]["values"]);
}
public function testDropExistingDatabase()
{
$options = new Options();
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$client = new Client($adapter);
$client->createDatabase("walter");
$this->assertDatabasesCount(3);
$client->deleteDatabase("walter");
$this->assertDatabasesCount(2);
}
/**
* Test that we handle socket problems correctly in the UDP
* adapter, and that they don't inturrupt the user's application.
*
* @group udp
*/
public function testReplicateIssue27()
{
$options = new \InfluxDB\Options();
// Configure options
$options->setHost('172.16.1.182');
$options->setPort(4444);
$options->setDatabase('...');
$options->setUsername('root');
$options->setPassword('root');
$httpAdapter = new \InfluxDB\Adapter\UdpAdapter($options);
$client = new \InfluxDB\Client($httpAdapter);
$client->mark("udp.test", ["mark" => "element"]);
}
/**
* @group udp
*/
public function testWriteUDPPackagesToNoOne()
{
$options = new Options();
$options->setHost("127.0.0.1");
$options->setUsername("nothing");
$options->setPassword("nothing");
$options->setPort(64071); //This is a wrong port
$adapter = new UdpAdapter($options);
$object = new Client($adapter);
$object->mark("udp.test", ["mark" => "element"]);
}
/**
* @group udp
*/
public function testWriteUDPPackagesToInvalidHostname()
{
$options = new Options();
$options->setHost("www.test-invalid.this-is-not-a-tld");
$options->setUsername("nothing");
$options->setPassword("nothing");
$options->setPort(15984);
$adapter = new UdpAdapter($options);
$object = new Client($adapter);
$object->mark("udp.test", ["mark" => "element"]);
}
}
+91
View File
@@ -0,0 +1,91 @@
<?php
namespace InfluxDB\Integration\Framework;
use InfluxDB\Options;
use InfluxDB\Adapter\GuzzleAdapter as InfluxHttpAdapter;
use GuzzleHttp\Client as GuzzleHttpClient;
use InfluxDB\Client;
class TestCase extends \PHPUnit_Framework_TestCase
{
private $client;
private $options;
public function setUp()
{
$options = $this->options = new Options();
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$client = $this->client = new Client($adapter);
$this->dropAll();
}
public function tearDown()
{
$this->dropAll();
}
private function dropAll()
{
$databases = $this->getClient()->getDatabases();
if (array_key_exists("values", $databases["results"][0]["series"][0])) {
foreach ($databases["results"][0]["series"][0]["values"] as $database) {
$this->getClient()->deleteDatabase($database[0]);
}
}
}
public function assertValueExistsInSerie($database, $serieName, $column, $value)
{
$this->getOptions()->setDatabase($database);
$body = $this->getClient()->query("select {$column} from \"{$serieName}\"");
foreach ($body["results"][0]["series"][0]["values"] as $result) {
if ($result[1] == $value) {
return $this->assertTrue(true);
}
}
return $this->fail("Missing value '{$value}'");
}
public function assertSerieCount($database, $serieName, $count)
{
$this->getOptions()->setDatabase($database);
$body = $this->getClient()->query("select * from \"{$serieName}\"");
$this->assertCount(1, $body["results"][0]["series"][0]["values"]);
}
public function assertSerieExists($database, $serieName)
{
$this->getOptions()->setDatabase($database);
$body = $this->getClient()->query("show measurements");
foreach ($body["results"][0]["series"][0]["values"] as $result) {
if ($result[0] == $serieName) {
return $this->assertTrue(true);
}
}
return $this->fail("Missing serie with name '{$serieName}' in database '{$database}'");
}
public function assertDatabasesCount($count)
{
$databases = $this->client->getDatabases();
$this->assertCount($count, $databases["results"][0]["series"][0]["values"]);
}
public function getOptions()
{
return $this->options;
}
public function getClient()
{
return $this->client;
}
}
+180
View File
@@ -0,0 +1,180 @@
<?php
namespace InfluxDB\Adater;
use DateTime;
use DateTimeZone;
use InfluxDB\Options;
use GuzzleHttp\Client as GuzzleHttpClient;
use InfluxDB\Adapter\GuzzleAdapter as InfluxHttpAdapter;
use InfluxDB\Client;
use Prophecy\Argument;
class GuzzleAdapterTest extends \PHPUnit_Framework_TestCase
{
/**
* @group tcp
* @group proxy
* @dataProvider getWriteEndpoints
*/
public function testWriteEndpointGeneration($final, $options)
{
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$reflection = new \ReflectionClass(get_class($adapter));
$method = $reflection->getMethod("getHttpSeriesEndpoint");
$method->setAccessible(true);
$endpoint = $method->invokeArgs($adapter, []);
$this->assertEquals($final, $endpoint);
}
public function getWriteEndpoints()
{
return [
["http://localhost:9000/write", (new Options())->setHost("localhost")->setPort(9000)],
["https://localhost:9000/write", (new Options())->setHost("localhost")->setPort(9000)->setProtocol("https")],
["http://localhost:9000/influxdb/write", (new Options())->setHost("localhost")->setPort(9000)->setPrefix("/influxdb")],
];
}
/**
* @group tcp
* @group proxy
* @dataProvider getQueryEndpoints
*/
public function testQueryEndpointGeneration($final, $options)
{
$guzzleHttp = new GuzzleHttpClient();
$adapter = new InfluxHttpAdapter($guzzleHttp, $options);
$reflection = new \ReflectionClass(get_class($adapter));
$method = $reflection->getMethod("getHttpQueryEndpoint");
$method->setAccessible(true);
$endpoint = $method->invokeArgs($adapter, []);
$this->assertEquals($final, $endpoint);
}
public function getQueryEndpoints()
{
return [
["http://localhost:9000/query", (new Options())->setHost("localhost")->setPort(9000)],
["https://localhost:9000/query", (new Options())->setHost("localhost")->setPort(9000)->setProtocol("https")],
["http://localhost:9000/influxdb/query", (new Options())->setHost("localhost")->setPort(9000)->setPrefix("/influxdb")],
];
}
public function testMergeWithDefaultOptions()
{
$options = new Options();
$options->setDatabase("db");
$httpClient = $this->prophesize("GuzzleHttp\\Client");
$httpClient->post(Argument::Any(), [
"auth" => ["root", "root"],
"body" => '{"database":"db","retentionPolicy":"default"}',
])->shouldBeCalledTimes(1);
$adapter = new InfluxHttpAdapter($httpClient->reveal(), $options);
$adapter->send([]);
}
public function testAdapterPrepareJsonDataCorrectly()
{
$guzzleHttp = $this->prophesize("GuzzleHttp\Client");
$guzzleHttp->post("http://localhost:8086/write", [
"auth" => ["root", "root"],
"body" => '{"database":"db","retentionPolicy":"default","points":[{"measurement":"tcp.test","fields":{"mark":"element"}}]}',
])->shouldBeCalledTimes(1);
$options = (new Options())->setDatabase("db");
$adapter = new InfluxHttpAdapter($guzzleHttp->reveal(), $options);
$adapter->send([
"points" => [
[
"measurement" => "tcp.test",
"fields" => [
"mark" => "element"
]
]
]
]);
}
public function testDefaultOptionOverwrite()
{
$options = new Options();
$options->setDatabase("db");
$httpClient = $this->prophesize("GuzzleHttp\\Client");
$httpClient->post(Argument::Any(), [
"auth" => ["root", "root"],
"body" => '{"database":"mydb","retentionPolicy":"myPolicy"}',
])->shouldBeCalledTimes(1);
$adapter = new InfluxHttpAdapter($httpClient->reveal(), $options);
$adapter->send([
"database" => "mydb",
"retentionPolicy" => "myPolicy"
]);
}
public function testEmptyTagsFieldIsRemoved()
{
$options = new Options();
$options->setDatabase("db");
$httpClient = $this->prophesize("GuzzleHttp\\Client");
$httpClient->post(Argument::Any(), [
"auth" => ["root", "root"],
"body" => '{"database":"mydb","retentionPolicy":"myPolicy"}',
])->shouldBeCalledTimes(1);
$adapter = new InfluxHttpAdapter($httpClient->reveal(), $options);
$adapter->send([
"database" => "mydb",
"retentionPolicy" => "myPolicy",
"tags" => [],
]);
}
public function testGlobalTagsAreInPlace()
{
$options = new Options();
$options->setDatabase("db");
$options->setTags([
"dc" => "us-west",
]);
$httpClient = $this->prophesize("GuzzleHttp\\Client");
$httpClient->post(Argument::Any(), [
"auth" => ["root", "root"],
"body" => '{"database":"mydb","retentionPolicy":"myPolicy","tags":{"dc":"us-west"}}',
])->shouldBeCalledTimes(1);
$adapter = new InfluxHttpAdapter($httpClient->reveal(), $options);
$adapter->send([
"database" => "mydb",
"retentionPolicy" => "myPolicy",
]);
}
public function testTagsFieldIsMergedWithGlobalTags()
{
$options = new Options();
$options->setDatabase("db");
$options->setTags([
"dc" => "us-west",
]);
$httpClient = $this->prophesize("GuzzleHttp\\Client");
$httpClient->post(Argument::Any(), [
"auth" => ["root", "root"],
"body" => '{"database":"mydb","retentionPolicy":"myPolicy","tags":{"dc":"us-west","region":"us"}}',
])->shouldBeCalledTimes(1);
$adapter = new InfluxHttpAdapter($httpClient->reveal(), $options);
$adapter->send([
"database" => "mydb",
"retentionPolicy" => "myPolicy",
"tags" => ["region" => "us"],
]);
}
}
@@ -1,7 +1,13 @@
<?php
namespace InfluxDB\Adapter;
use DateTime;
use DateTimeZone;
use InfluxDB\Options;
use GuzzleHttp\Client as GuzzleHttpClient;
use InfluxDB\Adapter\GuzzleAdapter as InfluxHttpAdapter;
use InfluxDB\Client;
use Prophecy\Argument;
class UdpAdapterTest extends \PHPUnit_Framework_TestCase
{
@@ -91,4 +97,76 @@ EOF
],
];
}
/**
* @group udp
*/
public function testUdpIpWriteDataWillBeConvertedAsLineProtocol()
{
$options = (new Options())->setDatabase("test");
$adapter = $this->getMockBuilder("InfluxDB\\Adapter\\UdpAdapter")
->setConstructorArgs([$options])
->setMethods(["write", "generateTimeInNanoSeconds"])
->getMock();
$adapter->expects($this->any())
->method("generateTimeInNanoSeconds")
->will($this->returnValue(1245));
$adapter->expects($this->once())
->method("write")
->with("udp.test mark=\"element\" 1245");
$adapter->send([
"points" => [
[
"measurement" => "udp.test",
"fields" => [
"mark" => "element"
]
]
]
]);
}
/**
* @group udp
*/
public function testSendMultipleMeasurementWithUdpIp()
{
$options = (new Options())->setDatabase("test");
$adapter = $this->getMockBuilder("InfluxDB\\Adapter\\UdpAdapter")
->setConstructorArgs([$options])
->setMethods(["write", "generateTimeInNanoSeconds"])
->getMock();
$adapter->expects($this->any())
->method("generateTimeInNanoSeconds")
->will($this->onConsecutiveCalls(1245, 1246));
$adapter->expects($this->once())
->method("write")
->with(<<<EOF
mem free=712423 1245
cpu cpu=18.12 1245
EOF
);
$adapter->send([
"points" => [
[
"measurement" => "mem",
"fields" => [
"free" => 712423,
],
],
[
"measurement" => "cpu",
"fields" => [
"cpu" => 18.12,
],
],
]
]);
}
}
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace InfluxDB;
use DateTime;
use DateTimeZone;
use InfluxDB\Adapter\GuzzleAdapter as InfluxHttpAdapter;
use InfluxDB\Options;
use InfluxDB\Adapter\UdpAdapter;
use GuzzleHttp\Client as GuzzleHttpClient;
class ClientTest extends \PHPUnit_Framework_TestCase
{
public function testMarkNewMeasurementWithShortSyntax()
{
$mock = $this->prophesize("InfluxDB\\Adapter\\WritableInterface");
$mock->send([
"points" => [
[
"measurement" => "tcp.test",
"fields" => [
"mark" => "element"
]
]
]
])->shouldBeCalledTimes(1);
$object = new Client($mock->reveal());
$object->mark("tcp.test", ["mark" => "element"]);
}
public function testWriteDirectMessages()
{
$mock = $this->prophesize("InfluxDB\\Adapter\\WritableInterface");
$mock->send([
"tags" => [
"dc" => "eu-west-1",
],
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
]
]
]
])->shouldBeCalledTimes(1);
$object = new Client($mock->reveal());
$object->mark([
"tags" => [
"dc" => "eu-west-1",
],
"points" => [
[
"measurement" => "vm-serie",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
}
}