1   /*
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2026, 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 v2.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.action;
15  
16  import org.junit.jupiter.api.Assertions;
17  import org.junit.jupiter.api.BeforeEach;
18  import org.junit.jupiter.api.Test;
19  
20  import ch.qos.logback.core.Context;
21  import ch.qos.logback.core.ContextBase;
22  import ch.qos.logback.core.joran.spi.SaxEventInterpretationContext;
23  
24  /**
25   * Test {@link PreconditionValidator}.
26   */
27  public class PreconditionValidatorTest {
28  
29      IncludeAction includeAction = new IncludeAction();
30      Context context;
31      SaxEventInterpretationContext interpretationContext;
32      DummyAttributes attributes;
33      String tagName = "testTag";
34  
35      @BeforeEach
36      public void setUp() {
37          context = new ContextBase();
38          includeAction.setContext(context);
39          interpretationContext = new SaxEventInterpretationContext(context, null);
40          attributes = new DummyAttributes();
41      }
42  
43      @Test
44      public void validateOneAndOnlyOneAttributeProvided_withExactlyOneValidAttribute() {
45          attributes.setValue("file", "test.txt");
46  
47          PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
48          validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
49  
50          Assertions.assertTrue(validator.isValid());
51      }
52  
53      @Test
54      public void validateOneAndOnlyOneAttributeProvided_withTwoValidAttributes() {
55          attributes.setValue("file", "test.txt");
56          attributes.setValue("url", "http://example.com");
57  
58          PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
59          validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
60  
61          Assertions.assertFalse(validator.isValid());
62          Assertions.assertEquals(1, context.getStatusManager().getCount());
63      }
64  
65      @Test
66      public void validateOneAndOnlyOneAttributeProvided_withNoValidAttributes() {
67          PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
68          validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
69  
70          Assertions.assertFalse(validator.isValid());
71          Assertions.assertEquals(1, context.getStatusManager().getCount());
72      }
73  
74      @Test
75      public void validateOneAndOnlyOneAttributeProvided_withEmptyStringAttribute() {
76          attributes.setValue("file", "");
77  
78          PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
79          validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
80  
81          Assertions.assertFalse(validator.isValid());
82      }
83  
84      @Test
85      public void validateOneAndOnlyOneAttributeProvided_withWhitespaceOnlyAttribute() {
86          attributes.setValue("file", "   ");
87  
88          PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
89          validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
90  
91          Assertions.assertFalse(validator.isValid());
92      }
93  
94      @Test
95      public void validateOneAndOnlyOneAttributeProvided_withOneValidAndOneInvalidAttribute() {
96          attributes.setValue("file", "test.txt");
97          attributes.setValue("url", "");
98  
99          PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
100         validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
101 
102         Assertions.assertTrue(validator.isValid());
103     }
104 
105     @Test
106     public void validateOneAndOnlyOneAttributeProvided_withThreeValidAttributes() {
107         attributes.setValue("file", "test.txt");
108         attributes.setValue("url", "http://example.com");
109         attributes.setValue("resource", "config.xml");
110 
111         PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
112         validator.validateOneAndOnlyOneAttributeProvided("file", "url", "resource");
113 
114         Assertions.assertFalse(validator.isValid());
115         Assertions.assertEquals(1, context.getStatusManager().getCount());
116     }
117 
118     @Test
119     public void validateOneAndOnlyOneAttributeProvided_withSingleAttributeOption() {
120         attributes.setValue("name", "testName");
121 
122         PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
123         validator.validateOneAndOnlyOneAttributeProvided("name");
124 
125         Assertions.assertTrue(validator.isValid());
126     }
127 
128     @Test
129     public void validateOneAndOnlyOneAttributeProvided_withNullAttribute() {
130         attributes.setValue("file", null);
131 
132         PreconditionValidator validator = new PreconditionValidator(includeAction, interpretationContext, tagName, attributes);
133         validator.validateOneAndOnlyOneAttributeProvided("file", "url");
134 
135         Assertions.assertFalse(validator.isValid());
136     }
137 }