JsonMapObjectReaderWriterFuzzer.java
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//////////////////////////////////////////////////////////////////////////////////
package com.example;
import com.code_intelligence.jazzer.api.FuzzedDataProvider;
import com.code_intelligence.jazzer.junit.FuzzTest;
import java.util.*;
import java.io.Serializable;
import java.io.UncheckedIOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.apache.cxf.jaxrs.json.basic.JsonMapObject;
import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
public class JsonMapObjectReaderWriterFuzzer {
static int cn = 29;
static JsonMapObjectReaderWriter jsonMapObjectReaderWriter = new JsonMapObjectReaderWriter();
@FuzzTest
void myFuzzTest(FuzzedDataProvider data) {
int dummyNum = data.consumeInt(0, 2^cn - 1);
try {
Map<String, Object> map = new LinkedHashMap<>();
for (int i = 0; i < data.consumeInt(0, 50); ++i) {
DummyClass dummyClass = getDummyClass(data, dummyNum);
map.put(data.consumeString(50), dummyClass);
}
String json = jsonMapObjectReaderWriter.toJson(map);
String json2 = jsonMapObjectReaderWriter.toJson(new JsonMapObject(map));
jsonMapObjectReaderWriter.fromJson(json);
jsonMapObjectReaderWriter.fromJson(json2);
jsonMapObjectReaderWriter.fromJsonAsList(json);
jsonMapObjectReaderWriter.fromJsonAsList(json2);
jsonMapObjectReaderWriter.fromJsonToJsonObject(json);
jsonMapObjectReaderWriter.fromJsonToJsonObject(json2);
} catch (NumberFormatException | StringIndexOutOfBoundsException | UncheckedIOException e) {
}
}
public static DummyClass getDummyClass (FuzzedDataProvider data, int dummyNum) {
DummyClass dummyClass = new DummyClass();
for (int bit = 0; bit < cn; ++bit) {
if (((dummyNum >> bit) & 1) == 1) {
switch (bit) {
case 0:
for (int i = 0; i < data.consumeInt(0, 50); i++) {
try {
dummyClass._treeMap.put(data.consumeString(50), data.consumeInt());
} catch (NullPointerException e) {
}
}
break;
case 1:
for (int i = 0; i < data.consumeInt(0, 50); i++) {
try {
dummyClass._arrayList.add(data.consumeString(50));
} catch (NullPointerException e) {
}
}
break;
case 2:
for (int i = 0; i < data.consumeInt(0, 50); i++) {
try {
dummyClass._hashSet.add(data.consumeString(50));
} catch (NullPointerException e) {
}
}
break;
case 3:
for (int i = 0; i < data.consumeInt(0, 50); i++) {
try {
dummyClass._hashMap.put(data.consumeString(50), data.consumeString(50));
} catch (NullPointerException e) {
}
}
break;
case 4:
Integer[] integerArr = new Integer[data.consumeInt(0, 50)];
for (int i = 0; i < integerArr.length; i++) {
integerArr[i] = data.consumeInt();
}
dummyClass._asList = Arrays.asList(integerArr);
break;
case 5:
dummyClass._intArray = data.consumeInts(50);
break;
case 6:
dummyClass._longArray = data.consumeLongs(50);
break;
case 7:
dummyClass._shortArray = data.consumeShorts(50);
break;
case 8:
float[] floatArr = new float[data.consumeInt(0, 50)];
for (int i = 0; i < floatArr.length; i++) {
floatArr[i] = data.consumeFloat();
}
dummyClass._floatArray = floatArr;
break;
case 9:
double[] doubleArr = new double[data.consumeInt(0, 50)];
for (int i = 0; i < doubleArr.length; i++) {
doubleArr[i] = data.consumeDouble();
}
dummyClass._doubleArray = doubleArr;
break;
case 10:
dummyClass._byteArray = data.consumeBytes(50);
break;
case 11:
char[] charArr = new char[data.consumeInt(0, 50)];
for (int i = 0; i < charArr.length; i++) {
charArr[i] = data.consumeChar();
}
dummyClass._charArray = charArr;
break;
case 12:
dummyClass._boolArray = data.consumeBooleans(50);
break;
case 13:
String[] strArr = new String[data.consumeInt(0, 50)];
for (int i = 0; i < strArr.length; i++) {
strArr[i] = data.consumeString(50);
}
dummyClass._stringArray = strArr;
break;
case 14:
BitSet bitSet = BitSet.valueOf(data.consumeLongs(50));
dummyClass._bitSet = bitSet;
break;
case 15:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
dummyClass._date = dateFormat.parse(data.consumeString(50));
} catch (ParseException e) {
}
break;
case 16:
TimeZone tz = TimeZone.getTimeZone(data.consumeString(50));
dummyClass._timeZone = tz;
break;
case 17:
Calendar calendar = new GregorianCalendar(data.consumeInt(),data.consumeInt(),data.consumeInt());
dummyClass._calendar = calendar;
break;
case 18:
Locale locale = new Locale(data.consumeString(50));
dummyClass._locale = locale;
break;
case 19:
Integer[] integerArr2 = new Integer[data.consumeInt(0, 50)];
for (int i = 0; i < integerArr2.length; i++) {
integerArr2[i] = data.consumeInt();
}
dummyClass._integerArray = integerArr2;
break;
case 20:
dummyClass._boolean = data.consumeBoolean();
break;
case 21:
dummyClass._char = data.consumeChar();
break;
case 22:
dummyClass._byte = data.consumeByte();
break;
case 23:
dummyClass._short = data.consumeShort();
break;
case 24:
dummyClass._int = data.consumeInt();
break;
case 25:
dummyClass._float = data.consumeFloat();
break;
case 26:
dummyClass._long = data.consumeLong();
break;
case 27:
dummyClass._double = data.consumeDouble();
break;
case 28:
dummyClass._string = data.consumeString(50);
break;
}
}
}
return dummyClass;
}
public static class DummyClass implements Serializable {
public TreeMap<String, Integer> _treeMap;
public List<String> _arrayList;
public Set<String> _hashSet;
public Map<String, Object> _hashMap;
public List<Integer> _asList;
public int[] _intArray;
public long[] _longArray;
public short[] _shortArray;
public float[] _floatArray;
public double[] _doubleArray;
public byte[] _byteArray;
public char[] _charArray;
public boolean[] _boolArray;
public String[] _stringArray;
public BitSet _bitSet;
public Date _date;
public TimeZone _timeZone;
public Calendar _calendar;
public Locale _locale;
public Integer[] _integerArray;
public boolean _boolean;
public char _char;
public byte _byte;
public short _short;
public int _int;
public float _float;
public Long _long;
public Double _double;
public String _string;
}
}