function testModule() {
    var ctx = context.new();
    var resourceId = "my-first-res";
    var attributes = [
        { name: "my_text", type: share.TYPE_TEXT, value: "my_text" },
        { name: "my_number", type: share.TYPE_NUMBER, value: 5 }, 
        { name: "my_path", type: share.TYPE_PATH, value: "/my/path" }, 
        { name: "my_bool", type: share.TYPE_BOOL, value: true }, 
    ]

    // Create resource with attributes

    var resource = share.upsertResource(
        ctx, resourceId,
        attributes[0],
        attributes[1],
        attributes[2],
        attributes[3]
    );

    if (resource.id != resourceId) {
        throw new Error("resource.id: expected '"+resourceId+"', got '"+resource.id+"'")
    }

    if (resource.origin != "test.app.edge") {
        throw new Error("resource.origin: expected 'test.app.edge', got '"+resource.origin+"'")
    }

    if (resource.attributes.length != 4) {
        throw new Error("resource.attributes.length: expected '1', got '"+resource.attributes.length+"'")
    }

    for(var attr, i = 0;( attr = attributes[i] ); i++) {
        var exists = resource.has(attr.name, attr.type);
        if (!exists) {
            throw new Error("resource.has('"+attr.name+"'): expected 'true', got '"+hasAttr+"'")
        }

        var value = resource.get(attr.name, attr.type);
        if (value != attr.value) {
            throw new Error("value: expected '"+attr.value+"', got '"+value+"'")
        }
    }

    // Test acces of unexistant attribute

    var unexistantAttr = "unexistant_attr"

    var exists = resource.has(unexistantAttr, share.TYPE_TEXT);
    if (exists) {
        throw new Error("attr '"+unexistantAttr+"' should not exist")
    }

    var expected = "foo"
    var value = resource.get(unexistantAttr, share.TYPE_TEXT, expected);
    if (value != expected) {
        throw new Error("resource.get('"+attr.name+"',  share.TYPE_TEXT, '"+expected+"'): expected '"+expected+"', got '"+value+"'")
    }

    // Search resources

    // With any attribute
    var results = share.findResources(ctx, share.ANY_NAME, share.ANY_TYPE);
    if (results.length != 1) {
        throw new Error("results.length: expected '1', got '"+results.length+"'")
    }

    // With an unexistant attribute
    var results = share.findResources(ctx, unexistantAttr, share.ANY_TYPE);
    if (results.length != 0) {
        throw new Error("results.length: expected '0', got '"+results.length+"'")
    }

    // With a wrong type
    var results = share.findResources(ctx, "my_text", share.TYPE_NUMBER);
    if (results.length != 0) {
        throw new Error("results.length: expected '0', got '"+results.length+"'")
    }
}