Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
16 / 16
30.00% covered (danger)
30.00%
6 / 20
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
API
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
16 / 16
30.00% covered (danger)
30.00%
6 / 20
100.00% covered (success)
100.00%
4 / 4
52.50
100.00% covered (success)
100.00%
1 / 1
 quake
n/a
0 / 0
n/a
0 / 0
n/a
0 / 0
n/a
0 / 0
0
 curlErrorNumber
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 curlErrorInfo
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 fetch
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
4
 replyIsSet
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
9 / 9
12.50% covered (danger)
12.50%
2 / 16
100.00% covered (success)
100.00%
1 / 1
21.75
1<?php
2namespace Dbmi\Webservice\Conversion;
3
4use Fdsn\DataStructure\LatLon as DS_LatLon;
5
6/**
7 * Library to convert idQuake between systems
8 */
9abstract class API{
10    public const conversionUrlTemplate = 'https://emidius.mi.ingv.it/services/rosetta/?type=event&input=%s&output=%s&format=json&parameters=yes&id=%s';
11    
12    protected string $from;
13    protected string $to;
14    protected string $idQuake;
15
16    protected array $reply;
17
18    private int $curlErrNum = 0;
19    private string $curlErrInfo = '';
20
21    abstract public function quake();
22
23    public function curlErrorNumber(){ return $this->curlErrNum; }
24    public function curlErrorInfo(){ return $this->curlErrInfo; }
25
26    /**
27     * Try to find the seismic event in DBMI database and its internal ID
28     *
29     * @return int  number of elements found (or -1 on error)
30     */
31    public function fetch():int{
32        $curlSession = curl_init();
33        curl_setopt_array($curlSession, array(
34            CURLOPT_URL         => sprintf(self::conversionUrlTemplate, $this->from, $this->to, $this->idQuake),
35            CURLOPT_HEADER         => false,
36            CURLOPT_CUSTOMREQUEST    => 'GET',
37            CURLOPT_RETURNTRANSFER    => true,
38            CURLOPT_FAILONERROR     => true,
39            //CURLOPT_VERBOSE        => true
40            )
41        );
42        $downloadedData = curl_exec($curlSession);
43        
44        $this->curlErrNum = curl_errno($curlSession);
45        $this->curlErrInfo = curl_error($curlSession);
46        curl_close($curlSession);
47
48        if(CURLE_OK != $this->curlErrNum) {
49            // @codeCoverageIgnoreStart
50            error_log(sprintf("[%s] [CurlErr: %d] %s", __METHOD__, $this->curlErrNum, $this->curlErrInfo));
51            return -1;
52            // @codeCoverageIgnoreEnd
53        }
54
55        if( empty($downloadedData) ){
56            error_log(sprintf("[%s] Empty response", __METHOD__));
57            return 0;
58        }
59        
60        $this->reply = json_decode($downloadedData, true);
61        if( ! $this->replyIsSet() ){
62            // @codeCoverageIgnoreStart
63            error_log(sprintf("[%s] Invalid reply '%s'", __METHOD__, $downloadedData));
64            return 0;
65            // @codeCoverageIgnoreEnd
66        }
67
68        return 1;
69    }
70
71    protected function replyIsSet():bool{
72        return ( isset($this->reply)
73            && is_array($this->reply) 
74            && array_key_exists('output', $this->reply)
75            && array_key_exists('id', $this->reply['output'])
76            && ! empty($this->reply['output']['id']));
77    }
78
79}
80
81?>

Branches

Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

API->curlErrorInfo
24    public function curlErrorInfo(){ return $this->curlErrInfo; }
API->curlErrorNumber
23    public function curlErrorNumber(){ return $this->curlErrNum; }
API->fetch
32        $curlSession = curl_init();
33        curl_setopt_array($curlSession, array(
34            CURLOPT_URL         => sprintf(self::conversionUrlTemplate, $this->from, $this->to, $this->idQuake),
35            CURLOPT_HEADER         => false,
36            CURLOPT_CUSTOMREQUEST    => 'GET',
37            CURLOPT_RETURNTRANSFER    => true,
38            CURLOPT_FAILONERROR     => true,
39            //CURLOPT_VERBOSE        => true
40            )
41        );
42        $downloadedData = curl_exec($curlSession);
43        
44        $this->curlErrNum = curl_errno($curlSession);
45        $this->curlErrInfo = curl_error($curlSession);
46        curl_close($curlSession);
47
48        if(CURLE_OK != $this->curlErrNum) {
55        if( empty($downloadedData) ){
56            error_log(sprintf("[%s] Empty response", __METHOD__));
57            return 0;
60        $this->reply = json_decode($downloadedData, true);
61        if( ! $this->replyIsSet() ){
68        return 1;
69    }
API->replyIsSet
72        return ( isset($this->reply)
73            && is_array($this->reply) 
73            && is_array($this->reply) 
74            && array_key_exists('output', $this->reply)
74            && array_key_exists('output', $this->reply)
75            && array_key_exists('id', $this->reply['output'])
75            && array_key_exists('id', $this->reply['output'])
76            && ! empty($this->reply['output']['id']));
76            && ! empty($this->reply['output']['id']));
77    }