GETTING SOFTWARE RIGHT WITH PROPERTIES, GETTING SOFTWARE RIGHT WITH - - PowerPoint PPT Presentation

getting software right with properties getting software
SMART_READER_LITE
LIVE PREVIEW

GETTING SOFTWARE RIGHT WITH PROPERTIES, GETTING SOFTWARE RIGHT WITH - - PowerPoint PPT Presentation

GETTING SOFTWARE RIGHT WITH PROPERTIES, GETTING SOFTWARE RIGHT WITH PROPERTIES, GENERATED TESTS, AND PROOFS GENERATED TESTS, AND PROOFS Evolve your hack into robust software Michael Sperber Active Group GmbH @sperbsen / 1 . 1 BERLIN,


slide-1
SLIDE 1

/

GETTING SOFTWARE RIGHT WITH PROPERTIES, GETTING SOFTWARE RIGHT WITH PROPERTIES, GENERATED TESTS, AND PROOFS GENERATED TESTS, AND PROOFS

Evolve your hack into robust software Michael Sperber Active Group GmbH @sperbsen

1 . 1

slide-2
SLIDE 2

/

BERLIN, FEBRUARY 28 BERLIN, FEBRUARY 28

https://bobkonf.de/

2 . 1

slide-3
SLIDE 3

/

INTRODUCTORY TALK! INTRODUCTORY TALK!

3 . 1

slide-4
SLIDE 4

/

ANIMALS ON THE TEXAS HIGHWAY ANIMALS ON THE TEXAS HIGHWAY

data Liveness = Dead | Alive Weight : Type Weight = Int data Animal : Type where Dillo : Liveness -> Weight -> Animal Parrot : String -> Weight -> Animal a1 : Animal a1 = Dillo Alive 10 a2 : Animal a2 = Dillo Dead 12 a3 : Animal a3 = Parrot "The treasure is on treasure island!" 3 runOverAnimal : Animal -> Animal runOverAnimal (Dillo liveness weight) = Dillo Dead weight runOverAnimal (Parrot sentence weight) = Parrot "" weight

4 . 1

slide-5
SLIDE 5

/

DOMAIN MODELS GROW DOMAIN MODELS GROW

5 . 1

slide-6
SLIDE 6

/

DOMAIN MODELS GROW DOMAIN MODELS GROW

6 . 1

slide-7
SLIDE 7

/

WHAT'S THIS? WHAT'S THIS?

(a + b) + c = a + (b + c)

7 . 1

slide-8
SLIDE 8

/

NUMBERS AND ADDITION NUMBERS AND ADDITION

∀a, b, c ∈ N : (a + b) + c = a + (b + c)

8 . 1

slide-9
SLIDE 9

/

LISTS AND CONCATENATION LISTS AND CONCATENATION

∀a, b, c ∈ List el : a ++ (b ++ c) = (a ++ b) ++ c

9 . 1

slide-10
SLIDE 10

/

IMAGES IMAGES

(source: ) Brent Yorgey

10 . 1

slide-11
SLIDE 11

/

IMAGES IMAGES

data Image = ...

11 . 1

slide-12
SLIDE 12

/

STAR STAR

star : Int -> Mode -> Color -> Image goldStar : Image goldStar = star 200 Solid Gold

12 . 1

slide-13
SLIDE 13

/

POLYGON POLYGON

polygon : Int -> Int -> Mode -> Color -> Image pentagon : Image pentagon = polygon 180 5 Outline Red

13 . 1

slide-14
SLIDE 14

/

BESIDE BESIDE

beside : Image -> Image -> Image beside goldStar pentagon

14 . 1

slide-15
SLIDE 15

/

ABOVE ABOVE

above : Image -> Image -> Image above goldStar pentagon

15 . 1

slide-16
SLIDE 16

/

COMBINATION COMBINATION

above (beside goldStar pentagon) (beside pentagon goldStar)

16 . 1

slide-17
SLIDE 17

/

