View Javadoc
1   /*
2    * Portions of this software was developed by employees of the National Institute
3    * of Standards and Technology (NIST), an agency of the Federal Government and is
4    * being made available as a public service. Pursuant to title 17 United States
5    * Code Section 105, works of NIST employees are not subject to copyright
6    * protection in the United States. This software may be subject to foreign
7    * copyright. Permission in the United States and in foreign countries, to the
8    * extent that NIST may hold copyright, to use, copy, modify, create derivative
9    * works, and distribute this software and its documentation without fee is hereby
10   * granted on a non-exclusive basis, provided that this notice and disclaimer
11   * of warranty appears in all copies.
12   *
13   * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
14   * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
15   * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
17   * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
18   * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
19   * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
20   * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
21   * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
22   * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
23   * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
24   * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
25   */
26  
27  package gov.nist.secauto.metaschema.databind.model;
28  
29  import static org.junit.jupiter.api.Assertions.assertAll;
30  import static org.junit.jupiter.api.Assertions.assertEquals;
31  import static org.junit.jupiter.api.Assertions.assertIterableEquals;
32  import static org.junit.jupiter.api.Assertions.assertNull;
33  import static org.junit.jupiter.api.Assertions.assertTrue;
34  
35  import com.fasterxml.jackson.core.JsonFactory;
36  import com.fasterxml.jackson.core.JsonParseException;
37  import com.fasterxml.jackson.core.JsonParser;
38  
39  import gov.nist.secauto.metaschema.core.model.IModule;
40  import gov.nist.secauto.metaschema.databind.IBindingContext;
41  import gov.nist.secauto.metaschema.databind.io.json.MetaschemaJsonReader;
42  import gov.nist.secauto.metaschema.databind.model.info.IDataTypeHandler;
43  import gov.nist.secauto.metaschema.databind.model.test.MultiFieldAssembly;
44  import gov.nist.secauto.metaschema.databind.model.test.SimpleAssembly;
45  
46  import org.jmock.auto.Mock;
47  import org.jmock.junit5.JUnit5Mockery;
48  import org.junit.jupiter.api.Test;
49  import org.junit.jupiter.api.extension.RegisterExtension;
50  
51  import java.io.IOException;
52  import java.util.Collections;
53  import java.util.LinkedList;
54  
55  class DefaultFieldPropertyTest {
56    @RegisterExtension
57    JUnit5Mockery context = new JUnit5Mockery();
58  
59    @Mock
60    private IModule module; // NOPMD - it's injected
61    @Mock
62    private IAssemblyClassBinding classBinding; // NOPMD - it's injected
63    @Mock
64    private IBindingContext bindingContext; // NOPMD - it's injected
65  
66    @Test
67    void testJsonReadFlag()
68        throws JsonParseException, IOException {
69      String json = "{ \"test\": { \"id\": \"theId\", \"number\": 1 } }";
70      JsonFactory factory = new JsonFactory();
71      try (JsonParser jsonParser = factory.createParser(json)) {
72        assert jsonParser != null;
73  
74        IBindingContext bindingContext = IBindingContext.instance();
75        IAssemblyClassBinding classBinding = (IAssemblyClassBinding) bindingContext.getClassBinding(SimpleAssembly.class);
76        assert classBinding != null;
77  
78        MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
79  
80        SimpleAssembly obj = parser.read(classBinding);
81        assert obj != null;
82  
83        assertAll(
84            () -> assertEquals("theId", obj.getId()));
85      }
86    }
87  
88    @Test
89    void testJsonReadField()
90        throws JsonParseException, IOException {
91  
92      String json = "{ \"field1\": \"field1value\", \"fields2\": [ \"field2value\" ] }";
93      JsonFactory factory = new JsonFactory();
94      try (JsonParser jsonParser = factory.createParser(json)) {
95        assert jsonParser != null;
96        // get first token
97        jsonParser.nextToken();
98  
99        IBindingContext bindingContext = IBindingContext.instance();
100       IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
101       assert classBinding != null;
102 
103       MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
104 
105       // Make a temporary data type handler for the top-level definition
106       IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
107 
108       // read the top-level definition
109       MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
110 
111       assertAll(
112           () -> assertEquals("field1value", obj.getField1()),
113           () -> assertTrue(obj.getField2() instanceof LinkedList),
114           () -> assertIterableEquals(Collections.singleton("field2value"), obj.getField2()));
115 
116       // assertEquals(JsonToken.START_OBJECT, jsonParser.nextToken());
117       // assertEquals(JsonToken.FIELD_NAME, jsonParser.nextToken());
118       // assertEquals("id", jsonParser.currentName());
119     }
120   }
121 
122   @Test
123   void testJsonReadMissingFieldValue()
124       throws JsonParseException, IOException {
125     String json = "{ \"fields2\": [\n"
126         + "    \"field2value\"\n"
127         + "    ]\n"
128         + "}\n";
129     JsonFactory factory = new JsonFactory();
130     try (JsonParser jsonParser = factory.createParser(json)) {
131       assert jsonParser != null;
132       // get first token
133       jsonParser.nextToken();
134 
135       IBindingContext bindingContext = IBindingContext.instance();
136       IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
137       assert classBinding != null;
138 
139       MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
140 
141       // Make a temporary data type handler for the top-level definition
142       IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
143 
144       // read the top-level definition
145       MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
146 
147       assertAll(
148           () -> assertNull(obj.getField1()),
149           () -> assertTrue(obj.getField2() instanceof LinkedList),
150           () -> assertIterableEquals(Collections.singleton("field2value"), obj.getField2()));
151     }
152   }
153 
154   @Test
155   void testJsonReadFieldValueKey()
156       throws JsonParseException, IOException {
157     String json = "{ \"field-value-key\": { \"a-value\": \"theValue\" } }";
158     JsonFactory factory = new JsonFactory();
159     try (JsonParser jsonParser = factory.createParser(json)) {
160       assert jsonParser != null;
161       // get first token
162       jsonParser.nextToken();
163 
164       IBindingContext bindingContext = IBindingContext.instance();
165       IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
166       assert classBinding != null;
167 
168       MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
169 
170       // Make a temporary data type handler for the top-level definition
171       IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
172 
173       // read the top-level definition
174       MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
175 
176       assertAll(
177           () -> assertEquals("theValue", obj.getField3().getValue()));
178     }
179   }
180 
181   @Test
182   void testJsonReadFieldDefaultValueKey()
183       throws JsonParseException, IOException {
184     String json = "{ \"field-default-value-key\": { \"STRVALUE\": \"theValue\" } }";
185     JsonFactory factory = new JsonFactory();
186     try (JsonParser jsonParser = factory.createParser(json)) {
187       assert jsonParser != null;
188       // get first token
189       jsonParser.nextToken();
190 
191       IBindingContext bindingContext = IBindingContext.instance();
192       IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
193       assert classBinding != null;
194 
195       MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
196 
197       // Make a temporary data type handler for the top-level definition
198       IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
199 
200       // read the top-level definition
201       MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
202 
203       assertAll(
204           () -> assertEquals("theValue", obj.getField4().getValue()));
205     }
206   }
207 }