@Override
    public void forward(DeviceId deviceId, ForwardingObjective forwardingObjective) {
        if (forwardingObjective.nextId() == null ||
                forwardingObjective.op() == Objective.Operation.REMOVE ||
                flowObjectiveStore.getNextGroup(forwardingObjective.nextId()) != null ||
                !queueFwdObjective(deviceId, forwardingObjective)) {
            // fast path
            executorService.execute(new ObjectiveInstaller(deviceId, forwardingObjective));
        }
    }
@Test
    public void forwardingObjective() {
        TrafficSelector selector = DefaultTrafficSelector.emptySelector();
        TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
        ForwardingObjective forward =
                DefaultForwardingObjective.builder()
                        .fromApp(NetTestTools.APP_ID)
                        .withFlag(ForwardingObjective.Flag.SPECIFIC)
                        .withSelector(selector)
                        .withTreatment(treatment)
                        .makePermanent()
                        .add(new ObjectiveContext() {
                            @Override
                            public void onSuccess(Objective objective) {
                                assertEquals("1 flowrule entry expected",
                                             1, flowRuleStore.getFlowRuleCount(vnet1.id()));
                                assertEquals("0 flowrule entry expected",
                                             0, flowRuleStore.getFlowRuleCount(vnet2.id()));
                            }
                        });

        service1.forward(VDID1, forward);
    }