OVERLAY OVERLAY

  • verlay : Image -> Image -> Image
  • verlay goldStar pentagon

17 . 1

slide-18
SLIDE 18

/

ASSOCIATIVITY FOR IMAGES ASSOCIATIVITY FOR IMAGES

∀a, b, c ∈ Image :

  • verlay (overlay a b) c) = overlay a (overlay b c)

18 . 1

slide-19
SLIDE 19

/

SEMIGROUP SEMIGROUP

set S

∘ : S → S → S ∀a, b, c ∈ S : (a ∘ b) ∘ c = a ∘ (b ∘ c)

19 . 1

slide-20
SLIDE 20

/

PARENTHESES DON'T MATTER PARENTHESES DON'T MATTER

(a ∘ (b ∘ (c ∘ d))) ∘ (e ∘ f) = a ∘ b ∘ c ∘ d ∘ e ∘ f

20 . 1

slide-21
SLIDE 21

/

DISTRIBUTED COMPUTATION DISTRIBUTED COMPUTATION

21 . 1

slide-22
SLIDE 22

/

DESIGN DESIGN

  • B. Yorgey: Monoids: Theme and Variations

22 . 1

slide-23
SLIDE 23

/

MONOID MONOID

Semigroup and …

n ∈ S ∀a ∈ S : a ∘ n = n ∘ a = a

23 . 1

slide-24
SLIDE 24

/

MONOIDS IN THE WILD MONOIDS IN THE WILD

numbers lists images music animations nancial contracts semiconductor-fabrication routes properties pretty printers …

24 . 1

slide-25
SLIDE 25

/

BOUNDING BOX PROBLEM BOUNDING BOX PROBLEM

25 . 1

slide-26
SLIDE 26

/

ENVELOPES ENVELOPES

26 . 1

slide-27
SLIDE 27

/

COMPOSING WITH ENVELOPES COMPOSING WITH ENVELOPES

27 . 1

slide-28
SLIDE 28

/

COMPOSING ENVELOPES COMPOSING ENVELOPES

28 . 1

slide-29
SLIDE 29

/

ASSOCIATIVITY ASSOCIATIVITY

∀image1, image2, image3 ∈ Image.

  • verlay (overlay image1 image2) image3 == overlay image1 (overlay image2 image3)

29 . 1

slide-30
SLIDE 30

/

ASSOCIATIVITY ASSOCIATIVITY

prop_overlayAssociative = forAll (arbTriple arbImage arbImage arbImage) (\ image1 image2 image3 =>

  • verlay (overlay image1 image2) image3 == overlay image1 (overlay image2 image3))

30 . 1

slide-31
SLIDE 31

/

QUICKCHECK QUICKCHECK

John Hughes https://www.chalmers.se/

31 . 1

slide-32
SLIDE 32

/

INTERVAL SETS INTERVAL SETS

ISet : Type ISet = List (Nat, Nat) iToList : ISet -> List Nat λΠ> iToList [(0, 3), (5, 7), (9, 10)] [0, 1, 2, 3, 5, 6, 7, 9, 10] : List Nat

32 . 1

slide-33
SLIDE 33

/

VALIDITY VALIDITY

isValid : ISet -> Bool isValid [] = True isValid [(lo, hi)] = lo <= hi isValid ((lo1, hi1) :: (lo2, hi2) :: rest) = (lo1 <= hi1) && (hi1+1 < lo2) && isValid ((lo2, hi2)::rest)

33 . 1

slide-34
SLIDE 34

/

UNION UNION

iUnion : ISet -> ISet -> ISet

34 . 1

slide-35
SLIDE 35

/

SIMPLE CRITERION SIMPLE CRITERION

prop_unionValid = forAll (arbPair arbISet arbISet) (\ (iset1, iset2) => isValid (iUnion iset1 iset2))

35 . 1

slide-36
SLIDE 36

/

TEST TEST

