diff --git a/invoice/src/main/java/org/killbill/billing/invoice/InvoicePluginDispatcher.java b/invoice/src/main/java/org/killbill/billing/invoice/InvoicePluginDispatcher.java
index 59f8db4..d170b10 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/InvoicePluginDispatcher.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/InvoicePluginDispatcher.java
@@ -20,6 +20,7 @@ package org.killbill.billing.invoice;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -267,10 +268,12 @@ public class InvoicePluginDispatcher {
return existingValue;
}
- private Map<String, InvoicePluginApi> getInvoicePlugins(final InternalTenantContext tenantContext) {
+ @VisibleForTesting
+ Map<String, InvoicePluginApi> getInvoicePlugins(final InternalTenantContext tenantContext) {
final Collection<String> resultingPluginList = getResultingPluginNameList(tenantContext);
- final Map<String, InvoicePluginApi> invoicePlugins = new HashMap<String, InvoicePluginApi>();
+ // Keys ordering matters!
+ final Map<String, InvoicePluginApi> invoicePlugins = new LinkedHashMap<String, InvoicePluginApi>();
for (final String name : resultingPluginList) {
final InvoicePluginApi serviceForName = pluginRegistry.getServiceForName(name);
invoicePlugins.put(name, serviceForName);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java
index 78d1b74..6c3922e 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
@@ -39,9 +39,10 @@ import static org.testng.Assert.assertEquals;
public class TestInvoicePluginDispatcher extends InvoiceTestSuiteNoDB {
- private final String PLUGIN_1 = "plugin1";
- private final String PLUGIN_2 = "plugin2";
- private final String PLUGIN_3 = "plugin3";
+ // Reversed lexicographic order on purpose to test ordering
+ private final String PLUGIN_1 = "C_plugin1";
+ private final String PLUGIN_2 = "B_plugin2";
+ private final String PLUGIN_3 = "A_plugin3";
@Inject
protected InvoicePluginDispatcher invoicePluginDispatcher;
@@ -51,6 +52,7 @@ public class TestInvoicePluginDispatcher extends InvoiceTestSuiteNoDB {
@Inject
TenantInternalApi tenantInternalApi;
+ @Override
protected KillbillConfigSource getConfigSource() {
return getConfigSource("/resource.properties", ImmutableMap.<String, String>builder()
.put("org.killbill.invoice.plugin", Joiner.on(",").join(PLUGIN_1, PLUGIN_2))
@@ -68,7 +70,6 @@ public class TestInvoicePluginDispatcher extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testWithNoConfig() throws Exception {
-
// We Use the per-tenant config and specify a empty list of plugins
Mockito.when(tenantInternalApi.getTenantConfig(Mockito.any(InternalCallContext.class))).thenReturn("{\"org.killbill.invoice.plugin\":\"\"}");
// We register one plugin
@@ -100,11 +101,12 @@ public class TestInvoicePluginDispatcher extends InvoiceTestSuiteNoDB {
final Iterator<String> iterator = result.iterator();
assertEquals(iterator.next(), PLUGIN_1);
assertEquals(iterator.next(), PLUGIN_2);
+
+ assertEquals(invoicePluginDispatcher.getInvoicePlugins(internalCallContext).keySet(), result);
}
@Test(groups = "fast")
public void testWithIncorrectCorrectOrder() throws Exception {
-
// 3 plugins registered in *incorrect* order and only 2 got specified in config
registerPlugin(PLUGIN_2);
registerPlugin(PLUGIN_3);
@@ -115,8 +117,9 @@ public class TestInvoicePluginDispatcher extends InvoiceTestSuiteNoDB {
final Iterator<String> iterator = result.iterator();
assertEquals(iterator.next(), PLUGIN_1);
assertEquals(iterator.next(), PLUGIN_2);
- }
+ assertEquals(invoicePluginDispatcher.getInvoicePlugins(internalCallContext).keySet(), result);
+ }
private void registerPlugin(final String plugin) {
pluginRegistry.registerService(new OSGIServiceDescriptor() {