github.com/awesome-flow/flow@v0.0.3-0.20190918184116-508d75d68a2c/pkg/corev1alpha1/pipeline/pipeline_test.go (about)

     1  package pipeline
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"github.com/awesome-flow/flow/pkg/cfg"
     8  	core "github.com/awesome-flow/flow/pkg/corev1alpha1"
     9  	"github.com/awesome-flow/flow/pkg/types"
    10  	"github.com/awesome-flow/flow/pkg/util/data"
    11  	flowplugin "github.com/awesome-flow/flow/pkg/util/plugin"
    12  	flowtest "github.com/awesome-flow/flow/pkg/util/test/corev1alpha1"
    13  )
    14  
    15  func TestStartPropogatesToActors(t *testing.T) {
    16  	repo := cfg.NewRepository()
    17  	cfg := core.NewConfig(repo)
    18  	ctx, _ := core.NewContext(cfg)
    19  	if err := ctx.Start(); err != nil {
    20  		t.Fatalf("failed to start context: %s", err)
    21  	}
    22  	defer ctx.Stop()
    23  
    24  	act1, err := flowtest.NewTestActor("test-actor-1", ctx, nil)
    25  	if err != nil {
    26  		t.Fatalf("failed to create a test actor: %s", err)
    27  	}
    28  	act2, err := flowtest.NewTestActor("test-actor-2", ctx, nil)
    29  	if err != nil {
    30  		t.Fatalf("failed to create a test actor: %s", err)
    31  	}
    32  
    33  	act1.Connect(1, act2)
    34  
    35  	top := data.NewTopology()
    36  	top.AddNode(act1)
    37  	top.AddNode(act2)
    38  	top.Connect(act1, act2)
    39  
    40  	events := make([]string, 0, 2)
    41  
    42  	act1.(*flowtest.TestActor).OnStart(func() {
    43  		events = append(events, act1.Name())
    44  	})
    45  
    46  	act2.(*flowtest.TestActor).OnStart(func() {
    47  		events = append(events, act2.Name())
    48  	})
    49  
    50  	p := &Pipeline{
    51  		ctx: ctx,
    52  		actors: map[string]core.Actor{
    53  			"test-actor-1": act1,
    54  			"test-actor-2": act1,
    55  		},
    56  		topology: top,
    57  	}
    58  
    59  	if err := p.Start(); err != nil {
    60  		t.Fatalf("failed to start the pipeline: %s", err)
    61  	}
    62  
    63  	wantevents := []string{"test-actor-2", "test-actor-1"}
    64  
    65  	if !reflect.DeepEqual(events, wantevents) {
    66  		t.Fatalf("unexpected events: got: %v, want: %v", events, wantevents)
    67  	}
    68  }
    69  
    70  func TestStopPropogatesToActors(t *testing.T) {
    71  	repo := cfg.NewRepository()
    72  	cfg := core.NewConfig(repo)
    73  	ctx, _ := core.NewContext(cfg)
    74  	if err := ctx.Start(); err != nil {
    75  		t.Fatalf("failed to start context: %s", err)
    76  	}
    77  	defer ctx.Stop()
    78  
    79  	act1, err := flowtest.NewTestActor("test-actor-1", ctx, nil)
    80  	if err != nil {
    81  		t.Fatalf("failed to create a test actor: %s", err)
    82  	}
    83  	act2, err := flowtest.NewTestActor("test-actor-2", ctx, nil)
    84  	if err != nil {
    85  		t.Fatalf("failed to create a test actor: %s", err)
    86  	}
    87  
    88  	act1.Connect(1, act2)
    89  
    90  	top := data.NewTopology()
    91  	top.AddNode(act1)
    92  	top.AddNode(act2)
    93  	top.Connect(act1, act2)
    94  
    95  	events := make([]string, 0, 2)
    96  
    97  	act1.(*flowtest.TestActor).OnStop(func() {
    98  		events = append(events, act1.Name())
    99  	})
   100  
   101  	act2.(*flowtest.TestActor).OnStop(func() {
   102  		events = append(events, act2.Name())
   103  	})
   104  
   105  	p := &Pipeline{
   106  		ctx: ctx,
   107  		actors: map[string]core.Actor{
   108  			"test-actor-1": act1,
   109  			"test-actor-2": act1,
   110  		},
   111  		topology: top,
   112  	}
   113  
   114  	if err := p.Start(); err != nil {
   115  		t.Fatalf("failed to start the pipeline: %s", err)
   116  	}
   117  
   118  	if err := p.Stop(); err != nil {
   119  		t.Fatalf("failed to stop the pipeline: %s", err)
   120  	}
   121  
   122  	wantevents := []string{"test-actor-1", "test-actor-2"}
   123  
   124  	if !reflect.DeepEqual(events, wantevents) {
   125  		t.Fatalf("unexpected events: got: %v, want: %v", events, wantevents)
   126  	}
   127  }
   128  
   129  func TestBuildActors(t *testing.T) {
   130  	coreActorName := "test-core-actor-1"
   131  	pluginActorName := "test-plugin-actor-1"
   132  
   133  	factories := map[string]ActorFactory{
   134  		"core": NewCoreActorFactoryWithBuilders(
   135  			map[string]core.Builder{
   136  				"core.test-actor": flowtest.NewTestActor,
   137  			},
   138  		),
   139  		"plugin": NewPluginActorFactoryWithLoader(
   140  			func(path, name string) (flowplugin.Plugin, error) {
   141  				return &flowtest.TestPlugin{
   142  					Path: path,
   143  					Name: name,
   144  				}, nil
   145  			},
   146  		),
   147  	}
   148  	repo := cfg.NewRepository()
   149  	ctx, err := core.NewContext(core.NewConfig(repo))
   150  	if err != nil {
   151  		t.Fatalf("failed to create a context: %s", err)
   152  	}
   153  	actorscfg := map[string]types.CfgBlockActor{
   154  		coreActorName: types.CfgBlockActor{
   155  			Module: "core.test-actor",
   156  		},
   157  		pluginActorName: types.CfgBlockActor{
   158  			Module: "plugin.test-plugin",
   159  		},
   160  	}
   161  
   162  	if _, err := cfg.NewScalarConfigProvider(
   163  		&types.KeyValue{
   164  			Key:   types.NewKey("actors"),
   165  			Value: actorscfg,
   166  		},
   167  		repo,
   168  		42, // doesn't matter
   169  	); err != nil {
   170  		t.Fatalf("failed to create scalar provider: %s", err)
   171  	}
   172  	if _, err := cfg.NewScalarConfigProvider(
   173  		&types.KeyValue{
   174  			Key:   types.NewKey("plugin.path"),
   175  			Value: "/never/where",
   176  		},
   177  		repo,
   178  		42, // doesn't matter
   179  	); err != nil {
   180  		t.Fatalf("failed to create scalar provider: %s", err)
   181  	}
   182  
   183  	if err := ctx.Start(); err != nil {
   184  		t.Fatalf("failed to start context: %s", err)
   185  	}
   186  	defer ctx.Stop()
   187  
   188  	actors, err := buildActors(ctx, factories)
   189  	if err != nil {
   190  		t.Fatalf("failed to build actors: %s", err)
   191  	}
   192  
   193  	if len(actors) > 2 {
   194  		t.Fatalf("Unexpected contents of actors map: %+v", actors)
   195  	}
   196  
   197  	for _, name := range []string{coreActorName, pluginActorName} {
   198  		if _, ok := actors[name]; !ok {
   199  			t.Fatalf("actor %s is missing from actors map", name)
   200  		}
   201  		if _, ok := actors[name].(*flowtest.TestActor); !ok {
   202  			t.Fatalf("unexpected actor type: got: %s, want: %s", reflect.TypeOf(actors[name]), "*pipeline.TestActor")
   203  		}
   204  		if actorname := actors[name].Name(); actorname != name {
   205  			t.Fatalf("unexpected actor name: got: %s, want: %s", actors[name].Name(), name)
   206  		}
   207  	}
   208  }