prop_unionCorrect = forAll (arbPair arbISet arbISet) (\ (iset1, iset2) => iToList (iUnion iset1 iset2) == merge2 (iToList iset1) (iToList iset2))

36 . 1

slide-37
SLIDE 37

/

XMONAD XMONAD

37 . 1

slide-38
SLIDE 38

/

XMONAD XMONAD

(source: Don Stewart)

record StackSet (window : Type) constructor StackSet current : Int stacks : Map Int (List window)

38 . 1

slide-39
SLIDE 39

/

OPERATIONS OPERATIONS

empty : Nat -> StackSet window view : Nat -> StackSet window -> StackSet window peek : StackSet window -> Maybe window rotate : Ordering -> StackSet window -> StackSet window push : window -> StackSet window -> StackSet window insert : window -> Nat -> StackSet window -> StackSet window delete : window -> StackSet window -> StackSet window shift : Nat -> StackSet window -> StackSet window

39 . 1

slide-40
SLIDE 40

/

INVARIANT INVARIANT

invariant : StackSet window -> Bool invariant stackSet = let windows = windowList stackSet in (current stackSet < Map.size (stacks stackSet)) && (removeDuplicates windows == windows)

40 . 1

slide-41
SLIDE 41

/

INVARIANT INVARIANT

prop_empty_I = forAll (arbPair arbNat) (\ stackIndex => invariant (empty stackIndex)) prop_view_I = forAll (arbPair arbNat arbStackSet) (\ (stackIndex, stackSet) => invariant (view stackIndex stackSet)) prop_rotate_I = forAll (arbPair arbNat arbStackSet) (\ (stackIndex, stackSet) => invariant (rotate stackIndex stackSet)) prop_push_I = forAll (arbPair arbNat arbStackSet) (\ (stackIndex, stackSet) => invariant (push stackIndex stackSet) prop_delete_I = forAll (arbPair arbNat arbStackSet) (\ (stackIndex, stackSet) => invariant (delete stackIndex stackSet) prop_shift_I = forAll (arbPair arbNat arbStackSet) (\ (stackIndex, stackSet) => stackIndex < size stackSet ==> invariant (shift stackIndex stackSet) prop_insert_I = forAll (arbPair arbNat arbStackSet) (\ (stackIndex, stackSet) => window < size stackSet ==> invariant (insert stackIndex window stackSet)

41 . 1

slide-42
SLIDE 42

/

MIGRATING FROM VISUAL BASIC MIGRATING FROM VISUAL BASIC

Public Shared Function CheckHash(Password As String, Hash As String) As Boolean Public Shared Function HashPassword(Password As String) As String

42 . 1

slide-43
SLIDE 43

/

PROPERTY PROPERTY

prop_passwordCorrect = forAll arbString (\ password => compareWithHash password (createUnsaltedPseudoHash password))

43 . 1

slide-44
SLIDE 44

/

SURPRISE SURPRISE

prop_passwordCorrectReally = forAll arbString (\ password => compareWithHash password (restrictTo11Chars (createUnsaltedPseudoHash password)))

44 . 1

slide-45
SLIDE 45

/

SYNCHRONIZATION SYNCHRONIZATION

45 . 1

slide-46
SLIDE 46

/

SYNCHRONIZATION PROPERTY SYNCHRONIZATION PROPERTY

forAll (arbPair (arbSet arbBlock) (arbSet arbBlock)) (\ (bs1, bs2) => let all = Set.union bs1 bs2 (bs1', bs2') = synchronize (Set.toList bs1) (Set.toList bs2) in (Set.union bs1 bs1' == all) && (Set.union bs2 bs2' == all) && (Set.isEmpty (Set.intersect bs1 bs1')) && (Set.isEmpty (Set.intersect bs2 bs2'))

46 . 1

slide-47
SLIDE 47

/

MNESIA MNESIA

Prefix:

  • pen_file(dets_table ,[{type,bag}]) --> dets_table

close(dets_table) --> ok

  • pen_file(dets_table ,[{type,bag}]) --> dets_table

Parallel:

  • 1. lookup(dets_table ,0) --> []
  • 2. insert(dets_table ,{0,0})
  • 3. insert(dets_table ,{0,0})

Result: ok

  • J. Hughes: Experiences with QuickCheck: Testing the Hard Stuff and

Staying Sane

47 . 1

slide-48
SLIDE 48

/

DROPBOX DROPBOX

  • J. Hughes et al.: Mysteries of Dropbox

48 . 1

slide-49
SLIDE 49

/

SCREENCAST EDITOR SCREENCAST EDITOR

  • 1. Timeline attening
  • 2. Video scene classication
  • 3. Focus and timeline consistency
  • 4. Symmetry of undo/redo
  • O. Wikstrom: Property-Based Testing in a Screencast Editor

49 . 1

slide-50
SLIDE 50

/

PROOFS PROOFS

(++) : List a -> List a -> List a (++) [] right = right (++) (x::xs) right = x :: (xs ++ right) appendAssoc : (a : List el) -> (b : List el) -> (c : List el) -> a ++ (b ++ c) = (a ++ b) ++ c

50 . 1

slide-51
SLIDE 51

/

SEL4 SEL4

microkernel security enclave on iOS, among others no buffer overows no null-pointer exceptions no use-after-free integrity condentiality written in C veried with Haskell, Isabelle/HOL

51 . 1

slide-52
SLIDE 52

/

COMPCERT COMPCERT

C compiler veried with Coq

  • utput of register allocator checked by veried code

52 . 1

slide-53
SLIDE 53

/

TOOLS TOOLS

Isabelle/HOL Coq Agda Idris ATS ACL2

53 . 1

slide-54
SLIDE 54

/

USEFUL PROPERTIES USEFUL PROPERTIES

commutativity a ∘ b = b ∘ a reexivity a ∷ a symmetry a ∷ b ⇒ b ∷ a antisymmetry a ∷ b, b ∷ a ⇒ a = b transitivity a ∷ b, b ∷ c ⇒ a ∷ c

54 . 1

slide-55
SLIDE 55

/

FANCY PROPERTIES FANCY PROPERTIES

interface Functor (f : Type -> Type) where map : (func : a -> b) -> f a -> f b

55 . 1

slide-56
SLIDE 56

/

FUNCTOR LAWS FUNCTOR LAWS

interface Functor f => VerifiedFunctor (f : Type -> Type) where functorIdentity : {a : Type} -> (g : a -> a) -> ((v : a) -> g v = v) -> (x : f a) -> map g x = x functorComposition : {a : Type} -> {b : Type} -> (x : f a) -> (g1 : a -> b) -> (g2 : b -> c) -> map (g2 . g1) x = (map g2 . map g1) x

56 . 1

slide-57
SLIDE 57

/

ANIMALS ANIMALS

data Animal : Type where Dillo : Liveness -> Weight -> Animal Parrot : String -> Weight -> Animal runOverAnimal : Animal -> Animal runOverAnimal (Dillo liveness weight) = Dillo Dead weight runOverAnimal (Parrot sentence weight) = Parrot "" weight

57 . 1

slide-58
SLIDE 58

/

ANIMAL FUNCTOR ANIMAL FUNCTOR

data Animal : Type -> Type where Dillo : Liveness -> weight -> Animal weight Parrot : String -> weight -> Animal weight runOverAnimal : Animal weight -> Animal weight runOverAnimal (Dillo liveness weight) = Dillo Dead weight runOverAnimal (Parrot sentence weight) = Parrot "" weight implementation Functor Animal where map f (Dillo liveness weight) = Dillo liveness (f weight) map f (Parrot sentence weight) = Parrot sentence (f weight)

58 . 1

slide-59
SLIDE 59

/

CONCLUSION CONCLUSION

nd the combinator make it a monoid write properties test properties prove properties nd the functor watch your brain grow sleep soundly

59 . 1