Author: ieb
Date: Mon Jul 21 15:48:25 2008
New Revision: 678591
URL: http://svn.apache.org/viewvc?rev=678591&view=rev
Log:
SHINDIG-451
Removed the dependency on shindig-eatures from the APIiValidator.
added in log4j.properties to the test scope to configure logging correctly
Added:
incubator/shindig/trunk/java/social-api/src/test/resources/
incubator/shindig/trunk/java/social-api/src/test/resources/log4j.properties
incubator/shindig/trunk/java/social-api/src/test/resources/simplelog.properties
Modified:
incubator/shindig/trunk/java/social-api/pom.xml
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidator.java
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidatorTest.java
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonLibConverterTest.java
Modified: incubator/shindig/trunk/java/social-api/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/pom.xml?rev=678591&r1=678590&r2=678591&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/pom.xml (original)
+++ incubator/shindig/trunk/java/social-api/pom.xml Mon Jul 21 15:48:25 2008
@@ -60,13 +60,6 @@
<groupId>org.apache.shindig</groupId>
<artifactId>shindig-common</artifactId>
</dependency>
- <!-- is this Ok, only used in test to load the features -->
- <dependency>
- <groupId>org.apache.shindig</groupId>
- <artifactId>shindig-features</artifactId>
- <scope>test</scope>
- </dependency>
-
<!-- external depenencies -->
<dependency>
<groupId>org.json</groupId>
Modified:
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidator.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidator.java?rev=678591&r1=678590&r2=678591&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidator.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidator.java
Mon Jul 21 15:48:25 2008
@@ -65,7 +65,7 @@
* feature is missing
*
*/
- public ApiValidator(String feature) throws IOException,
+ private ApiValidator(String feature) throws IOException,
ParserConfigurationException, SAXException {
ctx = Context.enter();
scope = ctx.initStandardObjects();
@@ -73,6 +73,15 @@
}
/**
+ * Load the ApiValidator with no features, this avoids having features in
the classpath
+ * @throws IOException
+ */
+ public ApiValidator() throws IOException {
+ ctx = Context.enter();
+ scope = ctx.initStandardObjects();
+ }
+
+ /**
* @param json
* The json to validate expected in a form { xyz: yyy } form
* @param object
@@ -120,7 +129,61 @@
}
log.debug("Loaded " + so);
- return validateOject(so, object, optionalFields, nullfields);
+ ScriptableObject specification = getScriptableObject(object);
+ log.debug("Looking for " + object + " found " + specification);
+ listScriptable(object, specification);
+ Object[] fields = specification.getIds();
+ String[] fieldNames = new String[fields.length];
+ for (int i = 0; i < fields.length; i++) {
+ Object fieldName = specification.get(String.valueOf(fields[i]),
specification);
+ fieldNames[i] = String.valueOf(fieldName);
+ }
+
+ return validateObject(so, fieldNames, optionalFields, nullfields);
+
+ }
+
+ /**
+ * @param json
+ * The json to validate expected in a form { xyz: yyy } form
+ * @param fieldNames
+ * An Array of field names that the oject should be tested
against
+ * @param optionalFields
+ * If any of the fields that appear in the json structure are
+ * optional, then they should be defined in this parameter.
+ * @param nullfields
+ * @throws ApiValidatorExpcetion
+ * if there is a problem validating the json
+ * @return a map so string object pairs containing the fields at the top
level
+ * of the json tree. Where these are native java objects, they will
+ * appear as native object. Complex json objects will appear as Rhino
+ * specific objects
+ */
+ public Map<String, Object> validate(String json, String[] fieldNames,
+ String[] optionalFields, String[] nullfields)
+ throws ApiValidatorExpcetion {
+
+
+ log.debug("Loading " + json);
+ json = json.trim();
+ if (!json.endsWith("}")) {
+ json = json + "}";
+ }
+ if (!json.startsWith("{")) {
+ json = "{" + json;
+ }
+ json = "( testingObject = " + json + " )";
+
+ Object so = null;
+ try {
+ so = ctx.evaluateString(scope, json, "test json", 0, null);
+ } catch (EvaluatorException ex) {
+ log.error("Non parseable JSON " + json);
+ }
+ log.debug("Loaded " + so);
+
+
+ return validateObject(so, fieldNames, optionalFields, nullfields);
}
@@ -133,7 +196,7 @@
* @return
* @throws ApiValidatorExpcetion
*/
- public Map<String, Object> validateOject(Object jsonObject, String object,
+ public Map<String, Object> validateObject(Object jsonObject, String[]
fieldNames,
String[] optionalFields, String[] nullFields)
throws ApiValidatorExpcetion {
Map<String, String> optional = new HashMap<String, String>();
@@ -145,19 +208,14 @@
nullf.put(nf, nf);
}
- ScriptableObject specification = getScriptableObject(object);
- log.debug("Looking for " + object + " found " + specification);
- listScriptable(object, specification);
Map<String, Object> resultFields = new HashMap<String, Object>();
if (jsonObject instanceof ScriptableObject) {
ScriptableObject parsedJSONObject = (ScriptableObject) jsonObject;
listScriptable("testingObject", parsedJSONObject);
- Object[] fields = specification.getIds();
- for (Object f : fields) {
- Object fieldName = specification.get(String.valueOf(f), specification);
- Object o = parsedJSONObject.get(String.valueOf(fieldName),
+ for (String fieldName : fieldNames) {
+ Object o = parsedJSONObject.get(fieldName,
parsedJSONObject);
if (o == ScriptableObject.NOT_FOUND) {
if (optional.containsKey(fieldName)) {
@@ -174,12 +232,12 @@
if (nullf.containsKey(fieldName)) {
log.error("Null Fields has been serialized " + fieldName);
}
- log.debug("Got a Null object for Field " + f + ":" + fieldName
+ log.debug("Got a Null object for Field " + fieldName
+ " on json [[" + jsonObject + "]]");
} else {
- log.debug("Got JSON Field Field," + f + ":" + fieldName + " as "
+ log.debug("Got JSON Field Field," + fieldName + " as "
+ o + " " + o.getClass());
}
resultFields.put(String.valueOf(fieldName), o);
@@ -266,7 +324,8 @@
in = this.getClass().getClassLoader().getResourceAsStream(
"features/" + scriptPath);
if (in == null) {
- throw new IOException("Cant load spec " + spec + " or
features/"+spec+" from classpath");
+ throw new IOException("Cant load spec " + spec + " or features/"
+ + spec + " from classpath");
}
}
InputStreamReader reader = new InputStreamReader(in);
@@ -315,9 +374,10 @@
features);
if (in == null) {
in = this.getClass().getClassLoader().getResourceAsStream(
- "features/"+features);
+ "features/" + features);
if (in == null) {
- throw new IOException("Cant find " + features + " or features/" +
features+ " in classpath ");
+ throw new IOException("Cant find " + features + " or features/"
+ + features + " in classpath ");
}
}
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
Modified:
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidatorTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidatorTest.java?rev=678591&r1=678590&r2=678591&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidatorTest.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/ApiValidatorTest.java
Mon Jul 21 15:48:25 2008
@@ -37,6 +37,11 @@
*/
private static final String TEST_DEFINITION =
"var TestDef = {}; TestDef.Field = { FIELD1 : \"json\", FIELD2 : \"xyz\",
FIELD3 : \"shouldBeMissing\" };";
+ private static final String[] TEST_DEFINITION_FIELDS = {
+ "json",
+ "xyz",
+ "shouldBeMissing"
+ };
/**
* test the validator for successful validation
@@ -47,7 +52,7 @@
*/
@Test
public void testValidator() throws ApiValidatorExpcetion, IOException,
ParserConfigurationException, SAXException {
- ApiValidator apiVal = new ApiValidator("opensocial-reference");
+ ApiValidator apiVal = new ApiValidator();
apiVal.addScript(TEST_DEFINITION);
String[] optional = {"shouldBeMissing"};
String[] nullfields = {};
@@ -72,7 +77,7 @@
*/
@Test
public void testValidatorFail() throws ApiValidatorExpcetion, IOException,
ParserConfigurationException, SAXException {
- ApiValidator apiVal = new ApiValidator("opensocial-reference");
+ ApiValidator apiVal = new ApiValidator();
apiVal.addScript(TEST_DEFINITION);
String[] optional = {};
String[] nullfields = {};
@@ -82,8 +87,49 @@
} catch ( ApiValidatorExpcetion ex ) {
}
+ }
+ /**
+ * test the validator for successful validation
+ * @throws ApiValidatorExpcetion
+ * @throws IOException
+ * @throws ParserConfigurationException
+ * @throws SAXException
+ */
+ @Test
+ public void testFieldsValidator() throws ApiValidatorExpcetion, IOException,
ParserConfigurationException, SAXException {
+ ApiValidator apiVal = new ApiValidator();
+ String[] optional = {"shouldBeMissing"};
+ String[] nullfields = {};
+ Map<String, Object> result = apiVal.validate("{ json: \"A Test JSON\",
xyz : 123 }", TEST_DEFINITION_FIELDS, optional, nullfields );
+ Assert.assertNotNull(result);
+ Assert.assertNotNull(result.get("json"));
+ Assert.assertNotNull(result.get("xyz"));
+ Assert.assertEquals(String.class,result.get("json").getClass());
+ Assert.assertEquals(Integer.class,result.get("xyz").getClass());
+ Assert.assertEquals("A Test JSON",result.get("json"));
+ Assert.assertEquals(123,((Integer)result.get("xyz")).intValue());
}
+
+ /**
+ * Test for a failing validation
+ * @throws ApiValidatorExpcetion
+ * @throws IOException
+ * @throws ParserConfigurationException
+ * @throws SAXException
+ */
+ @Test
+ public void testFieldsValidatorFail() throws ApiValidatorExpcetion,
IOException, ParserConfigurationException, SAXException {
+ ApiValidator apiVal = new ApiValidator();
+ String[] optional = {};
+ String[] nullfields = {};
+ try {
+ apiVal.validate("{ jsonIsMissing: \"A Test JSON\", xyz : 123 }",
TEST_DEFINITION_FIELDS, optional, nullfields );
+ Assert.fail("Should have Generated an APIValidatorException ");
+ } catch ( ApiValidatorExpcetion ex ) {
+
+ }
+ }
}
Modified:
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonLibConverterTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonLibConverterTest.java?rev=678591&r1=678590&r2=678591&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonLibConverterTest.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonLibConverterTest.java
Mon Jul 21 15:48:25 2008
@@ -49,6 +49,23 @@
private static final Log log = LogFactory
.getLog(BeanJsonLibConverterTest.class);
+ // taken from opensocial-reference/person.js
+ private static final String[] PERSON_FIELDS = { "id", "name", "nickname",
+ "thumbnailUrl", "profileUrl", "currentLocation", "addresses", "emails",
+ "phoneNumbers", "aboutMe", "status", "profileSong", "profileVideo",
+ "gender", "sexualOrientation", "relationshipStatus", "age",
+ "dateOfBirth", "bodyType", "ethnicity", "smoker", "drinker", "children",
+ "pets", "livingArrangement", "timeZone", "languagesSpoken", "jobs",
+ "jobInterests", "schools", "interests", "urls", "music", "movies",
+ "tvShows", "books", "activities", "sports", "heroes", "quotes", "cars",
+ "food", "turnOns", "turnOffs", "tags", "romance", "scaredOf",
+ "happiestWhen", "fashion", "humor", "lookingFor", "religion",
+ "politicalViews", "hasApp", "networkPresence" };
+
+ // taken from opensocial-reference/name.js
+ private static final String[] NAME_FIELDS = { "familyName", "givenName",
+ "additionalName", "honorificPrefix", "honorificSuffix", "unstructured"};
+
private Person johnDoe;
private Activity activity;
@@ -80,19 +97,25 @@
beanJsonConverter = new BeanJsonLibConverter(Guice
.createInjector(new JsonLibTestsGuiceModule()));
- apiValidator = new ApiValidator("opensocial-reference");
+ apiValidator = new ApiValidator();
}
public static class SpecialPerson extends PersonImpl {
public static final String[] OPTIONALFIELDS = {};
- public static final String[] NULLFIELDS =
{"jobInterests","nickname","romance","religion","timeZone",
-
"relationshipStatus","tags","networkPresence","books","quotes","phoneNumbers","languagesSpoken",
-
"activities","jobs","dateOfBirth","profileVideo","bodyType","urls","schools","music","addresses",
-
"livingArrangement","thumbnailUrl","humor","sports","scaredOf","movies","age","pets","hasApp","turnOffs",
-
"gender","fashion","drinker","aboutMe","children","sexualOrientation","heroes","profileSong","lookingFor",
-
"cars","turnOns","tvShows","profileUrl","status","currentLocation","smoker","happiestWhen","ethnicity",
-
"food","emails","politicalViews","interests","familyName","honorificSuffix","additionalName","honorificPrefix","givenName"};
+ public static final String[] NULLFIELDS = { "jobInterests", "nickname",
+ "romance", "religion", "timeZone", "relationshipStatus", "tags",
+ "networkPresence", "books", "quotes", "phoneNumbers",
+ "languagesSpoken", "activities", "jobs", "dateOfBirth", "profileVideo",
+ "bodyType", "urls", "schools", "music", "addresses",
+ "livingArrangement", "thumbnailUrl", "humor", "sports", "scaredOf",
+ "movies", "age", "pets", "hasApp", "turnOffs", "gender", "fashion",
+ "drinker", "aboutMe", "children", "sexualOrientation", "heroes",
+ "profileSong", "lookingFor", "cars", "turnOns", "tvShows",
+ "profileUrl", "status", "currentLocation", "smoker", "happiestWhen",
+ "ethnicity", "food", "emails", "politicalViews", "interests",
+ "familyName", "honorificSuffix", "additionalName", "honorificPrefix",
+ "givenName" };
private String newfield;
@@ -120,13 +143,13 @@
String result = beanJsonConverter.convertToString(cassie);
- validatePerson(result, "5", "robot", SpecialPerson.OPTIONALFIELDS,
SpecialPerson.NULLFIELDS);
+ validatePerson(result, "5", "robot", SpecialPerson.OPTIONALFIELDS,
+ SpecialPerson.NULLFIELDS);
- apiValidator.addScript(" specialPerson = { SPECIAL : \"newfield\" }; ");
String[] optional = {};
String[] nullfields = {};
Map<String, Object> special = apiValidator.validate(result,
- "specialPerson", optional,nullfields);
+ new String[] { "newfield" }, optional, nullfields);
assertNotNull(special.get("newfield"));
assertEquals(String.class, special.get("newfield").getClass());
assertEquals("nonsense", special.get("newfield"));
@@ -156,18 +179,18 @@
* @param result
* @throws ApiValidatorExpcetion
*/
- private void validatePerson(String result, String id, String name, String[]
optional, String[] nullfields)
- throws ApiValidatorExpcetion {
+ private void validatePerson(String result, String id, String name,
+ String[] optional, String[] nullfields) throws ApiValidatorExpcetion {
- Map<String, Object> standard = apiValidator.validate(result,
- "opensocial.Person.Field", optional,nullfields);
+ Map<String, Object> standard = apiValidator.validate(result, PERSON_FIELDS,
+ optional, nullfields);
assertNotNull(standard.get("id"));
assertEquals(String.class, standard.get("id").getClass());
assertEquals(id, standard.get("id"));
assertNotNull(standard.get("name"));
- Map<String, Object> nameJSON = apiValidator.validateOject(standard
- .get("name"), "opensocial.Name.Field", optional,nullfields);
+ Map<String, Object> nameJSON = apiValidator.validateObject(standard
+ .get("name"), NAME_FIELDS, optional, nullfields);
ApiValidator.dump(nameJSON);
assertNotNull(nameJSON.get("unstructured"));
@@ -269,16 +292,15 @@
// map should contain, so we have to tell it
beanJsonConverter.addMapping("item1", Map.class);
beanJsonConverter.addMapping("item2", Map.class);
- Map<?, ?> parsedMap = beanJsonConverter
- .convertToObject(result, Map.class);
+ Map<?, ?> parsedMap = beanJsonConverter.convertToObject(result, Map.class);
if (outputInfo) {
log.info("Dumping Map (" + parsedMap + ")");
}
ApiValidator.dump(parsedMap);
- assertEquals("1", ((Map<?,?>)parsedMap.get("item1")).get("value"));
- assertEquals("2", ((Map<?,?>)parsedMap.get("item2")).get("value"));
+ assertEquals("1", ((Map<?, ?>) parsedMap.get("item1")).get("value"));
+ assertEquals("2", ((Map<?, ?>) parsedMap.get("item2")).get("value"));
}
public void testListsToJson() throws Exception {
@@ -299,8 +321,8 @@
if (outputInfo) {
log.info("JSON (" + result + ")");
}
- Map<?, ?>[] parsedList = beanJsonConverter.convertToObject(
- result, Map[].class);
+ Map<?, ?>[] parsedList = beanJsonConverter.convertToObject(result,
+ Map[].class);
assertEquals("1", parsedList[0].get("value"));
assertEquals("2", parsedList[1].get("value"));
Added:
incubator/shindig/trunk/java/social-api/src/test/resources/log4j.properties
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/resources/log4j.properties?rev=678591&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/resources/log4j.properties
(added)
+++ incubator/shindig/trunk/java/social-api/src/test/resources/log4j.properties
Mon Jul 21 15:48:25 2008
@@ -0,0 +1,8 @@
+log4j.rootCategory=info
+log4j.rootLogger=info, stdout
+
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern= %p %m [%d] (%F:%L) %n
+
Added:
incubator/shindig/trunk/java/social-api/src/test/resources/simplelog.properties
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/resources/simplelog.properties?rev=678591&view=auto
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/resources/simplelog.properties
(added)
+++
incubator/shindig/trunk/java/social-api/src/test/resources/simplelog.properties
Mon Jul 21 15:48:25 2008
@@ -0,0 +1,8 @@
+log4j.rootCategory=info
+log4j.rootLogger=info, stdout
+
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern= %p %m [%d] (%F:%L) %n
+