Completed
Pull Request — master (#153)
by Deven
03:25
created

IncidentsTableTest::setUp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
namespace App\Test\TestCase\Model\Table;
4
5
use Cake\ORM\TableRegistry;
6
use Cake\TestSuite\TestCase;
7
8
class IncidentsTableTest extends TestCase
9
{
10
    public $fixtures = array(
11
        'app.notifications',
12
        'app.developers',
13
        'app.reports',
14
        'app.incidents',
15
    );
16
17
    public function setUp()
18
    {
19
        parent::setUp();
20
        $this->Incidents = TableRegistry::get('Incidents');
0 ignored issues
show
Bug introduced by
The property Incidents does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
21
    }
22
23
    public function testGetStackHash()
24
    {
25
        //$method = new ReflectionMethod('Incident', 'getStackHash');
26
        //$method->setAccessible(true);
27
28
        $stacktrace1 = array(
29
            array(
30
                'filename' => 'file1',
31
                'line' => 300,
32
            ),
33
            array(
34
                'filename' => 'file2',
35
                'line' => 200,
36
            ),
37
        );
38
39
        $stacktrace2 = array(
40
            array(
41
                'line' => 300,
42
                'filename' => 'file1',
43
            ),
44
            array(
45
                'line' => 200,
46
                'filename' => 'file2',
47
            ),
48
        );
49
50
        $result = $this->Incidents->getStackHash($stacktrace1);
51
        $this->assertEquals('a441639902837d88db25214812c0cd83', $result);
52
53
        $result = $this->Incidents->getStackHash($stacktrace2);
54
        $this->assertEquals('a441639902837d88db25214812c0cd83', $result);
55
    }
56
57
    public function testGetServer()
58
    {
59
        $method = new \ReflectionMethod($this->Incidents, '_getServer');
60
        $method->setAccessible(true);
61
62
        $result = $method->invoke($this->Incidents,
63
                'some random/data Apache/2.1.7;other.random/data');
64
        $this->assertEquals('Apache/2.1', $result);
65
66
        $result = $method->invoke($this->Incidents,
67
                'some random/data Nginx/1.0.7;other.random/data');
68
        $this->assertEquals('Nginx/1.0', $result);
69
70
        $result = $method->invoke($this->Incidents,
71
                'some random/data Lighttpd/4.6.7;other.random/data');
72
        $this->assertEquals('Lighttpd/4.6', $result);
73
74
        $result = $method->invoke($this->Incidents,
75
                'some random/data DoesNotExist/3.5;other.random/data');
76
        $this->assertEquals('UNKNOWN', $result);
77
    }
78
79
    public function testGetSimpleVersion()
80
    {
81
        $method = new \ReflectionMethod($this->Incidents, '_getSimpleVersion');
82
        $method->setAccessible(true);
83
84
        $result = $method->invoke($this->Incidents,
85
                '15.3.12.17', 1);
86
        $this->assertEquals('15', $result);
87
88
        $result = $method->invoke($this->Incidents,
89
                '15.3.12.17', 2);
90
        $this->assertEquals('15.3', $result);
91
92
        $result = $method->invoke($this->Incidents,
93
                '15.3.12.17', 3);
94
        $this->assertEquals('15.3.12', $result);
95
96
        $result = $method->invoke($this->Incidents,
97
                '15.3.12.17', 'wrong argument');
98
        $this->assertEquals('15', $result);
99
100
        $result = $method->invoke($this->Incidents,
101
                '15.3.12.17', -1);
102
        $this->assertEquals('15', $result);
103
    }
104
105
    public function testGetIdentifyingLocation()
106
    {
107
        $method = new \ReflectionMethod($this->Incidents, '_getIdentifyingLocation');
108
        $method->setAccessible(true);
109
110
        $stacktrace = array(
111
            array(
112
                'filename' => 'file1',
113
                'line' => 300,
114
            ),
115
            array(
116
                'filename' => 'file2',
117
                'line' => 200,
118
            ),
119
        );
120
121
        $stacktrace_script = array(
122
            array(
123
                'scriptname' => 'script1',
124
                'line' => 300,
125
            ),
126
            array(
127
                'filename' => 'file2',
128
                'line' => 200,
129
            ),
130
        );
131
132
        $stacktrace_uri = array(
133
            array(
134
                'uri' => 'sql.php',
135
                'line' => 5,
136
            ),
137
            array(
138
                'filename' => 'file2',
139
                'line' => 200,
140
            ),
141
        );
142
143
        $result = $method->invoke($this->Incidents,
144
                $stacktrace_script);
145
        $this->assertEquals(array('script1', 300), $result);
146
147
        $result = $method->invoke($this->Incidents,
148
                $stacktrace);
149
        $this->assertEquals(array('file1', 300), $result);
150
151
        $stacktrace[0]['filename'] = 'tracekit/tracekit.js';
152
        $result = $method->invoke($this->Incidents,
153
                $stacktrace);
154
        $this->assertEquals(array('file2', 200), $result);
155
156
        $stacktrace[0]['filename'] = 'error_report.js';
157
        $result = $method->invoke($this->Incidents,
158
                $stacktrace);
159
        $this->assertEquals(array('file2', 200), $result);
160
161
        $stacktrace[1] = null;
162
        $result = $method->invoke($this->Incidents,
163
                $stacktrace);
164
        $this->assertEquals(array('error_report.js', 300), $result);
165
166
        $result = $method->invoke($this->Incidents,
167
                $stacktrace_uri);
168
        $this->assertEquals(array('file2', 200), $result);
169
    }
170
171
    public function testGetSchematizedIncident()
172
    {
173
        $method = new \ReflectionMethod($this->Incidents, '_getSchematizedIncidents');
174
        $method->setAccessible(true);
175
176
        // Case-1: JavaScript Report
177
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_js.json');
178
        $bugReport = json_decode($bugReport, true);
179
180
        $result = $method->invoke($this->Incidents,
181
                $bugReport);
182
183
        $expected = array(
184
            array(
185
                'pma_version' => '4.0',
186
                'php_version' => '5.2',
187
                'steps' => '<script>test steps',
188
                'error_message' => 'a is not defined',
189
                'error_name' => 'ReferenceError',
190
                'browser' => 'FIREFOX 17',
191
                'user_os' => 'Windows',
192
                'locale' => 'en',
193
                'script_name' => 'tbl_relation.php',
194
                'configuration_storage' => 'enabled',
195
                'server_software' => 'NginX/1.17',
196
                'stackhash' => '9db5408094f1e76ef7161b7bbf3ddfe4',
197
                'full_report' => json_encode($bugReport),
198
                'stacktrace' => json_encode($bugReport['exception']['stack']),
199
                'exception_type' => 0,
200
            ),
201
        );
202
203
        $this->assertEquals($expected, $result);
204
205
        // Case-2: php Report
206
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_php.json');
207
        $bugReport = json_decode($bugReport, true);
208
209
        $result = $method->invoke($this->Incidents,
210
                $bugReport);
211
212
        $expected = array(
213
            array(
214
                'pma_version' => '4.3.0-dev',
215
                'php_version' => '5.5',
216
                'error_message' => 'Undefined variable: haha',
217
                'error_name' => 'Notice',
218
                'browser' => 'CHROME 27',
219
                'user_os' => 'Linux',
220
                'locale' => 'en',
221
                'script_name' => './libraries/Config.class.php',
222
                'configuration_storage' => 'disabled',
223
                'server_software' => 'Apache/2.4',
224
                'stackhash' => '5063bbe81a2daa6a6ad39c5cd315701c',
225
                'full_report' => json_encode($bugReport),
226
                'stacktrace' => json_encode($bugReport['errors'][0]['stackTrace']),
227
                'exception_type' => 1,
228
            ),
229
            array(
230
                'pma_version' => '4.3.0-dev',
231
                'php_version' => '5.5',
232
                'error_message' => 'Undefined variable: hihi',
233
                'error_name' => 'Notice',
234
                'browser' => 'CHROME 27',
235
                'user_os' => 'Linux',
236
                'locale' => 'en',
237
                'script_name' => './libraries/Util.class.php',
238
                'configuration_storage' => 'disabled',
239
                'server_software' => 'Apache/2.4',
240
                'stackhash' => 'e911a21765eae766463612e033773716',
241
                'full_report' => json_encode($bugReport),
242
                'stacktrace' => json_encode($bugReport['errors'][1]['stackTrace']),
243
                'exception_type' => 1,
244
            ),
245
            array(
246
                'pma_version' => '4.3.0-dev',
247
                'php_version' => '5.5',
248
                'error_message' => 'Undefined variable: hehe',
249
                'error_name' => 'Notice',
250
                'browser' => 'CHROME 27',
251
                'user_os' => 'Linux',
252
                'locale' => 'en',
253
                'script_name' => './index.php',
254
                'configuration_storage' => 'disabled',
255
                'server_software' => 'Apache/2.4',
256
                'stackhash' => '37848b23bdd6e737273516b9575fe407',
257
                'full_report' => json_encode($bugReport),
258
                'stacktrace' => json_encode($bugReport['errors'][2]['stackTrace']),
259
                'exception_type' => 1,
260
            ),
261
        );
262
263
        $this->assertEquals($expected, $result);
264
    }
265
266
    public function testGetReportDetails()
267
    {
268
        $method = new \ReflectionMethod($this->Incidents, '_getReportDetails');
269
        $method->setAccessible(true);
270
271
        // case-1: JavaScript BugReport
272
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_js.json');
273
        $bugReport = json_decode($bugReport, true);
274
275
        $result = $method->invoke($this->Incidents,
276
                $bugReport);
277
278
        $expected = array(
279
            'error_message' => 'a is not defined',
280
            'error_name' => 'ReferenceError',
281
            'status' => 'new',
282
            'location' => 'error.js',
283
            'linenumber' => (int) 312,
284
            'pma_version' => '4.0',
285
            'exception_type' => 0,
286
        );
287
288
        $this->assertEquals($expected, $result);
289
290
        // case-2: php BugReport
291
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_php.json');
292
        $bugReport = json_decode($bugReport, true);
293
294
        $result = $method->invoke($this->Incidents,
295
                $bugReport, 1);
296
297
        $expected = array(
298
            'error_message' => 'Undefined variable: hihi',
299
            'error_name' => 'Notice',
300
            'status' => 'new',
301
            'location' => './libraries/Util.class.php',
302
            'linenumber' => (int) 557,
303
            'pma_version' => '4.3.0-dev',
304
            'exception_type' => 1,
305
        );
306
        $this->assertEquals($expected, $result);
307
    }
308
309
    public function testGetClosestReport()
310
    {
311
        $method = new \ReflectionMethod($this->Incidents, '_getClosestReport');
312
        $method->setAccessible(true);
313
314
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_js.json');
315
        $bugReport = json_decode($bugReport, true);
316
317
        $returnedReport = null;
318
319
        $result = $method->invoke($this->Incidents,
320
                $bugReport);
321
322
        $this->assertEquals($returnedReport, $result);
323
    }
324
325
    public function testCreateIncidentFromBugReport()
326
    {
327
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_js.json');
328
        $bugReport = json_decode($bugReport, true);
329
330
        // Case-1: 'js' report
331
332
        // Case-1.1: closest report = null
333
        $result = $this->Incidents->createIncidentFromBugReport($bugReport);
334
        $this->assertEquals(1, count($result['incidents']));
335
336
        // One new report added (no closest report found)
337
        $this->assertEquals(1, count($result['reports']));
338
339
        // Case-1.2: closest report = some report.
340
        // Previously(in Case-1.1) inserted Reports serve as ClosestReports.
341
        $result = $this->Incidents->createIncidentFromBugReport($bugReport);
342
        $this->assertEquals(1, count($result['incidents']));
343
344
        // No new report added (closest report found)
345
        $this->assertEquals(0, count($result['reports']));
346
347
        $incident = $this->Incidents->get($result['incidents'][0]);
348
        // check the incident has been reported under the same 'Report'
349
        $result = TableRegistry::get('Incidents')->find('all', array('conditions' => array('report_id = ' . $incident->report_id)));
350
        $result = $result->hydrate(false)->toArray();
0 ignored issues
show
Deprecated Code introduced by
The method Cake\ORM\Query::hydrate() has been deprecated with message: 3.4.0 Use enableHydration()/isHydrationEnabled() instead.

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
351
        $this->assertEquals(2, count($result));
352
353
        // Case-2: for 'php' reports
354
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_php.json');
355
        $bugReport = json_decode($bugReport, true);
356
        // Case-2.1: closest report = null.
357
        $result = $this->Incidents->createIncidentFromBugReport($bugReport);
358
        $this->assertEquals(3, count($result['incidents']));
359
360
        // Three (one for each incident) new report added (no closest report found)
361
        $this->assertEquals(3, count($result['reports']));
362
363
        // Case-2.2: closest report = some report.
364
        // Previously(in Case-2.1) inserted Reports serve as ClosestReports.
365
        $result = $this->Incidents->createIncidentFromBugReport($bugReport);
366
        $this->assertEquals(3, count($result['incidents']));
367
368
        // No new report added (closest report found)
369
        $this->assertEquals(0, count($result['reports']));
370
371
        // check the incidents have been reported under the same 'Report's
372
        $incident = $this->Incidents->get($result['incidents'][0]);
373
        $result = TableRegistry::get('Incidents')->find('all', array('conditions' => array('report_id = ' . $incident->report_id)));
374
        $result = $result->hydrate(false)->toArray();
0 ignored issues
show
Deprecated Code introduced by
The method Cake\ORM\Query::hydrate() has been deprecated with message: 3.4.0 Use enableHydration()/isHydrationEnabled() instead.

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
375
        $this->assertEquals(2, count($result));
376
377
        // Case 3.1: Long PHP report submission
378
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_php.json');
379
        $bugReport = json_decode($bugReport, true);
380
381
        // Forcefully inflate the report by inflating $bugReport['errors']
382
        for ($i = 0; $i < 2000; $i++) {
383
            $bugReport['errors'][] = $bugReport['errors'][0];
384
        }
385
        $result = $this->Incidents->createIncidentFromBugReport($bugReport);
386
387
        $this->assertEquals(true, in_array(false, $result['incidents']));
388
389
390
        // Case 3.2: Long JS report submission
391
        $bugReport = file_get_contents(TESTS . 'Fixture' . DS . 'report_js.json');
392
        $bugReport = json_decode($bugReport, true);
393
394
        // Forcefully inflate the report by inflating $bugReport['exception']['stack']
395
        for ($i = 0; $i < 1500; $i++) {
396
            $bugReport['exception']['stack'][] = $bugReport['exception']['stack'][0];
397
        }
398
        $result = $this->Incidents->createIncidentFromBugReport($bugReport);
399
400
        $this->assertEquals(true, in_array(false, $result['incidents']));
401
    }
402
403
    /**
404
     * @dataProvider versionsStripping
405
     */
406
    public function testStripversion($version, $expected)
407
    {
408
        $this->assertEquals($expected, $this->Incidents->getStrippedPmaVersion($version));
409
    }
410
411
    public function versionsStripping()
412
    {
413
        return array(
414
            array('1.2.3', '1.2.3'),
415
            array('1.2.3-rc1', '1.2.3-rc1'),
416
            array('4.1-dev', '4.1-dev'),
417
            array('4.1.6deb0ubuntu1ppa1', '4.1.6'),
418
            array('4.2.3deb1.trusty~ppa.1', '4.2.3'),
419
            array('4.2.9deb0.1', '4.2.9'),
420
        );
421
    }
422
}
423