Skip to main content

Go lang: Return True specified Pct% of time

When writing test for state machines, I came across a need for a helper that would all call flow into a path some percentage% of times.

Eg:
func TestSelfDrivingCar_BasicRun(t *testing.T) {
car := NewMockCar(t)
car.Start()
if (/* 50% probability that this will happen */) {
car.SimulateLidarFailure()
} else if /* 25% probability that this will happen */ {
car.SimulateVisionFailure()
} else {
/* 25% probability that this will happen*/
car.SimulateGearBoxFailure()
}
car.VerifySafeTrajectory()
}

You can write a small Go helper like this:
package testutils

import (
"math/rand"
"time"
)

// Odds returns True to pct% number of Check() calls
type Odds interface {
Check() bool
}

// odds returns `true` pct% of times
type odds struct {
randgen *rand.Rand
pct int
}

// NewOdds returns a odds instance with the given percent vaule
func NewOdds(pct int) Odds {
src := rand.NewSource(time.Now().UnixNano())
return &odds{
randgen: rand.New(src),
pct: pct,
}
}

// Check returns True to pct% of Check() calls
func (o *odds) Check() bool {
return o.randgen.Intn(100) < o.pct
}

Usage:
func TestSelfDrivingCar_BasicRun(t *testing.T) {
odds50pct, odds25pct := NewOdds(50), NewOdds(25)
car := NewMockCar(t)
car.Start()
if odds50pct.Check() {
car.SimulateLidarFailure()
} else if odds25pct.Check() {
car.SimulateVisionFailure()
} else {
/* 25% probability that this will happen*/
car.SimulateGearBoxFailure()
}
car.VerifySafeTrajectory()
}

ps: No, I don't work on self-driving cars - this is just a code sample :)

Comments

Popular posts from this blog

GraphQL

GraphQL



What is GraphQL

It is a specification laid out by Facebook which proposed an alternative way to query and modify data. Think of it is an as a complimentary of REST/RPC.

Now head here and read the original graphQL documentation. It will take 2-3 hours tops but is a worthy read. This will help you build some impressions on it and help contrast against mine below:


Why use GraphQL

Core advantage

Instead of defining custom backend rpc/rest endpoints for every data-shape, graphql allows you to build a more general endpoint which give frontend/mobile engineers freedom and query and play with the data. It might be less efficient, add a bit more complexity (need for things like data-loader), harder to standardize and control client-contracts for. What it looses in complexity and control, it gains in flexibility and freedom - provided your data model is worth of a graphql-ish query How to tell if my data-model graphql-ish?Are there complex relationships between your models? Is there a need …

About me

Hi,

I'm currently working as a software developer in the logistics industry in San Francisco. 
My aim is to impact billions of people's live for the better and make the world a better place.

Cheers,
Vignesh



Backend - Tech refresher 2019

Hello there

As a software engineer, it is important to keep updating your skillsets by learning the latest programming-elements (includes paradigms, patterns, languages, tools and frameworks). This becomes a bit easy if you already working on the cutting edge of something. Even then, it is possible to go too deep and loose breadth.

I've taken upon myself to do a tech refresher every year. The intent is to read, experiment and understand these elements by spending anywhere between 4 days to 4 weeks. The ultimate goal is: "do I know most that I need to know to build a planet-scale backend tech-stack ground up"

I'll write up my learnings in posts to help myself (and maybe others) refer it.

Here is the initial list I'm thinking about:


RedisMySQL, GraphQLAurora, Mesos, KubernetesCadence, SWSCassandra, MangoDB, NoSQL, MySQL, Spanner, S<, DynDBELKFlink, Storm, Samza, SparkHadoop HDFS, Yarn, MapReduceHive, HBaseKafka, ZookeeperNW: http, Tcp, thrift, grpc, yarpc, Terraform,…