var called = [];
var proxy = new Proxy({a: 1, get b() {}}, {
    getOwnPropertyDescriptor(target, P) {
        called.push("getOwnPropertyDescriptor");
        return Object.getOwnPropertyDescriptor(target, P);
    },
    defineProperty(target, P, desc) {
        called.push("defineProperty");
        if (P == "a") {
            assertEq(Object.getOwnPropertyNames(desc).length, 2);
            assertEq(desc.configurable, false);
            assertEq(desc.writable, false);
        } else {
            assertEq(Object.getOwnPropertyNames(desc).length, 1);
            assertEq(desc.configurable, false);
        }
        return Object.defineProperty(target, P, desc);
    }
});

Object.freeze(proxy);
assertEq(called.toString(), "getOwnPropertyDescriptor,defineProperty,getOwnPropertyDescriptor,defineProperty");