package com.facebook.android.tests;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import org.json.JSONObject;
import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Util;
import com.facebook.android.AsyncFacebookRunner.RequestListener;
import com.facebook.android.Facebook.DialogListener;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Tests extends Activity {
// Your Facebook Application ID must be set before running this example
// See http://www.facebook.com/developers/createapp.php
public static final String APP_ID = "110862205611506";
private static final String[] PERMISSIONS =
new String[] {"publish_stream", "read_stream", "offline_access"};
TextView publicTestsText;
TextView publicErrorsText;
Button loginButton;
TextView authenticatedTestsText;
TextView authenticatedErrorsText;
Button postButton;
TextView wallPostText;
TextView deletedPostText;
Button logoutButton;
TextView logoutText;
Facebook authenticatedFacebook = new Facebook(APP_ID);
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
publicTestsText = (TextView) findViewById(R.id.publicTests);
publicErrorsText = (TextView) findViewById(R.id.publicErrors);
loginButton = (Button) findViewById(R.id.login);
authenticatedTestsText = (TextView) findViewById(
R.id.authenticatedTests);
authenticatedErrorsText = (TextView) findViewById(
R.id.authenticatedErrors);
postButton = (Button) findViewById(R.id.post);
wallPostText = (TextView) findViewById(R.id.wallPost);
deletedPostText = (TextView) findViewById(R.id.deletedPost);
logoutButton = (Button) findViewById(R.id.logout);
logoutText = (TextView) findViewById(R.id.logoutTest);
// button to test UI Server login method
loginButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
authenticatedFacebook.authorize(Tests.this, PERMISSIONS,
new TestLoginListener());
}
});
// button for testing UI server publish stream dialog
postButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
authenticatedFacebook.dialog(Tests.this, "stream.publish",
new TestUiServerListener());
}
});
// enable logout test button
logoutButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
runTestLogout();
}
});
runTestPublicApi();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
authenticatedFacebook.authorizeCallback(requestCode, resultCode, data);
}
public void runTestPublicApi() {
if (testPublicApi()) {
publicTestsText.setText("Public API tests passed");
publicTestsText.setTextColor(Color.GREEN);
} else {
publicTestsText.setText("Public API tests failed");
publicTestsText.setTextColor(Color.RED);
}
if (testPublicErrors()) {
publicErrorsText.setText("Public API errors passed");
publicErrorsText.setTextColor(Color.GREEN);
} else {
publicErrorsText.setText("Public API errors failed");
publicErrorsText.setTextColor(Color.RED);
}
}
public boolean testPublicApi() {
Facebook fb = new Facebook(APP_ID);
try {
Log.d("Tests", "Testing standard API call");
JSONObject response = Util.parseJson(fb.request("4"));
if (!response.getString("name").equals("Mark Zuckerberg")) {
return false;
}
Log.d("Tests", "Testing an API call with a specific method");
response = Util.parseJson(
fb.request("soneff", new Bundle(), "GET"));
if (!response.getString("name").equals("Steven Soneff")) {
return false;
}
Log.d("Tests", "Testing a public search query");
Bundle params = new Bundle();
params.putString("q", "facebook");
response = Util.parseJson(fb.request("search", params));
if (response.getJSONArray("data").length() == 0) return false;
Log.d("Tests", "Public API Tests passed");
return true;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
public boolean testPublicErrors() {
Facebook fb = new Facebook(APP_ID);
try {
Bundle params = new Bundle();
Log.d("Tests", "Testing illegal post");
params.putString("message", "Hello World");
try {
Util.parseJson(fb.request("4", params, "POST"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("Unsupported post request.")) {
return false;
}
}
Log.d("Tests", "Testing illegal delete");
try {
Util.parseJson(fb.request("4", new Bundle(), "DELETE"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals(
"An access token is required to request this " +
"resource.")) {
return false;
}
}
Log.d("Tests", "Testing illegal post to Zuck's feed");
try {
Util.parseJson(fb.request("4/feed", new Bundle(), "POST"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("(#200) The user hasn't " +
"authorized the application to perform this action")) {
return false;
}
}
Log.d("Tests", "Testing invalidly specified parameters");
try {
Util.parseJson(fb.request("bgolub?fields=id,name,picture"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().startsWith("Unknown fields: picture?")) {
return false;
}
}
Log.d("Tests", "Testing request for 'me' is rejected without " +
"access_token");
try {
Util.parseJson(fb.request("me"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals(
"An active access token must be used to " +
"query information about the current user.")) {
return false;
}
}
Log.d("Tests", "Testing empty request");
try {
Util.parseJson(fb.request(""));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("Unsupported get request.")) {
return false;
}
}
Log.d("Tests", "Testing an invalid path");
try {
Util.parseJson(fb.request("invalidinvalidinvalidinvalid"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals(
"(#803) Some of the aliases you requested do not " +
"exist: invalidinvalidinvalidinvalid")) {
return false;
}
}
Log.d("Tests", "Testing missing query parameter");
try {
Util.parseJson(fb.request("search", new Bundle(), "GET"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("No node specified")) return false;
}
Log.d("Tests", "Testing that API method is specified");
try {
fb.request(new Bundle());
return false;
} catch (IllegalArgumentException e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals(
"API method must be specified. " +
"(parameters must contain key \"method\" " +
"and value). See http://developers.facebook." +
"com/docs/reference/rest/")) {
return false;
}
}
Log.d("Tests", "Testing that old API request cannot be made " +
"without access token");
params.putString("method", "stream.publish");
try {
Util.parseJson(fb.request(params));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (e.getErrorCode() != 101 ||
!e.getMessage().equals("Invalid API key") ) {
return false;
}
}
Log.d("Tests", "Testing invalid access token");
try {
fb.setAccessToken("invalid");
Util.parseJson(fb.request("me", new Bundle(), "GET"));
return false;
} catch (FacebookError e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("Invalid OAuth access token.")) {
return false;
}
}
Log.d("Tests", "Public API Error Tests passed");
return true;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
public class TestLoginListener implements DialogListener {
public void onComplete(Bundle values) {
if (testAuthenticatedApi()) {
authenticatedTestsText.setText(
"Authenticated API tests passed");
authenticatedTestsText.setTextColor(Color.GREEN);
} else {
authenticatedTestsText.setText(
"Authenticated API tests failed");
authenticatedTestsText.setTextColor(Color.RED);
}
if (testAuthenticatedErrors()) {
authenticatedErrorsText.setText(
"Authenticated API errors passed");
authenticatedErrorsText.setTextColor(Color.GREEN);
} else {
authenticatedErrorsText.setText(
"Authenticated API errors failed");
authenticatedErrorsText.setTextColor(Color.RED);
}
}
public void onCancel() {
}
public void onError(DialogError e) {
e.printStackTrace();
}
public void onFacebookError(FacebookError e) {
e.printStackTrace();
}
}
public boolean testAuthenticatedApi() {
if (!authenticatedFacebook.isSessionValid()) return false;
try {
Log.d("Tests", "Testing request for 'me'");
String response = authenticatedFacebook.request("me");
JSONObject obj = Util.parseJson(response);
if (obj.getString("name") == null ||
obj.getString("name").equals("")) {
return false;
}
Log.d("Tests", "Testing graph API wall post");
Bundle parameters = new Bundle();
parameters.putString("message", "hello world");
parameters.putString("description", "test test test");
response = authenticatedFacebook.request("me/feed", parameters,
"POST");
Log.d("Tests", "got response: " + response);
if (response == null || response.equals("") ||
response.equals("false")) {
return false;
}
Log.d("Tests", "Testing graph API delete");
response = response.replaceAll("\\{\"id\":\"", "");
response = response.replaceAll("\"\\}", "");
response = authenticatedFacebook.request(response, new Bundle(),
"DELETE");
if (!response.equals("true")) return false;
Log.d("Tests", "Testing old API wall post");
parameters = new Bundle();
parameters.putString("method", "stream.publish");
parameters.putString("attachment",
"{\"name\":\"Name=Title\"," +
"\"href\":\"http://www.google.fr/\",\"" +
"caption\":\"Caption\",\"description\":\"Description" +
"\",\"media\":[{\"type\":\"image\",\"src\":" +
"\"http://www.kratiroff.com/logo-facebook.jpg\"," +
"\"href\":\"http://developers.facebook.com/\"}]," +
"\"properties\":{\"another link\":{\"text\":\"" +
"Facebook homepage\",\"href\":\"http://www.facebook." +
"com\"}}}");;
response = authenticatedFacebook.request(parameters);
Log.d("Tests", "got response: " + response);
if (response == null || response.equals("") ||
response.equals("false")) {
return false;
}
Log.d("Tests", "Testing wall post delete");
response = response.replaceAll("\"", "");
response = authenticatedFacebook.request(
response, new Bundle(), "DELETE");
if (!response.equals("true")) return false;
Log.d("Tests", "All Authenticated Tests Passed");
return true;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
public boolean testAuthenticatedErrors() {
if (!authenticatedFacebook.isSessionValid()) return false;
Log.d("Tests", "Testing that request for 'me/invalid' is rejected");
try {
Util.parseJson(authenticatedFacebook.request("me/invalid"));
return false;
} catch (Throwable e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("Unknown path components: /invalid")) {
return false;
}
}
Log.d("Tests", "Testing that old API call with invalid method fails");
Bundle params = new Bundle();
params.putString("method", "something_invalid");
try {
Util.parseJson(authenticatedFacebook.request(params));
return false;
} catch (Throwable e) {
Log.d("Tests", "*" + e.getMessage() + "*");
if (!e.getMessage().equals("Unknown method") ) {
return false;
}
}
Log.d("Tests", "All Authenticated Error Tests Passed");
return true;
}
public class TestUiServerListener implements DialogListener {
public void onComplete(Bundle values) {
final String postId = values.getString("post_id");
if (postId != null) {
Log.d("Facebook-Example", "Dialog Success! post_id=" + postId);
new AsyncFacebookRunner(authenticatedFacebook).request(postId,
new TestPostRequestListener());
} else {
Tests.this.runOnUiThread(new Runnable() {
public void run() {
wallPostText.setText("Wall Post Failure");
wallPostText.setTextColor(Color.RED);
}
});
}
}
public void onCancel() { }
public void onError(DialogError e) {
e.printStackTrace();
}
public void onFacebookError(FacebookError e) {
e.printStackTrace();
}
}
public class TestPostRequestListener implements RequestListener {
public void onComplete(final String response, final Object state) {
Log.d("Tests", "Got response: " + response);
try {
JSONObject json = Util.parseJson(response);
//final String message = json.getString("message");
String postId = json.getString("id");
Tests.this.runOnUiThread(new Runnable() {
public void run() {
wallPostText.setText("Wall Post Success");
wallPostText.setTextColor(Color.GREEN);
}
});
Log.d("Tests", "Testing wall post delete");
if (testPostDelete(postId)) {
Tests.this.runOnUiThread(new Runnable() {
public void run() {
deletedPostText.setText("Deleted Post Success");
deletedPostText.setTextColor(Color.GREEN);
}
});
} else {
Tests.this.runOnUiThread(new Runnable() {
public void run() {
deletedPostText.setText("Deleted Post Failure");
deletedPostText.setTextColor(Color.RED);
}
});
}
} catch (Throwable e) {
e.printStackTrace();
Tests.this.runOnUiThread(new Runnable() {
public void run() {
wallPostText.setText("Wall Post Failure");
wallPostText.setTextColor(Color.RED);
}
});
}
}
public void onFacebookError(FacebookError e, final Object state) {
e.printStackTrace();
}
public void onFileNotFoundException(FileNotFoundException e,
final Object state) {
e.printStackTrace();
}
public void onIOException(IOException e, final Object state) {
e.printStackTrace();
}
public void onMalformedURLException(MalformedURLException e,
final Object state) {
e.printStackTrace();
}
}
public boolean testPostDelete(String postId) {
try {
String deleteResponse =
authenticatedFacebook.request(postId, new Bundle(), "DELETE");
return deleteResponse.equals("true");
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
public void runTestLogout() {
if (testLogout()) {
logoutText.setText("Logout Tests Passed");
logoutText.setTextColor(Color.GREEN);
} else {
logoutText.setText("Logout Tests Failed");
logoutText.setTextColor(Color.RED);
}
}
public boolean testLogout() {
try {
Log.d("Tests", "Testing logout");
String response = authenticatedFacebook.logout(this);
Log.d("Tests", "Got logout response: *" + response + "*");
if (!response.equals("true")) {
return false;
}
Log.d("Tests", "Testing logout on logged out facebook session");
try {
Util.parseJson(authenticatedFacebook.logout(this));
return false;
} catch (FacebookError e) {
if (e.getErrorCode() != 101 ||
!e.getMessage().equals("Invalid API key") ) {
return false;
}
}
Log.d("Tests", "Testing logout on unauthenticated object");
try {
Util.parseJson(new Facebook(APP_ID).logout(this));
return false;
} catch (FacebookError e) {
if (e.getErrorCode() != 101 ||
!e.getMessage().equals("Invalid API key") ) {
return false;
}
}
Log.d("Tests", "All Logout Tests Passed");
return true;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
// test bad UI server method?
// test invalid permission? <-- UI server test
}