Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork131
Introducing ErrorCode#253
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Draft
andreagilardoni wants to merge14 commits intoarduino:masterChoose a base branch fromandreagilardoni:error-codes
base:master
Could not load branches
Branch not found:{{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline, and old review comments may become outdated.
Uh oh!
There was an error while loading.Please reload this page.
Draft
Changes fromall commits
Commits
Show all changes
14 commits Select commitHold shift + click to select a range
c8a56d6
Introducing ErrorCode
andreagilardoni863ca66
Introducing ReturnValue
andreagilardoni6ee998a
Added standard values for error codes from errno
andreagilardoni047d9a3
Added unit tests for Error codes
andreagilardoni5a417ea
Added unit tests for Return Values
andreagilardonia553fae
codestyle unification
andreagilardoni4ccc1ba
Integrating error code class in api definitions
andreagilardoni9a9ef24
Integrating Return Value class in apis
andreagilardoni43a3d9c
changing definition of destructor to use default
andreagilardoni0e21f4e
adapting unit tests to use ReturnValue class
andreagilardoni57050bf
fixup! Added standard values for error codes from errno
andreagilardonie034fa5
fixup! Introducing ErrorCode
andreagilardoni0048d5f
fixup! Added unit tests for Error codes
andreagilardoni41f3284
fixup! Added unit tests for Return Values
andreagilardoniFile filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
14 changes: 7 additions & 7 deletionsapi/Client.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
142 changes: 142 additions & 0 deletionsapi/ErrorCodes.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
#pragma once | ||
#include <stdint.h> | ||
namespace arduino { | ||
typedef int_fast32_t error_t; | ||
enum : error_t { | ||
ArduinoSuccess = 0, | ||
ArduinoError = -1, | ||
// TODO better names | ||
ArduinoEPERM = -1, /**< Not owner */ | ||
ArduinoENOENT = -2, /**< No such file or directory */ | ||
ArduinoESRCH = -3, /**< No such context */ | ||
ArduinoEINTR = -4, /**< Interrupted system call */ | ||
ArduinoEIO = -5, /**< I/O error */ | ||
ArduinoENXIO = -6, /**< No such device or address */ | ||
ArduinoE2BIG = -7, /**< Arg list too long */ | ||
ArduinoENOEXEC = -8, /**< Exec format error */ | ||
ArduinoEBADF = -9, /**< Bad file number */ | ||
ArduinoECHILD = -10, /**< No children */ | ||
ArduinoEAGAIN = -11, /**< No more contexts */ | ||
ArduinoENOMEM = -12, /**< Not enough core */ | ||
ArduinoEACCES = -13, /**< Permission denied */ | ||
ArduinoEFAULT = -14, /**< Bad address */ | ||
ArduinoENOTBLK = -15, /**< Block device required */ | ||
ArduinoEBUSY = -16, /**< Mount device busy */ | ||
ArduinoEEXIST = -17, /**< File exists */ | ||
ArduinoEXDEV = -18, /**< Cross-device link */ | ||
ArduinoENODEV = -19, /**< No such device */ | ||
ArduinoENOTDIR = -20, /**< Not a directory */ | ||
ArduinoEISDIR = -21, /**< Is a directory */ | ||
ArduinoEINVAL = -22, /**< Invalid argument */ | ||
ArduinoENFILE = -23, /**< File table overflow */ | ||
ArduinoEMFILE = -24, /**< Too many open files */ | ||
ArduinoENOTTY = -25, /**< Not a typewriter */ | ||
ArduinoETXTBSY = -26, /**< Text file busy */ | ||
ArduinoEFBIG = -27, /**< File too large */ | ||
ArduinoENOSPC = -28, /**< No space left on device */ | ||
ArduinoESPIPE = -29, /**< Illegal seek */ | ||
ArduinoEROFS = -30, /**< Read-only file system */ | ||
ArduinoEMLINK = -31, /**< Too many links */ | ||
ArduinoEPIPE = -32, /**< Broken pipe */ | ||
ArduinoENOMSG = -35, /**< Unexpected message type */ | ||
ArduinoEDEADLK = -45, /**< Resource deadlock avoided */ | ||
ArduinoENOLCK = -46, /**< No locks available */ | ||
ArduinoENOSTR = -60, /**< STREAMS device required */ | ||
ArduinoENODATA = -61, /**< Missing expected message data */ | ||
ArduinoETIME = -62, /**< STREAMS timeout occurred */ | ||
ArduinoENOSR = -63, /**< Insufficient memory */ | ||
ArduinoEPROTO = -71, /**< Generic STREAMS error */ | ||
ArduinoEBADMSG = -77, /**< Invalid STREAMS message */ | ||
ArduinoENOSYS = -88, /**< Function not implemented */ | ||
ArduinoENOTEMPTY = -90, /**< Directory not empty */ | ||
ArduinoENAMETOOLONG = -91, /**< File name too long */ | ||
ArduinoELOOP = -92, /**< Too many levels of symbolic links */ | ||
ArduinoEOPNOTSUPP = -95, /**< Operation not supported on socket */ | ||
ArduinoEPFNOSUPPORT = -96, /**< Protocol family not supported */ | ||
ArduinoECONNRESET = -104, /**< Connection reset by peer */ | ||
ArduinoENOBUFS = -105, /**< No buffer space available */ | ||
ArduinoEAFNOSUPPORT = -106, /**< Addr family not supported */ | ||
ArduinoEPROTOTYPE = -107, /**< Protocol wrong type for socket */ | ||
ArduinoENOTSOCK = -108, /**< Socket operation on non-socket */ | ||
ArduinoENOPROTOOPT = -109, /**< Protocol not available */ | ||
ArduinoESHUTDOWN = -110, /**< Can't send after socket shutdown */ | ||
ArduinoECONNREFUSED = -111, /**< Connection refused */ | ||
ArduinoEADDRINUSE = -112, /**< Address already in use */ | ||
ArduinoECONNABORTED = -113, /**< Software caused connection abort */ | ||
ArduinoENETUNREACH = -114, /**< Network is unreachable */ | ||
ArduinoENETDOWN = -115, /**< Network is down */ | ||
ArduinoETIMEDOUT = -116, /**< Connection timed out */ | ||
ArduinoEHOSTDOWN = -117, /**< Host is down */ | ||
ArduinoEHOSTUNREACH = -118, /**< No route to host */ | ||
ArduinoEINPROGRESS = -119, /**< Operation now in progress */ | ||
ArduinoEALREADY = -120, /**< Operation already in progress */ | ||
ArduinoEDESTADDRREQ = -121, /**< Destination address required */ | ||
ArduinoEMSGSIZE = -122, /**< Message size */ | ||
ArduinoEPROTONOSUPPORT = -123, /**< Protocol not supported */ | ||
ArduinoESOCKTNOSUPPORT = -124, /**< Socket type not supported */ | ||
ArduinoEADDRNOTAVAIL = -125, /**< Can't assign requested address */ | ||
ArduinoENETRESET = -126, /**< Network dropped connection on reset */ | ||
ArduinoEISCONN = -127, /**< Socket is already connected */ | ||
ArduinoENOTCONN = -128, /**< Socket is not connected */ | ||
ArduinoETOOMANYREFS = -129, /**< Too many references: can't splice */ | ||
ArduinoENOTSUP = -134, /**< Unsupported value */ | ||
ArduinoEOVERFLOW = -139, /**< Value overflow */ | ||
ArduinoECANCELED = -140, /**< Operation canceled */ | ||
ArduinoEWOULDBLOCK = ArduinoEAGAIN, /**< Operation would block */ | ||
}; | ||
/* Error Codes: | ||
* In Arduino if a function returns 0 is considered to have failed, | ||
* while any value different from 0 is considered success. | ||
* Errors are generally represented with an int type that may vary in size depending on the platform. | ||
* For this reason in this representation error_t type is defined with an integer type with a defined size. | ||
*/ | ||
class ErrorCode { | ||
public: | ||
constexpr ErrorCode(int value): error(value != 0? ArduinoSuccess : ArduinoError) {} | ||
constexpr ErrorCode(error_t value): error(value) {} | ||
const error_t error; | ||
constexpr operator bool() const { | ||
return error == ArduinoSuccess; | ||
} | ||
}; | ||
/* ReturnValueClass is meant to represent all the cases where with a single value | ||
* we want to return an error, if the value is negative, or a meaningful result | ||
* if greater than or equal to 0. | ||
* In order to be retrocompatible with the previous definition boolean evaluation: | ||
* - It must return true, if the value is greater than or equal 0 | ||
* - It must return false, if the value is negatie | ||
* - It must be evaluable as the primitive type associated with | ||
*/ | ||
template<typename T> | ||
class ReturnValueClass { | ||
public: | ||
constexpr ReturnValueClass(T value) | ||
: value(value >= 0? value : 0), error(value < 0? (error_t)value : ArduinoSuccess) {} | ||
// it would be nice to have a default value on error to Success | ||
constexpr ReturnValueClass(T value, error_t error) | ||
: value(value), error(error) {} | ||
const T value; // TODO should we leave the const modifier? | ||
const error_t error; | ||
constexpr operator bool() const { | ||
return error == ArduinoSuccess; | ||
} | ||
constexpr operator T() const { | ||
return error == ArduinoSuccess ? value : error; | ||
} | ||
}; | ||
using ReturnValue = ReturnValueClass<int>; | ||
using ReturnLongValue = ReturnValueClass<int64_t>; | ||
} |
5 changes: 3 additions & 2 deletionsapi/HardwareCAN.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
6 changes: 3 additions & 3 deletionsapi/HardwareI2C.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletionapi/HardwareSPI.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
10 changes: 5 additions & 5 deletionsapi/HardwareSerial.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
11 changes: 6 additions & 5 deletionsapi/Stream.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
2 changes: 2 additions & 0 deletionstest/CMakeLists.txt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
6 changes: 3 additions & 3 deletionstest/include/StreamMock.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
57 changes: 57 additions & 0 deletionstest/src/ErrorCodes/test_ErrorCodes.cpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* | ||
* Copyright (c) 2020 Arduino. All rights reserved. | ||
* | ||
* SPDX-License-Identifier: LGPL-2.1-or-later | ||
*/ | ||
/************************************************************************************** | ||
* INCLUDE | ||
**************************************************************************************/ | ||
#include <catch.hpp> | ||
#include <api/ErrorCodes.h> | ||
using namespace arduino; | ||
/************************************************************************************** | ||
* TEST CODE | ||
**************************************************************************************/ | ||
TEST_CASE ("An ErrorCode can be evaluated as boolean and respect Arduino values", "[ErrorCodes-Evaluation]") { | ||
REQUIRE((bool)ErrorCode(1) == true); | ||
REQUIRE((bool)ErrorCode(0) == false); | ||
} | ||
TEST_CASE ("An error is returned with a value different from 0 and 1", "[ErrorCodes-Evaluation]") { | ||
THEN ("if the error is well defined the boolean evaluation of the error code respects Arduino standard") { | ||
arduino::error_t err = 125; | ||
ErrorCode ec(err); | ||
REQUIRE((bool)ec == false); | ||
REQUIRE(ec.error == err); | ||
} | ||
THEN ("if an int is provided the boolean evaluation of the error code respects Arduino standard and error is evaluated to ArduinoSuccess") { | ||
int err = 1; | ||
ErrorCode ec(err); | ||
REQUIRE((bool)ec == true); | ||
REQUIRE(ec.error == ArduinoSuccess); | ||
} | ||
THEN ("if an int is provided the boolean evaluation of the error code respects Arduino standard and error is evaluated to ArduinoError") { | ||
int err = 0; | ||
ErrorCode ec(err); | ||
REQUIRE((bool)ec == false); | ||
REQUIRE(ec.error == ArduinoError); | ||
} | ||
THEN ("if an int is provided the boolean evaluation of the error code respects Arduino standard and the value is not preserved") { | ||
int err = 125; | ||
ErrorCode ec(err); | ||
REQUIRE((bool)ec == false); | ||
REQUIRE(ec.error == ArduinoError); | ||
} | ||
THEN ("if an int is provided the boolean evaluation of the error code respects Arduino standard and the value is not preserved") { | ||
ErrorCode ec(ArduinoELOOP); | ||
REQUIRE((bool)ec == false); | ||
REQUIRE(ec.error == ArduinoELOOP); | ||
} | ||
} | ||
Oops, something went wrong.
Uh oh!
There was an error while loading.Please reload this page.
Oops, something went wrong.
Uh oh!
There was an error while loading.Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.