package org.netbeans.gradle.project.license; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.jtrim.concurrent.SyncTaskExecutor; import org.jtrim.concurrent.TaskExecutor; import org.jtrim.property.MutableProperty; import org.jtrim.property.PropertyFactory; import org.jtrim.property.PropertySource; import org.junit.Test; import org.netbeans.gradle.project.util.CloseableAction; import org.netbeans.gradle.project.util.NbFunction; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class LicenseManagerTest { private static String toModelName(String model) { return model + "_NAME"; } private static LicenseHeaderInfo testLicenseInfo(String name, String fileName) { return new LicenseHeaderInfo( name, Collections.<String, String>emptyMap(), fileName != null ? Paths.get(fileName) : null); } private static LicenseManager<String> createTestManager(LicenseStore<DefaultLicenseDef> licenseStore) { NbFunction<String, Path> licenseRootProvider = new NbFunction<String, Path>() { @Override public Path apply(String ownerModel) { return Paths.get(ownerModel); } }; NbFunction<String, String> modelNameProvider = new NbFunction<String, String>() { @Override public String apply(String ownerModel) { return toModelName(ownerModel); } }; TaskExecutor executor = SyncTaskExecutor.getSimpleExecutor(); return LicenseManagers.createLicenseManager(executor, licenseStore, licenseRootProvider, modelNameProvider); } @Test public void testGetOnEmpty() { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info = testLicenseInfo("LicenseName", "LicenseFile"); assertNull(manager.tryGetRegisteredLicenseName("TestModel", info)); licenseStore.assertEmpty(); } private static void verifyLicenseDef(DefaultLicenseDef licenseDef, String model, String licenseName, String licenseFile) { assertEquals("DefaultLicenseDef.getName()", licenseName, licenseDef.getName()); verifyDisplayName(licenseDef, model, licenseName); verifyLicenseSrc(licenseDef, model, licenseFile); } private static void verifyDisplayName(DefaultLicenseDef licenseDef, String model, String licenseName) { String displayName = licenseDef.getDisplayName(); if (!displayName.contains(licenseName)) { fail("Display name must contain the name of the license: " + licenseName + " but was " + displayName); } String modelName = toModelName(model); if (!displayName.contains(modelName)) { fail("Display name must contain the name of the model: " + modelName + " but was " + displayName); } } private static void verifyLicenseSrc(DefaultLicenseDef licenseDef, String model, String licenseFile) { Path src = licenseDef.getSrc(); assertEquals("DefaultLicenseDef.getSrc()", Paths.get(model, licenseFile), src); } @Test public void testAddOneGetOne() { testAddOneGetOne(false); } @Test public void testAddOneGetOneNestedOpen() { testAddOneGetOne(true); } private void testAddOneGetOne(boolean nestedOpen) { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info = testLicenseInfo("LicenseName", "LicenseFile"); MutableProperty<String> modelRef = PropertyFactory.memProperty("TestModel"); MutableProperty<LicenseHeaderInfo> infoRef = PropertyFactory.memProperty(info); PropertySource<CloseableAction> registerActionRef = manager.getRegisterListenerAction(modelRef, infoRef); CloseableAction registerAction = registerActionRef.getValue(); assertNull(manager.tryGetRegisteredLicenseName("TestModel", info)); licenseStore.assertEmpty(); try (CloseableAction.Ref closeRef = registerAction.open()) { assertNotNull(closeRef); if (nestedOpen) { registerAction.open().close(); } String licenseId = manager.tryGetRegisteredLicenseName("TestModel", info); assertNotNull("licenseId", licenseId); DefaultLicenseDef licenseDef = licenseStore.getById(licenseId); assertEquals(licenseId, licenseDef.getLicenseId()); verifyLicenseDef(licenseDef, "TestModel", "LicenseName", "LicenseFile"); } assertNull(manager.tryGetRegisteredLicenseName("TestModel", info)); licenseStore.assertEmpty(); } @Test public void testOverwriteLicenseHeaderInfoAndGet() { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info1 = testLicenseInfo("LicenseName1", "LicenseFile1"); MutableProperty<String> modelRef = PropertyFactory.memProperty("TestModel1"); MutableProperty<LicenseHeaderInfo> infoRef = PropertyFactory.memProperty(info1); PropertySource<CloseableAction> registerActionRef = manager.getRegisterListenerAction(modelRef, infoRef); Runnable listener = mock(Runnable.class); registerActionRef.addChangeListener(listener); verifyZeroInteractions(listener); LicenseHeaderInfo info2 = testLicenseInfo("LicenseName2", "LicenseFile2"); infoRef.setValue(info2); verify(listener).run(); CloseableAction registerAction = registerActionRef.getValue(); assertNull(manager.tryGetRegisteredLicenseName("TestModel1", info2)); licenseStore.assertEmpty(); try (CloseableAction.Ref closeRef = registerAction.open()) { assertNotNull(closeRef); String licenseId = manager.tryGetRegisteredLicenseName("TestModel1", info2); assertNotNull("licenseId", licenseId); DefaultLicenseDef licenseDef = licenseStore.getById(licenseId); assertEquals(licenseId, licenseDef.getLicenseId()); verifyLicenseDef(licenseDef, "TestModel1", "LicenseName2", "LicenseFile2"); } assertNull(manager.tryGetRegisteredLicenseName("TestModel1", info2)); licenseStore.assertEmpty(); verifyNoMoreInteractions(listener); } @Test public void testOverwriteModelAndGet() { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info1 = testLicenseInfo("LicenseName1", "LicenseFile1"); MutableProperty<String> modelRef = PropertyFactory.memProperty("TestModel1"); MutableProperty<LicenseHeaderInfo> infoRef = PropertyFactory.memProperty(info1); PropertySource<CloseableAction> registerActionRef = manager.getRegisterListenerAction(modelRef, infoRef); Runnable listener = mock(Runnable.class); registerActionRef.addChangeListener(listener); verifyZeroInteractions(listener); modelRef.setValue("TestModel2"); verify(listener).run(); CloseableAction registerAction = registerActionRef.getValue(); assertNull(manager.tryGetRegisteredLicenseName("TestModel2", info1)); licenseStore.assertEmpty(); try (CloseableAction.Ref closeRef = registerAction.open()) { assertNotNull(closeRef); String licenseId = manager.tryGetRegisteredLicenseName("TestModel2", info1); assertNotNull("licenseId", licenseId); DefaultLicenseDef licenseDef = licenseStore.getById(licenseId); assertEquals(licenseId, licenseDef.getLicenseId()); verifyLicenseDef(licenseDef, "TestModel2", "LicenseName1", "LicenseFile1"); } assertNull(manager.tryGetRegisteredLicenseName("TestModel2", info1)); licenseStore.assertEmpty(); verifyNoMoreInteractions(listener); } @Test public void testWithoutLicenseFile() { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info = testLicenseInfo("LicenseName", null); MutableProperty<String> modelRef = PropertyFactory.memProperty("TestModel"); MutableProperty<LicenseHeaderInfo> infoRef = PropertyFactory.memProperty(info); PropertySource<CloseableAction> registerActionRef = manager.getRegisterListenerAction(modelRef, infoRef); CloseableAction registerAction = registerActionRef.getValue(); assertNull(manager.tryGetRegisteredLicenseName("TestModel", info)); licenseStore.assertEmpty(); try (CloseableAction.Ref closeRef = registerAction.open()) { assertNotNull(closeRef); licenseStore.assertEmpty(); licenseStore.addToStore(info); String licenseId = manager.tryGetRegisteredLicenseName("TestModel", info); assertEquals(info.getLicenseName(), licenseId); } } @Test public void testWithoutLicenseFileAndWithoutRegistering() { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info = testLicenseInfo("LicenseName", null); licenseStore.addToStore(info); String licenseId = manager.tryGetRegisteredLicenseName("TestModel", info); assertEquals(info.getLicenseName(), licenseId); } @Test public void testWithoutLicenseFileAndWithoutRegisteringNotInStore() { MemLicenseStore licenseStore = new MemLicenseStore(); LicenseManager<String> manager = createTestManager(licenseStore); LicenseHeaderInfo info = testLicenseInfo("LicenseName", null); assertNull(manager.tryGetRegisteredLicenseName("TestModel", info)); } private static final class MemLicenseStore implements LicenseStore<DefaultLicenseDef> { private final Map<String, DefaultLicenseDef> licenses; public MemLicenseStore() { this.licenses = new ConcurrentHashMap<>(); } public void addToStore(LicenseHeaderInfo info) { String licenseName = info.getLicenseName(); licenses.put(licenseName, new DefaultLicenseDef( Paths.get("root", licenseName), licenseName, licenseName + "_DISPLAY")); } public void assertEmpty() { if (!licenses.isEmpty()) { throw new AssertionError("Expected no licenses but found " + licenses.keySet()); } } public DefaultLicenseDef tryGetById(String licenseId) { return licenses.get(licenseId); } public DefaultLicenseDef getById(String licenseId) { DefaultLicenseDef result = tryGetById(licenseId); if (result == null) { throw new AssertionError("Expected to have license with ID: " + licenseId); } return result; } @Override public void addLicense(DefaultLicenseDef licenseDef) throws IOException { licenses.put(licenseDef.getLicenseId(), licenseDef); } @Override public void removeLicense(String licenseId) throws IOException { licenses.remove(licenseId); } @Override public boolean containsLicense(String licenseId) { return licenses.containsKey(licenseId); } } }