github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/plugin_health_check_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/mattermost/mattermost-server/v5/model"
    10  	"github.com/mattermost/mattermost-server/v5/plugin"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestHealthCheckJob(t *testing.T) {
    15  	th := Setup(t)
    16  	defer th.TearDown()
    17  
    18  	tearDown, _, _ := SetAppEnvironmentWithPlugins(t, []string{
    19  		`
    20  			package main
    21  
    22  			import (
    23  				"github.com/mattermost/mattermost-server/v5/model"
    24  				"github.com/mattermost/mattermost-server/v5/plugin"
    25  			)
    26  
    27  			type MyPlugin struct {
    28  				plugin.MattermostPlugin
    29  			}
    30  
    31  			func (p *MyPlugin) MessageWillBePosted(c *plugin.Context, post *model.Post) (*model.Post, string) {
    32  				panic("Uncaught error")
    33  			}
    34  
    35  			func main() {
    36  				plugin.ClientMain(&MyPlugin{})
    37  			}
    38  			`,
    39  	}, th.App, th.App.NewPluginAPI)
    40  	defer tearDown()
    41  
    42  	env := th.App.GetPluginsEnvironment()
    43  	job := env.GetPluginHealthCheckJob()
    44  	require.NotNil(t, job)
    45  	bundles := env.Active()
    46  	require.Equal(t, 1, len(bundles))
    47  
    48  	id := bundles[0].Manifest.Id
    49  
    50  	// First health check
    51  	hooks, err := env.HooksForPlugin(id)
    52  	require.Nil(t, err)
    53  	hooks.MessageWillBePosted(&plugin.Context{}, &model.Post{})
    54  	job.CheckPlugin(id)
    55  	bundles = env.Active()
    56  	require.Equal(t, 1, len(bundles))
    57  	require.Equal(t, id, bundles[0].Manifest.Id)
    58  	require.Equal(t, model.PluginStateRunning, env.GetPluginState(id))
    59  
    60  	// Second health check
    61  	hooks, err = env.HooksForPlugin(id)
    62  	require.Nil(t, err)
    63  	hooks.MessageWillBePosted(&plugin.Context{}, &model.Post{})
    64  	job.CheckPlugin(id)
    65  	bundles = env.Active()
    66  	require.Equal(t, 1, len(bundles))
    67  	require.Equal(t, id, bundles[0].Manifest.Id)
    68  	require.Equal(t, model.PluginStateRunning, env.GetPluginState(id))
    69  
    70  	// Third health check, plugin should be deactivated by the job
    71  	hooks, err = env.HooksForPlugin(id)
    72  	require.Nil(t, err)
    73  	hooks.MessageWillBePosted(&plugin.Context{}, &model.Post{})
    74  	job.CheckPlugin(id)
    75  	bundles = env.Active()
    76  	require.Equal(t, 0, len(bundles))
    77  	require.Equal(t, model.PluginStateFailedToStayRunning, env.GetPluginState(id))
    78  
    79  	// Activated manually, plugin should stay active
    80  	env.Activate(id)
    81  	job.CheckPlugin(id)
    82  	bundles = env.Active()
    83  	require.Equal(t, 1, len(bundles))
    84  	require.Equal(t, model.PluginStateRunning, env.GetPluginState(id))
    85  }