1   package com.atlassian.user.configuration.xml;
2   
3   import junit.framework.TestCase;
4   import com.atlassian.user.configuration.xml.XMLDefaultsParser;
5   
6   import java.util.Map;
7   import java.io.FileNotFoundException;
8   import java.io.IOException;
9   
10  import org.dom4j.DocumentException;
11  
12  public class TestDefaultsParser extends TestCase
13  {
14      private static final String TEST_DEFAULTS_FILE_NAME = "test-" + XMLDefaultsParser.DEFAULTS_FILE_NAME;
15      private static final String BOGUS_DEFAULTS_FILE_NAME = "bogus-" + XMLDefaultsParser.DEFAULTS_FILE_NAME;
16  
17      public void testFileNotFound() throws IOException, DocumentException
18      {
19          try
20          {
21              new XMLDefaultsParser("file-not-found.xml");
22              fail("Expected FileNotFoundException");
23          }
24          catch (FileNotFoundException e)
25          {
26              // expected
27          }
28      }
29  
30      public void testKeyNotFound() throws DocumentException, IOException
31      {
32          XMLDefaultsParser parser = new XMLDefaultsParser(TEST_DEFAULTS_FILE_NAME);
33  
34          assertTrue(parser.getDefaultClassesConfigForKey("monkey").isEmpty());
35          assertTrue(parser.getDefaultParameterConfigForKey("monkey").isEmpty());
36      }
37  
38      public void testRepositoryFound() throws DocumentException, IOException
39      {
40          XMLDefaultsParser defaultsParser = new XMLDefaultsParser(TEST_DEFAULTS_FILE_NAME);
41          assertDefaultsContainsGoatEntry(defaultsParser);
42      }
43  
44      private void assertDefaultsContainsGoatEntry(XMLDefaultsParser parser)
45              throws DocumentException, IOException
46      {
47          Map classesMap = parser.getDefaultClassesConfigForKey("goat");
48          assertEquals(6, classesMap.size());
49          assertEquals("com.atlassian.user.GoatRepositoryProcessor", classesMap.get("processor"));
50          assertEquals("com.atlassian.user.GoatUserManager", classesMap.get("userManager"));
51          assertEquals("com.atlassian.user.GoatGroupManager", classesMap.get("groupManager"));
52          assertEquals("com.atlassian.user.GoatPasswordEncryptor", classesMap.get("passwordEncryptor"));
53          assertEquals("com.atlassian.user.GoatPropertySetFactory", classesMap.get("propertySetFactory"));
54          assertEquals("com.atlassian.user.GoatAuthenticator", classesMap.get("authenticator"));
55  
56          Map paramsMap = parser.getDefaultParameterConfigForKey("goat");
57          assertEquals(3, paramsMap.size());
58          assertEquals("value1", paramsMap.get("param1"));
59          assertEquals("value2", paramsMap.get("param2"));
60          assertEquals("value3", paramsMap.get("param3"));
61      }
62  
63      // If there are multiple defaults in the one file, we should just get an error log and the first one should count
64      public void testDuplicateRepository() throws DocumentException, IOException
65      {
66          XMLDefaultsParser parser = new XMLDefaultsParser(TEST_DEFAULTS_FILE_NAME);
67  
68          Map foundMap = parser.getDefaultClassesConfigForKey("chicken");
69          assertEquals(6, foundMap.size());
70          assertEquals("com.atlassian.user.ChickenRepositoryProcessor", foundMap.get("processor"));
71          assertEquals("com.atlassian.user.ChickenUserManager", foundMap.get("userManager"));
72          assertEquals("com.atlassian.user.ChickenGroupManager", foundMap.get("groupManager"));
73          assertEquals("com.atlassian.user.ChickenPasswordEncryptor", foundMap.get("passwordEncryptor"));
74          assertEquals("com.atlassian.user.ChickenPropertySetFactory", foundMap.get("propertySetFactory"));
75          assertEquals("com.atlassian.user.ChickenAuthenticator", foundMap.get("authenticator"));
76      }
77  
78      public void testRepositoryWithNoClasses() throws DocumentException, IOException
79      {
80          XMLDefaultsParser parser = new XMLDefaultsParser(TEST_DEFAULTS_FILE_NAME);
81  
82          Map classesMap = parser.getDefaultClassesConfigForKey("pig");
83          assertEquals(0, classesMap.size());
84  
85          Map paramsMap = parser.getDefaultParameterConfigForKey("pig");
86          assertEquals(2, paramsMap.size());
87          assertEquals("value1", paramsMap.get("param1"));
88          assertEquals("value2", paramsMap.get("param2"));
89  
90      }
91  
92      public void testRepositoryWithNoParams() throws DocumentException, IOException
93      {
94          XMLDefaultsParser parser = new XMLDefaultsParser(TEST_DEFAULTS_FILE_NAME);
95          assertEquals(0, parser.getDefaultParameterConfigForKey("chicken").size());
96      }
97  
98      public void testLoadMultipleFilesWithDefaultConstructor() throws DocumentException, IOException
99      {
100         XMLDefaultsParser parser = new XMLDefaultsParser();
101 
102         // We should have loaded the defaults file in src/test/etc
103         assertDefaultsContainsGoatEntry(parser);
104 
105         // The defaults file in the src/main/etc should contain the memory provider.
106         assertFalse(parser.getDefaultClassesConfigForKey("memory").isEmpty());
107     }
108 
109     public void testOneDefaultsFileInvalid() throws DocumentException, IOException
110     {
111         assertDefaultsContainsGoatEntry(new XMLDefaultsParser(new String[] { TEST_DEFAULTS_FILE_NAME, BOGUS_DEFAULTS_FILE_NAME }));
112 
113     }
114 
115     public void testNoValidDefaultsFound() throws DocumentException, IOException
116     {
117         try
118         {
119             new XMLDefaultsParser(BOGUS_DEFAULTS_FILE_NAME);
120             fail("Expected error");
121         }
122         catch (FileNotFoundException e)
123         {
124             // expected
125         }
126     }
127 }