Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a4477fa5 authored by Khaled Abdelmohsen's avatar Khaled Abdelmohsen
Browse files

Represent OpenFormula as list of formulas

Use list of formulas inside OpenFormula, rather than using an exact 2
formulas. The list of formulas would help in representing multiple
formulas with the same connector, which would create less nesting.

Bug: 141979167
Test: atest FrameworksServicesTests:OpenFormulaTest
Change-Id: I8938c842dfe22c21bb8b4dd48e7ce2f639f33854
parent b71657a6
Loading
Loading
Loading
Loading
+14 −25
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@

package com.android.server.integrity.model;

import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkNotNull;

import android.annotation.Nullable;
import java.util.Collections;
import java.util.List;

/**
 * Represents a complex formula consisting of other simple and complex formulas.
@@ -34,46 +36,33 @@ public final class OpenFormula extends Formula {
    }

    private final Connector mConnector;
    private final Formula mMainFormula;
    private final Formula mAuxiliaryFormula;
    private final List<Formula> mFormulas;

    public OpenFormula(Connector connector, Formula mainFormula,
            @Nullable Formula auxiliaryFormula) {
        validateAuxiliaryFormula(connector, auxiliaryFormula);
    public OpenFormula(Connector connector, List<Formula> formulas) {
        validateFormulas(connector, formulas);
        this.mConnector = checkNotNull(connector);
        this.mMainFormula = checkNotNull(mainFormula);
        // TODO: Add validators on auxiliary formula
        this.mAuxiliaryFormula = auxiliaryFormula;
        this.mFormulas = Collections.unmodifiableList(checkNotNull(formulas));
    }

    public Connector getConnector() {
        return mConnector;
    }

    public Formula getMainFormula() {
        return mMainFormula;
    public List<Formula> getFormulas() {
        return mFormulas;
    }

    public Formula getAuxiliaryFormula() {
        return mAuxiliaryFormula;
    }

    private void validateAuxiliaryFormula(Connector connector, Formula auxiliaryFormula) {
        boolean validAuxiliaryFormula;
    private void validateFormulas(Connector connector, List<Formula> formulas) {
        switch (connector) {
            case AND:
            case OR:
                validAuxiliaryFormula = (auxiliaryFormula != null);
                checkArgument(formulas.size() >= 2,
                        String.format("Connector %s must have at least 2 formulas", connector));
                break;
            case NOT:
                validAuxiliaryFormula = (auxiliaryFormula == null);
                checkArgument(formulas.size() == 1,
                        String.format("Connector %s must have 1 formula only", connector));
                break;
            default:
                validAuxiliaryFormula = false;
        }
        if (!validAuxiliaryFormula) {
            throw new IllegalArgumentException(
                    String.format("Invalid formulas used for connector %s", connector));
        }
    }
}
+13 −10
Original line number Diff line number Diff line
@@ -24,6 +24,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.util.Arrays;
import java.util.Collections;

@RunWith(JUnit4.class)
public class OpenFormulaTest {

@@ -34,12 +37,11 @@ public class OpenFormulaTest {

    @Test
    public void testValidOpenFormula() {
        OpenFormula openFormula = new OpenFormula(OpenFormula.Connector.AND, ATOMIC_FORMULA_1,
                ATOMIC_FORMULA_2);
        OpenFormula openFormula = new OpenFormula(OpenFormula.Connector.AND,
                Arrays.asList(ATOMIC_FORMULA_1, ATOMIC_FORMULA_2));

        assertEquals(OpenFormula.Connector.AND, openFormula.getConnector());
        assertEquals(ATOMIC_FORMULA_1, openFormula.getMainFormula());
        assertEquals(ATOMIC_FORMULA_2, openFormula.getAuxiliaryFormula());
        assertEquals(Arrays.asList(ATOMIC_FORMULA_1, ATOMIC_FORMULA_2), openFormula.getFormulas());
    }

    @Test
@@ -47,9 +49,10 @@ public class OpenFormulaTest {
        assertExpectException(
                IllegalArgumentException.class,
                /* expectedExceptionMessageRegex */
                String.format("Invalid formulas used for connector %s", OpenFormula.Connector.AND),
                () -> new OpenFormula(OpenFormula.Connector.AND, ATOMIC_FORMULA_1,
                        null));
                String.format("Connector %s must have at least 2 formulas",
                        OpenFormula.Connector.AND),
                () -> new OpenFormula(OpenFormula.Connector.AND,
                        Collections.singletonList(ATOMIC_FORMULA_1)));
    }

    @Test
@@ -57,8 +60,8 @@ public class OpenFormulaTest {
        assertExpectException(
                IllegalArgumentException.class,
                /* expectedExceptionMessageRegex */
                String.format("Invalid formulas used for connector %s", OpenFormula.Connector.NOT),
                () -> new OpenFormula(OpenFormula.Connector.NOT, ATOMIC_FORMULA_1,
                        ATOMIC_FORMULA_2));
                String.format("Connector %s must have 1 formula only", OpenFormula.Connector.NOT),
                () -> new OpenFormula(OpenFormula.Connector.NOT,
                        Arrays.asList(ATOMIC_FORMULA_1, ATOMIC_FORMULA_2)));
    }
}