// Copyright 2019 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "dawn/native/ErrorInjector.h"

#include "dawn/common/Assert.h"
#include "dawn/native/DawnNative.h"

namespace dawn::native {

namespace {

bool sIsEnabled = false;
uint64_t sNextIndex = 0;
uint64_t sInjectedFailureIndex = 0;
bool sHasPendingInjectedError = false;

}  // anonymous namespace

void EnableErrorInjector() {
    sIsEnabled = true;
}

void DisableErrorInjector() {
    sIsEnabled = false;
}

void ClearErrorInjector() {
    sNextIndex = 0;
    sHasPendingInjectedError = false;
}

bool ErrorInjectorEnabled() {
    return sIsEnabled;
}

uint64_t AcquireErrorInjectorCallCount() {
    uint64_t count = sNextIndex;
    ClearErrorInjector();
    return count;
}

bool ShouldInjectError() {
    uint64_t index = sNextIndex++;
    if (sHasPendingInjectedError && index == sInjectedFailureIndex) {
        sHasPendingInjectedError = false;
        return true;
    }
    return false;
}

void InjectErrorAt(uint64_t index) {
    // Only one error can be injected at a time.
    ASSERT(!sHasPendingInjectedError);
    sInjectedFailureIndex = index;
    sHasPendingInjectedError = true;
}

}  // namespace dawn::native
