antonioribeiro / antonioribeiro/tracker

'Cannot start session when headers already sent' on run Unit Test

Open
#476 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
2.9k
Forks
594
PR merge metrics
No merged PRs in 30d

Description

**Describe the bug**
On run unit test this fails with the log:

```
[2019-11-06 14:28:11] testing.ERROR: session_start(): Cannot start session when headers already sent {"exception":"[object] (ErrorException(code: 0): session_start(): Cannot start session when headers already sent at /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/support/src/PhpSession.php:23)
[stacktrace]
#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'session_start()...', '/home/vagrant/c...', 23, Array)
#1 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/support/src/PhpSession.php(23): session_start()
#2 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/support/src/PhpSession.php(14): PragmaRX\\Support\\PhpSession->startSession()
#3 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/tracker/src/Vendor/Laravel/ServiceProvider.php(287): PragmaRX\\Support\\PhpSession->__construct()
#4 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(800): PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider->PragmaRX\\Tracker\\Vendor\\Laravel\\{closure}(Object(Illuminate\\Foundation\\Application), Array)
#5 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(682): Illuminate\\Container\\Container->build(Object(Closure))
#6 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(630): Illuminate\\Container\\Container->resolve('tracker.reposit...', Array)
#7 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(768): Illuminate\\Container\\Container->make('tracker.reposit...', Array)
#8 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(1246): Illuminate\\Foundation\\Application->make('tracker.reposit...')
#9 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/tracker/src/Vendor/Laravel/ServiceProvider.php(160): Illuminate\\Container\\Container->offsetGet('tracker.reposit...')
#10 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(800): PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider->PragmaRX\\Tracker\\Vendor\\Laravel\\{closure}(Object(Illuminate\\Foundation\\Application), Array)
#11 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(682): Illuminate\\Container\\Container->build(Object(Closure))
#12 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(630): Illuminate\\Container\\Container->resolve('tracker', Array)
#13 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(768): Illuminate\\Container\\Container->make('tracker', Array)
#14 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(1246): Illuminate\\Foundation\\Application->make('tracker')
#15 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/tracker/src/Vendor/Laravel/ServiceProvider.php(639): Illuminate\\Container\\Container->offsetGet('tracker')
#16 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/tracker/src/Vendor/Laravel/ServiceProvider.php(397): PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider->getTracker()
#17 /home/vagrant/code/vakeromagazine-backend/vendor/pragmarx/tracker/src/Vendor/Laravel/ServiceProvider.php(82): PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider->registerErrorHandler()
#18 [internal function]: PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider->boot()
#19 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#20 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Support/helpers.php(520): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#21 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): value(Object(Closure))
#22 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))
#23 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(591): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)
#24 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(828): Illuminate\\Container\\Container->call(Array)
#25 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(811): Illuminate\\Foundation\\Application->bootProvider(Object(PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider))
#26 [internal function]: Illuminate\\Foundation\\Application->Illuminate\\Foundation\\{closure}(Object(PragmaRX\\Tracker\\Vendor\\Laravel\\ServiceProvider), 34)
#27 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(812): array_walk(Array, Object(Closure))
#28 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php(17): Illuminate\\Foundation\\Application->boot()
#29 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(211): Illuminate\\Foundation\\Bootstrap\\BootProviders->bootstrap(Object(Illuminate\\Foundation\\Application))
#30 /home/vagrant/code/vakeromagazine-backend/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(320): Illuminate\\Foundation\\Application->bootstrapWith(Array)
#31 /home/vagrant/code/vakeromagazine-backend/tests/CreatesApplication.php(18): Illuminate\\Foundation\\Console\\Kernel->bootstrap()
#32 /home/vagrant/code/vakeromagazine-backend/tests/Bootstrap.php(34): Tests\\Bootstrap->createApplication()
#33 /home/vagrant/code/vakeromagazine-backend/vendor/phpunit/phpunit/src/TextUI/TestRunner.php(612): Tests\\Bootstrap->executeBeforeFirstTest()
#34 /home/vagrant/code/vakeromagazine-backend/vendor/phpunit/phpunit/src/TextUI/Command.php(200): PHPUnit\\TextUI\\TestRunner->doRun(Object(PHPUnit\\Framework\\TestSuite), Array, true)
#35 /home/vagrant/code/vakeromagazine-backend/vendor/phpunit/phpunit/src/TextUI/Command.php(159): PHPUnit\\TextUI\\Command->run(Array, true)
#36 /home/vagrant/code/vakeromagazine-backend/vendor/phpunit/phpunit/phpunit(61): PHPUnit\\TextUI\\Command::main()
#37 {main}
"}
```

**To Reproduce**
Steps to reproduce the behavior:
1. Install with `composer require pragmarx/tracker`
2. Add the service provider to app/config/app.php:
`PragmaRX\Tracker\Vendor\Laravel\ServiceProvider::class`
3. Add the alias to the facade on app/config/app.php:
`'Tracker' => 'PragmaRX\Tracker\Vendor\Laravel\Facade'`
4. Publish tracker configuration:
`php artisan vendor:publish --provider="PragmaRX\Tracker\Vendor\Laravel\ServiceProvider"`
5. Enable the Middleware in `app/config/tracker.php`:
`'use_middleware' => true,`
6. Add the Middleware to Laravel Kernel:
`\PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,`
7. Enable Tracker in tracker.php:
`'enabled' => true,`
8. Publish the migration:
`php artisan tracker:tables`
9. Config database.php:
`
'tracker' => [
'driver' => 'mysql',
'url' => env('DATABASE_TRACK_URL', env('DATABASE_URL')),
'host' => env('DB_TRACK_HOST', env('DB_HOST', '127.0.0.1')),
'port' => env('DB_TRACK_PORT', env('DB_PORT', '3306')),
'database' => env('DB_TRACK_DATABASE' ,env('DB_DATABASE', 'forge')),
'username' => env('DB_TRACK_USERNAME', env('DB_USERNAME', 'forge')),
'password' => env('DB_TRACK_PASSWORD', env('DB_PASSWORD', '')),
'unix_socket' => env('DB_TRACK_SOCKET', env('DB_SOCKET', '')),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'prefix_indexes' => false,
'strict' => false,
'engine' => 'InnoDB',
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
`
9. Migrate:
`php artisan migrate`
10. Enable configurations:
`
'cache_enabled' => true,
'log_enabled' => true,
'log_user_agents' => true,
'log_devices' => true,
'log_referers' => true,
'log_paths' => true,
'log_routes' => true,
'log_exceptions' => true,

'user_model' => 'App\Entities\User',
`
11. Run tests:
`phpunit`

**Expected behavior**
Tests run normally

**Screenshots**
*Gitlab CI*
![GitLab CI](https://user-images.githubusercontent.com/22435698/68313365-72cce300-0082-11ea-84ae-db4f4bd25c5a.png)

**System**
- OS: MacOS
- Browser: Chrome
- Version: 78

**Additional context**
PHP 7.3.7
Laravel 6
PHPUnit 8.4.2

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the failure with phpunit using the tracker installation and configuration in the issue. Start at tests/Bootstrap.php and tests/CreatesApplication.php, then follow the stack through vendor/pragmarx/support/src/PhpSession.php and the tracker ServiceProvider; done means the test suite runs normally without the session_start warning.

Written by the indexing model from the issue text.

Assessment

Tech stack
laravel, mysql, php
Domain
backend, databases, testing
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.