1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.core.joran.util;
15  
16  import java.lang.reflect.Method;
17  import java.nio.charset.Charset;
18  import java.nio.charset.UnsupportedCharsetException;
19  
20  import ch.qos.logback.core.util.FileSize;
21  import org.junit.jupiter.api.AfterEach;
22  import org.junit.jupiter.api.BeforeEach;
23  import org.junit.jupiter.api.Test;
24  
25  import ch.qos.logback.core.Context;
26  import ch.qos.logback.core.ContextBase;
27  import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
28  import ch.qos.logback.core.joran.util.beans.BeanDescriptionCache;
29  import ch.qos.logback.core.spi.FilterReply;
30  import ch.qos.logback.core.status.testUtil.StatusChecker;
31  import ch.qos.logback.core.util.AggregationType;
32  import ch.qos.logback.core.util.StatusPrinter;
33  
34  import static org.junit.jupiter.api.Assertions.assertEquals;
35  import static org.junit.jupiter.api.Assertions.assertNotNull;
36  import static org.junit.jupiter.api.Assertions.assertNull;
37  import static org.junit.jupiter.api.Assertions.assertTrue;
38  
39  public class PropertySetterTest {
40  
41      Context context = new ContextBase();
42      StatusChecker checker = new StatusChecker(context);
43      House house = new House();
44  
45      PropertySetter setter = new PropertySetter(new BeanDescriptionCache(context), house);
46  
47      @BeforeEach
48      public void setUp() {
49          setter.setContext(context);
50      }
51  
52      @AfterEach
53      public void tearDown() {
54      }
55  
56      @Test
57      public void testCanAggregateComponent() {
58          assertEquals(AggregationType.AS_COMPLEX_PROPERTY, setter.computeAggregationType("door"));
59  
60          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("count"));
61          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("Count"));
62  
63          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("name"));
64          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("Name"));
65  
66          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("Duration"));
67          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("fs"));
68  
69          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("open"));
70          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("Open"));
71  
72          assertEquals(AggregationType.AS_COMPLEX_PROPERTY_COLLECTION, setter.computeAggregationType("Window"));
73          assertEquals(AggregationType.AS_BASIC_PROPERTY_COLLECTION, setter.computeAggregationType("adjective"));
74  
75          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("filterReply"));
76          assertEquals(AggregationType.AS_BASIC_PROPERTY, setter.computeAggregationType("houseColor"));
77      }
78  
79      @Test
80      public void testSetProperty() {
81          {
82              House house = new House();
83              PropertySetter setter = new PropertySetter(new BeanDescriptionCache(context), house);
84              setter.setProperty("count", "10");
85              setter.setProperty("temperature", "33.1");
86  
87              setter.setProperty("name", "jack");
88              setter.setProperty("open", "true");
89  
90              assertEquals(10, house.getCount());
91              assertEquals(33.1d, (double) house.getTemperature(), 0.01);
92              assertEquals("jack", house.getName());
93              assertTrue(house.isOpen());
94          }
95  
96          {
97              House house = new House();
98              PropertySetter setter = new PropertySetter(new BeanDescriptionCache(context), house);
99              setter.setProperty("Count", "10");
100             setter.setProperty("Name", "jack");
101             setter.setProperty("Open", "true");
102 
103             assertEquals(10, house.getCount());
104             assertEquals("jack", house.getName());
105             assertTrue(house.isOpen());
106         }
107     }
108 
109     @Test
110     public void testSetCamelProperty() {
111         setter.setProperty("camelCase", "trot");
112         assertEquals("trot", house.getCamelCase());
113 
114         setter.setProperty("camelCase", "gh");
115         assertEquals("gh", house.getCamelCase());
116     }
117 
118     @Test
119     public void testSetComplexProperty() {
120         Door door = new Door();
121         setter.setComplexProperty("door", door);
122         assertEquals(door, house.getDoor());
123     }
124 
125 
126 
127     @Test
128     public void testPropertyCollection() {
129         setter.addBasicProperty("adjective", "nice");
130         setter.addBasicProperty("adjective", "big");
131 
132         assertEquals(2, house.adjectiveList.size());
133         assertEquals("nice", house.adjectiveList.get(0));
134         assertEquals("big", house.adjectiveList.get(1));
135     }
136 
137     @Test
138     public void addValueOfTest() {
139         setter.addBasicProperty("fileSize", "1GB");
140         setter.addBasicProperty("fileSize", "10KB");
141 
142         assertEquals(2, house.fileSizes.size());
143         assertEquals(FileSize.valueOf("1GB"), house.fileSizes.get(0));
144         assertEquals(FileSize.valueOf("10KB"), house.fileSizes.get(1));
145     }
146 
147         @Test
148     public void testComplexCollection() {
149         Window w1 = new Window();
150         w1.handle = 10;
151         Window w2 = new Window();
152         w2.handle = 20;
153 
154         setter.addComplexProperty("window", w1);
155         setter.addComplexProperty("window", w2);
156         assertEquals(2, house.windowList.size());
157         assertEquals(10, house.windowList.get(0).handle);
158         assertEquals(20, house.windowList.get(1).handle);
159     }
160 
161     @Test
162     public void testSetComplexWithCamelCaseName() {
163         SwimmingPool pool = new SwimmingPoolImpl();
164         setter.setComplexProperty("swimmingPool", pool);
165         assertEquals(pool, house.getSwimmingPool());
166     }
167 
168     @Test
169     public void testDuration() {
170         setter.setProperty("duration", "1.4 seconds");
171         assertEquals(1400, house.getDuration().getMilliseconds());
172     }
173 
174     @Test
175     public void testFileSize() {
176         setter.setProperty("fs", "2 kb");
177         assertEquals(2 * 1024, house.getFs().getSize());
178     }
179 
180     @Test
181     public void testFilterReply() {
182         // test case reproducing bug #52
183         setter.setProperty("filterReply", "ACCEPT");
184         assertEquals(FilterReply.ACCEPT, house.getFilterReply());
185     }
186 
187     @Test
188     public void testEnum() {
189         setter.setProperty("houseColor", "BLUE");
190         assertEquals(HouseColor.BLUE, house.getHouseColor());
191     }
192 
193 
194 
195     @Test
196     public void charset() {
197         setter.setProperty("charset", "UTF-8");
198         assertEquals(Charset.forName("UTF-8"), house.getCharset());
199 
200         house.setCharset(null);
201         setter.setProperty("charset", "UTF");
202         assertNull(house.getCharset());
203 
204         StatusChecker checker = new StatusChecker(context);
205         checker.containsException(UnsupportedCharsetException.class);
206     }
207 
208     // see also http://jira.qos.ch/browse/LOGBACK-1164
209     @Test
210     public void bridgeMethodsShouldBeIgnored() {
211         Orange orange = new Orange();
212 
213         PropertySetter orangeSetter = new PropertySetter(new BeanDescriptionCache(context), orange);
214         assertEquals(AggregationType.AS_BASIC_PROPERTY,
215                 orangeSetter.computeAggregationType(Citrus.PRECARP_PROPERTY_NAME));
216         assertEquals(AggregationType.AS_BASIC_PROPERTY,
217                 orangeSetter.computeAggregationType(Citrus.PREFIX_PROPERTY_NAME));
218 
219         StatusPrinter.print(context);
220         checker.assertIsWarningOrErrorFree();
221     }
222 }