<?php

require_once(__DIR__ . "/../lib/UloggerAPITestCase.php");
if (!defined("ROOT_DIR")) { define("ROOT_DIR", __DIR__ . "/../.."); }
require_once(ROOT_DIR . "/helpers/config.php");
require_once(ROOT_DIR . "/helpers/lang.php");

class ImportTest extends UloggerAPITestCase {

  public function testImportGPX10() {

    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx10 = '<?xml version="1.0"?>
    <gpx version="1.0" creator="test software"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/0"
    xsi:schemaLocation="http://www.topografix.com/GPX/1/0
    http://www.topografix.com/GPX/1/0/gpx.xsd">
      <time>2017-09-19T11:00:08Z</time>
      <trk>
        <name>' . $this->testTrackName . '</name>
        <trkseg>
          <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '">
            <ele>' . $this->testAltitude . '</ele>
            <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp) . '</time>
          </trkpt>
          <trkpt lat="' . $this->testLat . '" lon="' . -1 * $this->testLon . '">
            <ele>' . $this->testAltitude . '</ele>
            <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp + 1) . '</time>
          </trkpt>
        </trkseg>
      </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx10)
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(0, (int) $xml->error, "Wrong error status");
    $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
    $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");

    $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $expected = [
      "id" => 1,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "tracks",
      "SELECT * FROM tracks"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 1,
      "time" => $this->testTimestamp,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon,
      "altitude" => $this->testAltitude,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "positions",
      "SELECT id, " . $this->unix_timestamp('time') . " AS time, user_id, track_id, latitude, longitude,
      altitude, speed, bearing, accuracy, provider, comment, image_id  FROM positions"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");

    $expected = [
      "id" => 2,
      "time" => $this->testTimestamp + 1,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon * -1,
      "altitude" => $this->testAltitude,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
  }

  public function testImportGPX11() {

    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx11 = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <gpx version="1.1"
        creator="test creator"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.topografix.com/GPX/1/1"
        xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
      <metadata>
        <name>' . $this->testTrackComment . '</name>
        <desc>Track for testing ulogger</desc>
        <author>
          <name>Bartek Fabiszewski</name>
          <link href="http://www.fabiszewski.net"><text>fabiszewski.net</text></link>
        </author>
        <time>2017-09-19T09:22:06Z</time>
        <keywords>Test, ulogger</keywords>
        <bounds minlat="44.64365345" maxlat="45.341" minlon="14.452354" maxlon="24.54234"/>
      </metadata>
      <trk>
        <src>Crafted by Bartek Fabiszewski</src>
        <link href="http://www.fabiszewski.net"><text>fabiszewski.net</text></link>
        <trkseg>
          <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '">
            <ele>' . $this->testAltitude . '</ele>
            <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp) . '</time>
            <fix>3d</fix>
            <hdop>300</hdop><vdop>300</vdop><pdop>300</pdop>
          </trkpt>
        </trkseg>
      </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx11),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(0, (int) $xml->error, "Wrong error status");
    $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
    $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");

    $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(1, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $expected = [
      "id" => 1,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => $this->testTrackComment
    ];
    $actual = $this->getConnection()->createQueryTable(
      "tracks",
      "SELECT * FROM tracks"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 1,
      "time" => $this->testTimestamp,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon,
      "altitude" => $this->testAltitude,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "positions",
      "SELECT id, " . $this->unix_timestamp('time') . " AS time, user_id, track_id, latitude, longitude,
      altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
  }

  public function testImportExtensions() {

    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1
    http://www.topografix.com/GPX/1/1/gpx.xsd
    https://github.com/bfabiszewski/ulogger-android/1
    https://github.com/bfabiszewski/ulogger-android/gpx_extensions1.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    xmlns:ulogger="https://github.com/bfabiszewski/ulogger-android/1"
    creator="μlogger" version="1.1">
      <metadata>
      <name>' . $this->testTrackComment . '</name>
      <time>2017-06-24T22:50:45Z</time>
      </metadata>
      <trk>
      <name>' . $this->testTrackName . '</name>
      <trkseg>
        <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '">
        <ele>' . $this->testAltitude . '</ele>
        <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp) . '</time>
        <name>1</name>
        <desc><![CDATA[User: demo Track: client_test2 Time: 2017-06-25 00:50:45 (Europe/Warsaw) Speed: 0 km/h Altitude: 15 m Total time: 00:00:00 Average speed: 0 km/h Total distance: 0 km Point 1 of 18]]></desc>
        <extensions>
          <ulogger:speed>' . $this->testSpeed . '</ulogger:speed>
          <ulogger:bearing>' . $this->testBearing . '</ulogger:bearing>
          <ulogger:accuracy>' . $this->testAccuracy . '</ulogger:accuracy>
          <ulogger:provider>' . $this->testProvider . '</ulogger:provider>
        </extensions>
        </trkpt>
        </trkseg>
      </trk>
      </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(0, (int) $xml->error, "Wrong error status");
    $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
    $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");

    $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(1, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $expected = [
      "id" => 1,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => $this->testTrackComment
    ];
    $actual = $this->getConnection()->createQueryTable(
      "tracks",
      "SELECT * FROM tracks"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 1,
      "time" => $this->testTimestamp,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon,
      "altitude" => $this->testAltitude,
      "speed" => $this->testSpeed,
      "bearing" => $this->testBearing,
      "accuracy" => $this->testAccuracy,
      "provider" => $this->testProvider,
      "comment" => null,
      "image_id" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "positions",
      "SELECT id, " . $this->unix_timestamp('time') . " AS time, user_id, track_id, latitude, longitude,
      altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
  }

  public function testImportNoTime() {

    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1
    http://www.topografix.com/GPX/1/1/gpx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    creator="μlogger" version="1.1">
      <trk>
        <trkseg>
          <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '"></trkpt>
        </trkseg>
      </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(0, (int) $xml->error, "Wrong error status");
    $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
    $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");

    $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(1, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $expected = [
      "id" => 1,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "tracks",
      "SELECT * FROM tracks"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 1,
      "time" => 1,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon,
      "altitude" => null,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "positions",
      "SELECT id, " . $this->unix_timestamp('time') . " AS time, user_id, track_id, latitude, longitude,
      altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
  }

  public function testImportMultipleSegments() {

    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    creator="μlogger" version="1.1">
      <trk>
        <trkseg>
          <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '">
            <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp) . '</time>
          </trkpt>
        </trkseg>
        <trkseg>
          <trkpt lat="' . ($this->testLat + 1) . '" lon="' . ($this->testLon + 1) . '">
            <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp + 1) . '</time>
          </trkpt>
        </trkseg>
      </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(0, (int) $xml->error, "Wrong error status: $xml->message");
    $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
    $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");

    $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $expected = [
      "id" => 1,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "tracks",
      "SELECT * FROM tracks"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 1,
      "time" => $this->testTimestamp,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon,
      "altitude" => null,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "positions",
      "SELECT id, " . $this->unix_timestamp('time') . " AS time, user_id, track_id, latitude, longitude,
      altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 2,
      "time" => $this->testTimestamp + 1,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat + 1,
      "longitude" => $this->testLon + 1,
      "altitude" => null,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
  }

  public function testImportMultipleTracks() {

    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    creator="μlogger" version="1.1">
      <trk>
        <trkseg>
          <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '">
            <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp) . '</time>
          </trkpt>
        </trkseg>
      </trk>
      <trk>
      <trkseg>
        <trkpt lat="' . ($this->testLat + 1) . '" lon="' . ($this->testLon + 1) . '">
          <time>' . gmdate("Y-m-d\TH:i:s\Z", $this->testTimestamp + 1) . '</time>
        </trkpt>
      </trkseg>
    </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(0, (int) $xml->error, "Wrong error status: $xml->message");
    $this->assertEquals(2, (int) $xml->trackid, "Wrong error message");
    $this->assertEquals(2, (int) $xml->trackcnt, "Wrong error message");

    $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $expected = [
      "id" => 1,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "tracks",
      "SELECT * FROM tracks"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 2,
      "user_id" => 1,
      "name" => $this->testTrackName,
      "comment" => null
    ];
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 1,
      "time" => $this->testTimestamp,
      "user_id" => 1,
      "track_id" => 1,
      "latitude" => $this->testLat,
      "longitude" => $this->testLon,
      "altitude" => null,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $actual = $this->getConnection()->createQueryTable(
      "positions",
      "SELECT id, " . $this->unix_timestamp('time') . " AS time, user_id, track_id, latitude, longitude,
      altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
    );
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
    $expected = [
      "id" => 2,
      "time" => $this->testTimestamp + 1,
      "user_id" => 1,
      "track_id" => 2,
      "latitude" => $this->testLat + 1,
      "longitude" => $this->testLon + 1,
      "altitude" => null,
      "speed" => null,
      "bearing" => null,
      "accuracy" => null,
      "provider" => "gps",
      "comment" => null,
      "image_id" => null
    ];
    $this->assertTableContains($expected, $actual, "Wrong actual table data");
  }

  public function testImportNoLongitude() {
    $lang = (new uLang("en"))->getStrings();
    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1
    http://www.topografix.com/GPX/1/1/gpx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    creator="μlogger" version="1.1">
      <trk>
        <trkseg>
          <trkpt lat="' . $this->testLat . '"></trkpt>
        </trkseg>
      </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(1, (int) $xml->error, "Wrong error status");
    $this->assertEquals($lang["iparsefailure"], (string) $xml->message, "Wrong error status");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
  }

  public function testImportNoLatitude() {
    $lang = (new uLang("en"))->getStrings();
    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1
    http://www.topografix.com/GPX/1/1/gpx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    creator="μlogger" version="1.1">
      <trk>
        <trkseg>
          <trkpt lon="' . $this->testLon . '"></trkpt>
        </trkseg>
      </trk>
    </gpx>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(1, (int) $xml->error, "Wrong error status");
    $this->assertEquals($lang["iparsefailure"], (string) $xml->message, "Wrong error status");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
  }

  public function testImportNoGPX() {
    $lang = (new uLang("en"))->getStrings();
    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
      <trk>
        <trkseg>
          <trkpt lat="' . $this->testLat . '" lon="' . $this->testLon . '"></trkpt>
        </trkseg>
      </trk>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(1, (int) $xml->error, "Wrong error status");
    $this->assertEquals($lang["iparsefailure"], (string) $xml->message, "Wrong error status");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
  }

  public function testImportCorrupt() {
    $lang = (new uLang("en"))->getStrings();
    $this->assertTrue($this->authenticate(), "Authentication failed");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");

    $gpx = '<?xml version="1.0" encoding="UTF-8"?>
    <gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1
    http://www.topografix.com/GPX/1/1/gpx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/1"
    creator="μlogger" version="1.1">
      <trk>
        <trkseg>
          <trkpt lon="' . $this->testLon . '"></trkpt>
        </trkseg>';

    $options = [
      "http_errors" => false,
      "multipart" => [
        [
          "name" => "gpx",
          "contents" => $this->getStream($gpx),
          "filename" => $this->testTrackName
        ],
        [
          "name" => "MAX_FILE_SIZE",
          "contents" => 300000
        ]
      ],
    ];
    $response = $this->http->post("/utils/import.php", $options);
    $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");

    $xml = $this->getXMLfromResponse($response);

    $this->assertTrue($xml !== false, "XML object is false");
    $this->assertEquals(1, (int) $xml->error, "Wrong error status");
    $this->assertEquals(0, strpos((string) $xml->message, $lang["iparsefailure"]), "Wrong error status");

    $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
    $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
  }


  private function getXMLfromResponse($response) {
    $xml = false;
    libxml_use_internal_errors(true);
    try {
      $xml = new SimpleXMLElement((string) $response->getBody());
    } catch (Exception $e) { /* ignore */ }
    return $xml;
  }

  private function getStream($string) {
    $stream = tmpfile();
    fwrite($stream, $string);
    fseek($stream, 0);
    return $stream;
  }

}

?>